本实验实现通过CC2530的定时器3(8位)查询方式控制LED1以1S的周期性闪烁,此实验使用有关定时器3的2个寄存器T3CTL(定时器3控制寄存器),IEN1(中断使能1寄存器)。
有关CC2530的GPIO基本知识、普通GPIO操作有关寄存器的介绍、IAR Embedded Workbench IDE软件使用:TI CC2530基础实验(普通GPIO操作——点亮led灯)
原理图:
寄存器分析:
程序:
#include <ioCC2530.h> /*********************************************** * 程序说明:T3中断方式控制LED1以1S的周期性闪烁 **********************************************/ #define LED1 P1_0 unsigned char count = 0;//用来记录定时器溢出次数 /********************************************************* * 函数描述:初始化LED1 * 备注:系统不配置工作时钟时使用内部 RC 振荡器,即16MHz *********************************************************/ void LED1Init(void) { P1SEL &= ~0x01; //功能:普通I/O P1DIR |= 0x01; //方向:输出 LED1 = 1; //使其属于灭状态 } /*********************************** * 函数描述:定时器3初始化 **********************************/ void T3Init(void) { EA = 1; //不管三七二十一,先开启总中断 /*使能定时器3中断*/ IEN1 |= 0x08; //或T3IE = 1; /*使能溢出中断,默认是使能溢出中断*/ T3CTL |= 0x08; //查看T3CTL寄存器,需要使能溢出中断 /*设置分频、自由运行模式*/ T3CTL |= 0xE0; //128分频 T3CTL &= ~0x03; //自由运行模式 /*设置好定时器3,开启定时器3*/ T3CTL |= 0x10; //查看T3CTL寄存器,需要启动定时器 } /*********************************** * 函数描述:定时器3中断处理函数 **********************************/ #pragma vector = T3_VECTOR __interrupt void T3_ISR(void) { //IRCON = 0; //清中断,似乎硬件帮我们将IRCON对应的中断标志位清除了 if (++count > 254) { count = 0; LED1 = !LED1; } } void main() { LED1Init(); T3Init(); for (;;); }
其中定时器3中断服务程序中的254是怎么来的呢?
系统在不配置工作频率时默认为2分频,即16M=32M/2。1/(16M/128)*N = 0.5s(每隔0.5秒一次开,一次关,这样看起来就像以1S周期性闪烁),得到 N = 65200,即而每次溢出递增次数为256(0x00~0xFF),所有总共需要溢出的次数 = 65200/256 = 254.
注意:每创建一个新工程都要配置IAR(做基础实验),TI CC2530基础实验(普通GPIO操作——点亮led灯)也有IAR相关配置步骤
总结:
1、当系统不配置工作频率时,即为16M工作频率下,定时器每递增需要时间为1/(16000000/128) = 8us。当采用自由运行模式下,每溢出一次需要时间为:2ms
2、定时器3采用中断方式,初始化需要做的事情:1)开启总中断 EA = 1; 2)使能定时器3中断 3)使能溢出中断(默认使能) 4)设置分频、运行模式 5)最后启动定时器3
TI CC2530基础实验(定时器3中断方式——自由运行模式)
原文地址:http://blog.csdn.net/thanksgining/article/details/42236719