CC2530定时器
CC2530定时器
定时器介绍
什么是定时器?
定时器是一种能够对输入时钟(或脉冲)进行计数,在达到计数值时可以触发中断的外设。
定时器有哪些作用?
- 定时器功能: 对输入的时钟进行计数,达到计数值可以触发中断。
- 输入计数器功能: 对外部的脉冲个数输入进行计数。
- PWM输入捕获功能: 可以获取输入的PWM的频率和脉宽信息。
- PWM输出功能: 按一定频率和脉宽输出PWM信号。
PWM = Pulse width modulation,是一种脉宽调制技术,可以利用脉冲的宽度控制LED的亮度、电机的转速等。
寄存器分析
功能图
寄存器
自由运行模式
取模模式
向上向下计数模式
定时器1分析
定时器1是一个16位的定时器,主要有以下几个功能:
- 5个通道,每隔通道可以单独设置计数值。
- 可以设置输入捕获的边沿(上升沿、下降沿、双边沿)
- 自由运行模式、取模模式、向上/向下计数模式
- 时钟分频可以设置为1、8、32、128
- 每隔通道都可以触发中断
- 可以触发DMA请求
工作模式介绍
- 自由运行模式: 计数值自增达到0xFFFF之后归零,重新开始计数。
- 取模模式: 计数值自增到
T1CC0
配置的数字后归零,重新开始计数。 - 向上/向下计数模式: 计数值先自增到
T1CC0
,然后开始自减到0,然后再次开始自增(这个就是呼吸灯的工作方式,不知道还有什么作用)。
由于每一种模式下的配置不同,这里使用定时器来实现控制LED以1Hz的频率闪烁,也就是亮0.5S,然后灭0.5秒。那么需要配置为取模模式比较方便,到达设定值后自动归零,重新开始计数。相关的寄存器有:
T1CC0H:T1CC0L
计数值的高8位和低8位。
T1STAT.CH0IF
定时器1的通道1中断标志,写入0清除标志。
T1STAT.OVFIF
定时器1的计数溢出中断标志,写入0清除标志。
IEN1.T1EN
定时器1的中断开关。
TIMIF.OVFIM
定时器1的中断溢出使能位。
具体实现
定时器1的通道0的初始化
//16MHz RC是默认的时钟源,没有校准的时候误差是正负18%
//定时器的工作频率 16MHz / 128 = 125000Hz
//定时500ms,也就是计数62500
//周期应该是1秒,实测940毫秒,RC的误差,切换到外部晶振应该会准确一些的。
T1CTL |= 0x0c; //128分频,取模模式
T1CC0L = (62500 & 0xff); //配置通道0的低8位
T1CC0H = 62500 >> 8; //配置通道0的高8位
TIMIF |= 0x20; //打开定时器的中断溢出标志
T1IE = 1; //打开定时器1的中断
EA = 1; //打开总中断
T1CCTL0 |= 0x46;//打开通道0的中断,设置为比较器模式,下降沿计数。
T1CTL |= 0x02; //设置为取模模式,定时器开始工作
定时器1的中断服务程序
//定时器1的中断服务函数
#pragma vector = T1_VECTOR
__interrupt void Timer1_Interrupt(void)
{
if ((T1STAT & 0x01) == 0x01) { //通道1中断标志
LED1 = !LED1;
T1STAT &= ~0x01;//清除通道1的中断标志
}
T1STAT &= ~0x20; //清除定时器1的中断标志
}
注意事项
定时器3和定时器4是8位的定时器。这里只使用了定时器1的通道0来实现LED的状态的切换。