CC2530之Timer3/4应用
实验内容
在本次实验中,通过定时器功能精确控制LED灯的闪烁频率。
硬件电路
CC2530的定时器介绍
什么是定时/计数器?
定时/计数器是一种能够对时钟信号或外部输入信号进行计数,当计数值达到设定要求时便向CPU提出处理请求,从而实现定时或计数功能的外设。在单片机中,一般使用Timer表示定时计数器。
定时器的作用?
定时/计数器的基本功能是实现定时和计数,且在整个工作过程中不需要CPU进行过多参与,它的出现将CPU从相关任务中解放出来,提高了CPU的使用效率。
定时/计数器基本工作原理
CC2530中共包含了5个定时/计数器:
无论使用定时/计数器的哪种功能,其最基本的工作原理是进行计数。定时/计数器的核心是一个计数器,可以进行加1(或减1)计数,每出现一个计数信号,计数器就自动加1(或自动减1),当计数值从最大值变成0(或从0变成最大值)溢出时定时/计数器便向CPU提出中断请求。
CC2530在上电后,默认使用内部频率为16MHZ的RC振荡器;也可以使用外界的晶体振荡器,一般为32MHZ的晶振。
工作模式
CC2530的定时器1、定时器3和定时器4虽然计数器的位数不同,但是都有自由运行模式、模模式和正计数/倒计数三个工作模式。本次实验以T3为例。
自由运行模式
模模式
正计数/倒计数模式
当计数器达到最终计数值时,寄存器仅当设置了中断屏蔽位时,才会发生中断请求。这个定时器用于周期必须是对称输出脉冲.
IRCON寄存器可有硬件自动清零,不需要手动清楚标志位。
寄存器
定时器3控制寄存器【T3CTL】
中断使能寄存器【IEN1】
中断使能寄存器【IEN2】
定时器使用方法
定时器3采用中断方式,初始化需要做的事情:
1)使能定时器3中断
2)使能溢出中断(默认使能)
3)设置分频、运行模式
4)最后启动定时器3
5)开启总中断 EA = 1;
关键代码
/********************Timer3 initialization function***********************/
void Init_Timer3()
{
T3CTL |= 0x08 ; //开溢出中断
T3IE = 1; //开T3中断
T3CTL|=0XE0; //128分频,128/16000000*N=0.5S, N=65200
T3CTL &= ~0X03; //自动重装 00->0xff 65200/256=254(次)
T3CTL |=0X10; //启动
EA = 1; //开总中断
}
/*****************************Timer3 interrupt function**************/
#pragma vector = T3_VECTOR //定时器T3
__interrupt void T3_ISR(void)
{
IRCON = 0x00; //清中断标志, 也可由硬件自动完成
if(++count>254) //254次中断后LED取反,闪烁一轮(约为0.5 秒时间)
{
count = 0; // 计数清零
P0_0 = ~P0_0; //LED1-link 状态反转
P2_0 = ~P2_0; //LED2-data 状态反转
}
}
/*************************主函数*****************/
void main()
{
Init_Led();
Init_Timer3();
while(1)
{
Delay(1000);
}
}
系统在不配置工作频率时默认为2分频,即16M=32M/2。1/(16M/128)*N = 0.5s(每隔0.5秒一次开,一次关,这样看起来就像以1S周期性闪烁),得到 N = 65200,即而每次溢出递增次数为256(0x00~0xFF),所有总共需要溢出的次数 = 65200/256 = 2