CC2541蓝牙学习——定时器1正计数/倒计数模式

学习目标:掌握定时器1正计数/倒计数模式,两种实现方式:查询和中断
 

正计数/倒计数模式】:

在正计数/倒计数模式,计数器反复从0x0000开始,正计数直达到T1CC0H:T1CC0L保存值。然后计数器将倒计数直到0x0000,如下图所示。这个定时器用于周期必须是对称输出脉冲而不是0xFFF的应用程序,因此允许中心对齐的PWM输出应用的实现。在正计数/倒计数模式,当达到最终计数值时0x0000设置标志IRCON.T1IFT1STAT.OVFIF。如果设置了相应的中断屏蔽位TIMIF.OVFIM以及IEN1.T1EN和总中断IEN0.EA,计数器溢出将产生一个中断请求。注意:在正计数达到最大值又倒计数回到0x0000时产生中断。

查询方式

 1 /******************************************************************************
 2 *函 数 名:InitT1
 3 *功    能:定时器1初始化,系统不配置时钟默认2分频,即16M
 4 *入口参数:无
 5 *出口参数:无
 6 ******************************************************************************/
 7 void InitT1(void)
 8 {
 9   T1CTL  = 0x0f;     //定时器1设置为128分频,正计数/倒计数模式
10   T1CC0L = 0xff;     //模值1024,定时器1通道0捕获/比较值低位
11   T1CC0H = 0x9f;     //定时器1通道0捕获/比较值高位
12   T1STAT = 0X21;     //通道0,中断有效。这一句在裸机程序中可有可无
13 }

主程序

 1 /******************************************************************************
 2 *程序入口函数
 3 ******************************************************************************/
 4 int main(void)
 5 {
 6   InitClock();
 7   InitLED(1);                //LED初始化,熄灭LED1
 8   InitT1();                  //定时器1初始化
 9    
10   while(1)
11   {
12     if(T1STAT & (1<<5))       //检测定时器1是否溢出
13     {
14       T1STAT &= ~(1<<5);      //清溢出标志
15       LED1 = !LED1;          //LED闪烁
16     }
17   }
18 }

 也可以通过判断定时器1中断标志(IRCON.T1IF)来作为检测是否溢出的依据。

中断实现方式,定时器1正计数/倒计数模式初始化程序:

 1 /******************************************************************************
 2 *函 数 名:InitT1
 3 *功    能:定时器1初始化,系统不配置时钟默认2分频,即16M
 4 *入口参数:无
 5 *出口参数:无
 6 ******************************************************************************/
 7 void InitT1(void)
 8 {
 9   T1CTL  = 0x0f;     //定时器1设置为128分频,正计数/倒计数模式
10   T1CC0L = 0xff;     //模值1024,定时器1通道0捕获/比较值低位
11   T1CC0H = 0x9f;     //定时器1通道0捕获/比较值高位
12   T1STAT = 0X21;     //通道0,中断有效。这一句在裸机程序中可有可无
13   TIMIF |= (1<<6);   //定时器1溢出中断使能
14   IEN1  |= (1<<1);   //定时器1中断使能
15   EA = 1;            //开总中断
16 }

中断服务程序

 1 /******************************************************************************
 2 *函 数 名:Timer1_ISR
 3 *功    能:定时器1中断服务程序
 4 *入口参数:无
 5 *出口参数:无
 6 ******************************************************************************/
 7 #pragma vector = T1_VECTOR 
 8 __interrupt void Timer1_ISR(void) 
 9 { 
10   LED1 = !LED1;
11   IRCON &= ~0x02;
12   T1STAT &= ~0x20; 
13 }
原文地址:https://www.cnblogs.com/chenzhao207/p/4497700.html