CC2530 定时器应用
任务分析知识储备相关寄存器知识T1CTL-定时器1的控制和状态T1CCTL0-定时器1通道0捕获/比较控制T1CC0H和T1CC0L-定时器1通道0捕获/比较值的高低位相关寄存器总结
代码部分代码分析定时器初始化函数中断回调函数
任务分析
定时器控制流水灯
知识储备
相关寄存器知识
由于我手上的开发板LED1,LED2,KEY1对应的引脚分别是P1_0,P1_1,P1_2。所以我下面主要介绍和P1相关的寄存器。其他端口类似。
T1CTL-定时器1的控制和状态
令T1CTL = 0x0e即可使定时器1处于模模式,128分频
T1CCTL0-定时器1通道0捕获/比较控制
即令T1CCTL0 |= 0x04;即可开启定时器1通道0的比较模式
T1CC0H和T1CC0L-定时器1通道0捕获/比较值的高低位
即令T1CC0L = 0xd4;,T1CC0H=0x30;就可以使定时器每过0.1s触发一次中断 根据公式 (CC2530晶振频率为16MHz。上面我们定义了128分频,所以定时器计数周期如上.)
最后再加上下面两行代码即可
T1IE
= 1;
EA
= 1;
相关寄存器总结
1.开启总中断EA = 1; 2.开启定时器中断T1IE = 1; 3.设定定时器1为模模式,128分频T1CTL = 0x0e; 4.开启定时器1通道0的比较模式T1CCTL0 |= 0x04; 5.设定定时器1通道0捕获/比较值的高低位T1CC0L = 0xd4;T1CC0H = 0x30;
代码
#include <ioCC2530.h>
#define KEY1 P1_2
#define LED1 P1_0
#define LED2 P1_1
unsigned int TimeFlag
= 0;
void PortInit()
{
P1SEL
&= ~0x07;
P1DIR
|= 0x03;
P1DIR
&= ~0x04;
}
void Timer1Init()
{
T1CC0L
= 0xd4;
T1CC0H
= 0x30;
T1CCTL0
|= 0x04;
T1IE
= 1;
EA
= 1;
T1CTL
= 0x0e;
}
void delay(unsigned int i
)
{
while(i
--);
}
#pragma vector = T1_VECTOR
__interrupt
void T1_vector()
{
T1STAT
&= ~0x20;
TimeFlag
++;
if(TimeFlag
== 10)
{
LED1
= ~LED1
;
}
}
void main()
{
PortInit();
Timer1Init();
LED1
= 1;
LED2
= 1;
while(1)
{
}
}
部分代码分析
定时器初始化函数
void Timer1Init()
{
T1CC0L
= 0xd4;
T1CC0H
= 0x30;
T1CCTL0
|= 0x04;
T1IE
= 1;
EA
= 1;
T1CTL
= 0x0e;
}
中断回调函数
#pragma vector = T1_VECTOR
__interrupt
void T1_vector()
{
T1STAT
&= ~0x20;
TimeFlag
++;
if(TimeFlag
== 10)
{
LED1
= ~LED1
;
}
}
其中 T1STAT &= ~0x20; 作用置1定时器1数据溢出标志位