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的状态的切换。

猜你喜欢

转载自www.cnblogs.com/iotplus/p/12715512.html