CC2530用定时器3完成对LED1周期为2s控制
首先大家需要了解的是CC2530有4个定时器,分别是,定时器1~4和睡眠定时器,我们常用的是定定时器1,可是今天看到课后的习题需要用定时器3,来完成LED1的亮灭周期为2s。
前言
如果我们需要利用定时器3,那无非就是配置定时器3的寄存器,完成对中断函数的操作。相对于定时器1,定时器3有哪些不同?
一、定时器3和定时器1哪些不同?
定时器1是一个 “16位 ”的定时器,具有5个独立的捕获/比较通道。而,定时器3是一个 “8位” 的定时器,它只有2个独立的捕获/比较通道。位数不同,意味着最大值不同,16位的最大值是0xFFFF即65535。而8位的最大值是0xFF即255。二、使用步骤
1.配置LED1
代码如下(示例):
void LED_Init(void){
P0SEL &=~0x03; //普通IO
P1DIR|=0x03; //输出
LED0=0;//熄灭LED0
LED1=0;//熄灭LED1
}
2.配置定时器3
代码如下(示例):
void Timer1_Init(void){
EA = 1; //总使能
IEN1 |= 0x08; //定时器3中断使能
T3CTL |= 0x08; //使能中断溢出
T3CTL |= 0xE0; //128分频
T3CTL &= ~0x03; //自由运行模式
T3CTL |= 0x10; //启动定时器
}
3.完成中断函数
代码如下(示例):
#pragma vector = T3_VECTOR
__interrupt void T3_INT(void){
if(count++>245)//0.5
{
flag++;
count=0;
}
}
三、完整代码
#include "ioCC2530.h"
#define LED0 (P1_0)
#define LED1 (P1_1)
int count=0;
int flag=0;
/**************延时函数*********/
void delay(unsigned int time)
{
unsigned int i;
unsigned char j;
for(i=0;i<time ;i++)
for(j=0;j<240;j++){
asm("NOP");
asm("NOP");
asm( "NOP" );
}
}
/**********初始化LED************/
void LED_Init(void){
P0SEL &=~0x03; //普通IO
P1DIR|=0x03; //输出
LED0=0;//熄灭LED
LED1=0;
}
/*********初始化Timer3*********/
void Timer3_Init(void){
EA = 1; //总使能
IEN1 |= 0x08; //或T3IE = 1;
T3CTL |= 0x08; //使能中断溢出
T3CTL |= 0xE0; //128分频
T3CTL &= ~0x03; //自由运行模式
T3CTL |= 0x10; //启动定时器
}
void main(void)
{
LED_Init();
Timer3_Init();
while(1){
if(flag==2){
//flag=2,说明已经熄灭了1s,这时LED1亮
LED1=1;
}else if(flag==4){
//flag=4,说明已经点亮1s,这时熄灭
LED1=0;
flag=0; //flag清零
}
}
}
/******中断函数*****/
#pragma vector = T3_VECTOR
__interrupt void T3_INT(void){
if(count++>245) //当count大于245,意味着0.5s过去了
{
flag++;
count=0;
}
}
总结
第一,对于定时器3的配置,数据手册里有详细的寄存器说明。第二中断函数中,245是通过这样演变而来的- 0.5s/(1/16M)*128=62500
- 62500/255约=245
因为8位的最大值是255,所以除以62500需要245,也就是count大于245时,相当于完成了0.5s的计时
一共就分为3步:
- 配置LED
- 配置定时器3
- 中断函数
多思考,多练习,总会明白的。