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;//定时器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_1unsigned int TimeFlag = 0;void PortInit()
{
P1SEL &= ~0x07;P1DIR |= 0x03;P1DIR &= ~0x04;
}void Timer1Init()
{
T1CC0L = 0xd4;//最大计数值的低8位T1CC0H = 0x30;//最大计数值的高8位//系统频率是16MHz,下面T1CTL = 0x0e定义了分频系数是128,可以根据计算公式算出来//0.1s的值是0x30d4T1CCTL0 |= 0x04;//开启输出0的通道比较模式T1IE = 1;//定时器1中断使能EA = 1;//开启总中断T1CTL = 0x0e;//模模式,128分频
}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;//最大计数值的低8位T1CC0H = 0x30;//最大计数值的高8位//系统频率是16MHz,下面T1CTL = 0x0e定义了分频系数是128,可以根据计算公式算出来//0.1s的值是0x30d4T1CCTL0 |= 0x04;//开启输出0的通道比较模式T1IE = 1;//定时器1中断使能EA = 1;//开启总中断T1CTL = 0x0e;//模模式,128分频
}
中断回调函数
#pragma vector = T1_VECTOR
__interrupt void T1_vector()
{
T1STAT &= ~0x20;TimeFlag++;if(TimeFlag == 10){
LED1 = ~LED1;}}
其中 T1STAT &= ~0x20; 作用置1定时器1数据溢出标志位