本实验实现通过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