cc2530定时器1 怎么配置? 有相关例程最好
发布网友
发布时间:2022-05-12 02:05
我来回答
共1个回答
热心网友
时间:2023-11-03 02:54
cc2530中包含有1个睡眠定时器和3个普通定时器。本文主要记录自己对定时器1、3、4的理解,好记性不如烂笔头。
定时器1:
主要功能为:
1. 16位定时器
2. 五个捕获/比较功能
3. 自由运行、模模式或者正数/倒数计数操作
4. 时钟分频系数:1、8、32、128.
5. 在每个捕获/比较和最终计数上生成中断请求。
中断的分析和注意事项:
定时器1中能够产生中断的事件主要有以下三种:
1) 计数器达到最终计数值(溢出或者倒数计数回到零);
2) 输入捕获事件;
3) 输出比较事件;
以上三种中断事件的中断使能是如何设置?相应的中断标志又是什么?
使能定时器1的中断,要设置以下两地方:
1) 相应中断屏蔽位
2) IEN1.T1EN
相应的,中断屏蔽位为:
普通计数溢出事件的中断屏蔽位为:TIMIF.OVFIM(复位后默认为1,即使能)。
n个通道的输入捕获/输出比较事件的中断屏蔽位为:T1CCTLn.IM(复位后默认为1,即使能)。
产生中断后的中断标志位如下:
1)普通计数溢出事件的中断标志位:T1STAT.OVFIF。
2) n个通道的输入捕获/输出比较事件的中断标志位为:T1STAT.CHxIF。
3) IEN1.T1EN的中断标志为:IRCON.T1IF。(在调用中断服务程序时,需要手动清零)
定时器 1 中断相关设置
定时器 1 相关事件
使能中断
相应中断标志
中断屏蔽位
普通计数溢出事件
TIMIF.OVFIM
IEN1.T1EN
T1STAT.OVFIF
IRCON.T1IF
5 个通道输入捕获 / 输出比较事件
T1CCTLn.IM
IEN1.T1EN
T1STAT.CHxIF
IRCON.T1IF
应用场景一: 自由运行模式,计数器从0开始计数,到达0xFFFF时,溢出,设置标志,计数器载入0重新计数。
由于是普通定时器计数溢出事件,所以定时器的设置为:
1) 开启中断
TIMIF.OVFIM = 1;(上电默认为1,即使能)
IEN1.T1EN = 1;
2) 中断标志位
T1STAT.OVFIF
IRCON.T1IF(在调用中断服务程序时,需要手动清零)
应用场景二: 模模式,计数器从0开始计数,到达T1CC0L T1CC0H设置的比较值后,溢出,产生中断。(为了产生周期不为0xFFFF的应用程序)
使用模模式时,必须要开启通道0的输出比较功能,所以,此时不仅仅只是简单的中断溢出。主要的注意事项如下:
1) 模模式需要开启通道0的输出比较模式,否则计数器到了0xFFFF时,才会产生溢出中断,也就是说如果没有设置通道0的输出比较模式,计数器的值到了T1CC0L
T1CC0H设置的比较值后也不会产生溢出中断。
2) T1的模模式不是普通的溢出中断,和连续计数模式不同,它必须设置通道0的输出比较功能,使能中断时,也是使能通道0的输出比较中断屏蔽位。产生中断时的中断
标志也是通道0的输出比较中断标志,而不是计数溢出标志。
故定时器的使用设置为:
1) 开启中断
T1CCTL0.IM
= 1;
IEN1.T1EN = 1;
2) 中断标志位
IRCON.T1IF
( 在中断服务例程中需手动清零)
T1STAT.CH0I F
T1STAT.OVFIF
( 经调试,该标志位没有置1,依旧为0)
模模式例程:
// 定时器1模模式初始化
void halTimer1nit(uint16 cycles)
{
uint16 compareValue;
// 分频系数128,设置为模模式
T1CTL |= 0x0C;
compareValue = cycles*8;
// 设置比较值
T1CC0H = HI_UINT16(compareValue);
T1CC0L = LO_UINT16(compareValue);
// 设置通道0输出比较功能,开启相应中断
T1CCTL0.IM
= 1;
T1CCTL0 = 0x44;
// 清除中断标志位,关闭中断
T1STAT &= ~0x01; // T1STAT.CH1IF = 0
IEN1 &= ~0x02; // IEN1.T1EN = 0
}
// 定时器1模模式中断服务程序
#pragma vector = T1_VECTOR//定时器1
__interrupt void T1_ISR(void)
{
if(T1STAT.CH0IF)
// 产生中断
// 清除标志
T1STAT.CH0IF = 0;
IRCON.T1IF = 0;
// To Do...
}
定时器3和4的使用方法和定时器1类似。