CC2541蓝牙学习——定时器1正计数/倒计数模式
学习目标:掌握定时器1正计数/倒计数模式,两种实现方式:查询和中断
【正计数/倒计数模式】:
在正计数/倒计数模式,计数器反复从0x0000开始,正计数直达到T1CC0H:T1CC0L保存值。然后计数器将倒计数直到0x0000,如下图所示。这个定时器用于周期必须是对称输出脉冲而不是0xFFF的应用程序,因此允许中心对齐的PWM输出应用的实现。在正计数/倒计数模式,当达到最终计数值时(0x0000),设置标志IRCON.T1IF和T1STAT.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 }