本实验实现通过CC2530的定时器1(16位)查询方式控制LED1以1S的周期性闪烁,此实验使用的三个寄存器T1CTL(定时器1控制寄存器),T1STAT(定时器1状态寄存器),IRCON。
有关CC2530的GPIO基本知识、普通GPIO操作有关寄存器的介绍、IAR Embedded Workbench IDE软件使用:TI CC2530基础实验(普通GPIO操作——点亮led灯)
电路原理图:
当定时器运行在模模式,16位计数器从0x0000开始,每个活动时钟边沿增加1。当计数器达到T1CC0(溢出),寄存器T1CC0H:T1CC0L保存的最终计数值,计数器将复位到0x0000,并继续递增。如果定时器开始于T1CC0以上的一个值,当达到最终计数值(0xFFFF)时,设置标志IRCON.T1IF和T1CTL.OVFIF。如果设置了相应的中断屏蔽位TIMIF.OVFIM以及IEN1.T1EN,将产生一个中断请求。模模式可以用于周期不是0xFFFF的应用程序。计数器的操作展示如下图:
【正计数/倒计数模式】:
在正计数/倒计数模式,计数器反复从0x0000开始,正计数直达到T1CC0H:T1CC0L保存值。然后计数器将倒计数指导0x0000,如下图所示。这个定时器用于周期必须是对称输出脉冲而不是0xFFF的应用程序,因此允许中心对齐的PWM输出应用的实现。在正计数/倒计数模式,当达到最终计数值时,设置标志IRCON.T1IF和T1CTL.OVFIF。如果设置了相应的中断屏蔽位TIMIF.OVFIM以及IEN1.T1EN,将产生一个中断请求。
2、定时器1状态寄存器
3、中断标志4寄存器
程序——定时器1采用自由运行模式:
#include <ioCC2530.h> /************************************ * 程序说明:LED1以1S的周期性闪烁 ***********************************/ #define LED1 P1_0 /********************************************************* * 函数描述:初始化LED1 * 备注:系统不配置工作时钟时使用内部 RC 振荡器,即16MHz *********************************************************/ void LED1Init(void) { P1SEL &= ~0x01; //功能:普通I/O P1DIR |= 0x01; //方向:输出 LED1 = 1; //使其属于灭状态 } /*********************************** * 函数描述:定时器1初始化 * 设置:分频、运行模式 **********************************/ void T1Init(void) { T1CTL |= 0x0c; //设置为128分频 T1CTL |= 0x01; //设置为自由运行模式,从0x0000到0xFFFF反复计数 } void main() { unsigned char count = 0;//用来记录定时器溢出次数 LED1Init(); T1Init(); for (;;) { #if 1 if ((T1STAT & 0x20) > 0)//判断T1STAT的bit5 { T1STAT &= ~0x20; if (++count == 1) { count = 0; LED1 = !LED1; } } #else if ((IRCON & 0x02) > 0)//判断IRCON的bit1 { IRCON &= ~0x02;//清除中断标志 IRCON = 0; if (++count == 1) { count = 0; LED1 = !LED1; } } #endif } }
注意:每创建一个新工程都要配置IAR(做基础实验),TI CC2530基础实验(普通GPIO操作——点亮led灯)也有IAR相关配置步骤
总结:
定时器1在采用自由运行模式从0x0000计数开始,到0xFFFF溢出,其当定时器1采用128分频,在默认的工作频率下,一次溢出约为0.5s。
定时器1查询方式是通过判断T1STAT.OVFIF和IRCON.T1IF是否置1来判断定时器是否溢出。
TI CC2530基础实验(定时器1查询方式——自由运行模式)
原文地址:http://blog.csdn.net/thanksgining/article/details/42234651