定时器控制LED闪烁
定时计数器的概念
定时计数器是一种能够对时钟信号或外部输入信号进行计数的装置
当计数值设定要求时便向CPU提出处理请求,从而实现定时或记住功能的外设
定时计数器的作用
实现定时和计数,且在工作过程中不需要CPU的过多参与,解放CPU,提高使用效率
与延时的比较
延时函数不断占用CPU执行空循环,降低了工作效率
使用定时计数器来延时,CPU可以同时执行其他任务
工作原理
最基本的工作原理是进行计数
定时计数器的而核心是一个计数器,可以进行加减1的计数
最大值变成0或者从0到最大值被称作溢出
任务要求
采用定时器1控制LED1,使之每5s闪烁一次。
CC2530定时计数器
CC2530共有四个定时计数器:
初始化定时器
使能系统总中断
IEN0寄存器的EA(第7)位
EA=1
使能定时器1中断
IEN1寄存器的TEIE(第1)位
TEIE = 1
设定计时器1的标记频率
T1CTL = 0x05
启动定时器1,设置八分频,自由运行模式
使能定时器1溢出中断(可省略)
代码
#include "ioCC2530.h"
#define D3 P1_0
unsigned int count; // 中断次数变量
// 初始化LED
void initLed(){
// 方向选择
P1DIR |= 0x01; // 设置P1_0
D3 = 0;
}
// 中断初始化
void _interrupt(){
EA = 1; // 开总中断
T1IE = 1; // 使能定时器1中断
// 设定标记频率
T1CTL = 0x05; // 启动定时器1,设置8分频,自由运行模式
}
// 中断服务程序
#pragma vector = T1_VECTOR
__interrupt void T1_ISR(void){
IRCON = 0x00; // 清空中断标志位
if(count > 300){
count = 0x00;
D3 = !D3;
}
else{
count ++;
}
}
void main() {
CLKCONCMD &=~0x7f; // 设置晶振为32mhz速度
while(CLKCONSTA & 0x40);//等待晶振稳定
initLed(); // 初始化LED
_interrupt(); // 初始化中断
while(1){
}
}
$$
\text{溢出时间} = \frac{1}{\frac{\text{标记频率}}{\text{分频系数}}} \times 2^{\text{定时器位数}}
$$