定时器
定时器简介
CC2530有5个定时器,即定时器1(16位定时器),定时器2(MAC定时器),定时器3和4,睡眠定时器
- 定时器1:一个16位定时器,具有定时器/计数器/PWM功能
- 定时器2:专门为支持IEEE 802.15.4 MAC或软件中其他时槽的协议设计。
- 定时器3和定时器4:两个都是8位定时器,具有定时器/计数器/PWM功能。它们有一个可编程的分频器、一个8位周期值、一个可编程的计数器通道(具有一个8位的比较值)。每个计数器通道可以用作一个PWM输出。
- 睡眠定时器:一个超低功耗的定时器,用于计算32kHz晶体振荡器或32kHz RC振荡器的周期。
定时器T1
定时器1是一个独立的16位定时器,支持典型的定时/计数功能,比如输入捕获、输出比较和PWM功能。该定时器拥有5个独立的捕获/比较通道。每个通道使用一个I/O引脚。定时器1用于广泛的控制和测量应用,5个通道具备正计数/倒计数模式,允许诸如电机控制应用的实现。
定时器1功能特征如下:
- 5个捕获/比较通道
- 上升沿、下降沿和任何边沿的输入捕获
- 设置、清除或切换输出比较
- 自由运行、模或正计数/倒计数操作
- 1,8,32或128时钟分频
- 在每个捕获/比较和最终计数上生成中断请求
- DMA触发功能
16位计数器
- 定时器1包含一个16位计数器,在每个活动时钟边沿递增或递减。活动时钟边沿周期由寄存器位
CLKCONCMD.TICKSPD
定义,它设置全局系统时钟的划分,提供了从0.25MHz到32MHz不同的时钟标签频率(可使用32MHz晶体振荡器作为时钟源)。
在定时器1中,由T1CTL.DIV
设置的分频器进一步划分。这个分频器值可以为1,8,32或128。因此,当32MHz晶体振荡器用作系统时钟源时,定时器1可以使用的最低时钟频率是1953.125Hz,最高为32MHz。当16MHz RC振荡器用作系统时钟源时,定时器1可以使用的最高时钟频率为16MHz - 这个16位计数器可作为一个自由运行计数器、模计数器,或在中心对齐的PWM里使用的正计数器/倒计数器运行。
可以通过两个8位的SFR寄存器T1CNTH
和T1CNTL
读取16位计数器的值,分别包含高位字节和低位字节。当读取T1CNTL
时,计数器的高位字节在那时被缓冲到T1CNTH
,以便高位字节可以从T1CNTH
中读出。因此,T1CNTL
必须总是在读取T1CNTH
之前首先读取。
对T1CNTL
寄存器的所有写入访问将复位16位计数器。
当达到最终计数值(溢出)时,计数器产生一个中断请求。可以用T1CTL
控制寄存器设置启动和停止该计数器。当一个不是00的值写入到T1CTL.MODE
时,计数器开始运行。如果00写入到T1CTL.MODE
,计数器将停止在它现在的值上。
定时器1的操作
一般来说,控制寄存器T1CTL
用于控制定时器1的操作,状态寄存器T1STAT
保存中断标志。
- 自由运行模式
16位计数器从0x0000开始,在每个活动边沿增加1,当计数器达到0xFFFF(溢出)时,计数器载入0x0000,继续递增它的值。当达到最终计数值0xFFFF时,设置标志IRCON.T1IF
和T1STAT.OVERIF
。如果设置了相应的中断屏蔽位TIMIF.OVRIM
以及IEN1.T1EN
,将产生一个中断请求。自由运行模式可以用于产生独立的时间间隔和输出信号频率。
- 模模式
16位计数器从0x0000开始,在每个活动边沿增加1,当计数器达到T1CC0
(溢出),即寄存器T1CC0H: T1CC0L
保存的最终计数值时,计数器将复位到0x0000,并继续递增。如果定时器开始于T1CC0以上的一个值,当达到最终计数值0xFFFF时,设置标志IRCON.T1IF
和T1STAT.OVERIF
。如果设置了相应的中断屏蔽位TIMIF.OVRIM
以及IEN1.T1EN
,将产生一个中断请求。模模式可以用于周期不是0xFFFF的应用程序。
- 正计数/倒计数模式
在正计数/倒计数模式,计数器反复从0x0000开始,正计数直到达到T1CC0H:T1CC0L
保存的值,然后计数器将倒计数直到0x0000。这个用于周期必须是对称输出脉冲而不是0xFFFF的应用程序,因此允许中心对齐的PWM输出应用的实现。在正计数/倒计数模式下,当达到最终计数值时,设置标志IRCON.T1IF
和T1STAT.OVERIF
。如果设置了相应的中断屏蔽位TIMIF.OVRIM
以及IEN1.T1EN
,将产生一个中断请求。
T1相关寄存器
T1计数器T1CNTH
、T1CNTL
定时器1控制寄存器T1CTL
定时器1状态寄存器T1STAT
定时器1通道0捕获/比较控制寄存器T1CCTL0
定时器1通道0捕获/比较值寄存器T1CC0H
、T1CC0L
定时器1/3/4中断掩码/标志寄存器TIMIF
定时器3控制寄存器T3CTL
定时器4控制寄存器T4CTL
代码
- 定时器1查询方式
#include <iocc2530.h>
int main()
{
int count = 0;
//set LED
P1DIR |= 0x01; //0000 0001
T1CTL = 0x0D; //0000 1101 128 free-running
while(1){
if( IRCON > 0 ){
IRCON = 0;
if(++count==1){
count = 0;
P1_0 ^= 1;
}
}
}
}
- 定时器3中断方式
#include <iocc2530.h>
int count = 0;
int main()
{
//set timer3
T3CTL |= 0xE0; // 1110 0000
T3CTL &= 0xFC; // 1111 1100
T3CTL |= 0x10;
// set timers3 overflow interrupt
T3CTL |= 0x08;
T3IE = 1;
EA = 1;
//set led2 P1_1
P1DIR |= 0x02; //0000 0010
while(1);
}
#pragma vector=T3_VECTOR
__interrupt void T3_ISR(){
if(TIMIF &= 0x01){
if(++count>244){
count = 0;
P1_1 ^= 1;
}
}
TIMIF &= 0xFE; //1111 1110
T3IF = 0;
}
版权声明:本文为CSDN博主「Star_ID」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/Star_ID/article/details/121467140
暂无评论