CC2530 定时器应用

it2023-02-09  59

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_1 unsigned 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的值是0x30d4 T1CCTL0 |= 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的值是0x30d4 T1CCTL0 |= 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数据溢出标志位

最新回复(0)