论坛
潜水/灌水快乐,沉淀知识,认识更多同行。
ToB圈子
加入IT圈,遇到更多同好之人。
朋友圈
看朋友圈动态,了解ToB世界。
ToB门户
了解全球最新的ToB事件
博客
Blog
排行榜
Ranklist
文库
业界最专业的IT文库,上传资料也可以赚钱
下载
分享
Share
导读
Guide
相册
Album
记录
Doing
搜索
本版
文章
帖子
ToB圈子
用户
免费入驻
产品入驻
解决方案入驻
公司入驻
案例入驻
登录
·
注册
只需一步,快速开始
账号登录
立即注册
找回密码
用户名
Email
自动登录
找回密码
密码
登录
立即注册
首页
找靠谱产品
找解决方案
找靠谱公司
找案例
找对的人
专家智库
悬赏任务
圈子
SAAS
IT评测·应用市场-qidao123.com
»
论坛
›
软件与程序人生
›
DevOps与敏捷开发
›
【CC2530 教程 二】CC2530定时器实现微秒、毫秒、秒延时 ...
【CC2530 教程 二】CC2530定时器实现微秒、毫秒、秒延时函数 ...
写过一篇
金牌会员
|
2025-3-25 02:01:06
|
显示全部楼层
|
阅读模式
楼主
主题
927
|
帖子
927
|
积分
2781
目录
一、CC2530定时器:
二、CC2530定时器:
(1)定时器1(Timer1):
(2)定时器2(Timer2):
(3)定时器3和定时器4(Timer3、Time4):
三、CC2530时钟配置:
(1)时钟配置寄存器说明:
系统时钟概览:
(2)振荡器和时钟:
振荡器:
系统时钟:
(3)32 kHz 振荡器:
(4) 时钟寄存器:
CLKCONCMD (0xC6) - 时钟控制下令:
CLKCONSTA (0x9E) - 时钟控制状态:
(5)32Mhz时钟配置:
(6) 16Mhz时钟配置:
四、定时器1(Timer1)实现准确延时:
(1)定时器 1 操纵模式 :
自由运行模式:
模模式:
正计数/倒计数模式:
(2) 寄存器说明:
(3)微秒级延时函数:
(4)毫秒级延时函数:
(5)秒级延时函数:
五、延时实现LED闪烁:
六、代码下载:
一、CC2530定时器:
定时器本质上可以看作是一种计数器。
它通过对内部时钟信号或外部输入信号进行计数来测量时间间隔。当计数到达设定的值时,定时器会向处理器内核提出中断哀求,通知内核某个时间间隔已经竣事。
二、CC2530定时器:
CC2530有四个定时器:Timer1、Timer2、Timer3、Timer4 。
(1)定时器1(Timer1):
定时器 1 是一个独立的
16 位定时器
,支持典型的定时/计数功能,比如输入捕捉,输出比较和 PWM 功能。定时器有五个独立的捕捉/比较通道。每个通道定时器使用一个 I/O 引脚。定时器用于范围广泛的控制和测量应用,可用的五个通道的正计数/倒计数模式将允许诸如电机控制应用的实现。
功能类别
描述
通道数量
定时器 1 配备了五个捕捉 / 比较通道,可同时对多个信号进行处理和控制。
输入捕捉功能
支持在信号的上升沿、下降沿或任何边沿触发输入捕捉,能准确记录事件发生时刻。
输出比较功能
可设置、扫除或切换输出比较功能,实现对外部设备的准确控制,如驱动电机等。
计数模式
支持自由运行、模、正计数 / 倒计数等多种计数模式,满意不同应用场景需求。
时钟分频
内置时钟分频器,可将输入时钟频率通过 1、8、32 或 128 的分频因子进行分频,机动调解计数速度。
中断哀求
在每个捕捉 / 比较事件以及最终计数结果上天生中断哀求,实时通知处理器进行相应处理。
DMA 触发
具备 DMA 触发功能,可在无需 CPU 干预的环境下自动完成大量数据传输,进步系统效率。
(2)定时器2(Timer2):
定时器 2 主要
用于为 802.15.4 CSMA-CA 算法提供定时
,以及为 802.15.4 MAC 层提供一般的计时功能。当定时器 2 和休眠定时器一起使用时,即
使系统进入低功耗模式也会提供定时功能
。定时器运行在CLKCONSTA.CLKSPD 指明的速度上。如果定时器 2 和就寝定时器一起使用,时钟速度必须设置为 32 MHz,且
必须使用一个外部 32 kHz XOSC 得到准确结果。
功能类别
描述
计数类型
16 位定时器,仅支持正计数。
计时精度
可变周期可准确到 31.25 纳秒。
比较功能
配备 2 个 16 位定时器比较功能,可实现准确的时间控制。
溢出计数
具有 24 位溢出计数功能,扩展了定时器的计数范围。
溢出比较
支持 2 个 24 位溢出计数比较功能,加强了定时控制的机动性。
帧首定界符捕捉
具有帧首定界符捕捉功能,便于在通信或数据帧同步中使用。
同步机制
定时器的启动和停止可以同步到外部 32kHz 时钟,大概由就寝定时器提供定时,确保定时器在低功耗模式下的准确运行。
中断功能
在比较匹配和溢失事件发生时,能够产生中断,实时通知处理器进行处理。
DMA 触发
支持 DMA 触发功能,可在无需 CPU 干预的环境下自动完成数据传输,进步系统效率。
延长调解
通过引入延长机制,用户可以机动调解定时器的计数值,以适应不同的定时需求。
(3)定时器3和定时器4(Timer3、Time4):
定时器 3 和 4 是两个
8位的定时器。
每个定时器有两个独立的比较通道,每个通道上使用一个 I/O 引脚。
功能类别
描述
通道数量
定时器 3/4 配备了两个捕捉 / 比较通道,可同时处理两个信号的捕捉或比较操纵。
输出比较功能
支持设置、扫除或切换输出比较功能,能够机动控制外部设备的运行状态。
时钟分频
内置时钟分频器,可将输入时钟频率通过 1、2、4、8、16、32、64、128 的分频因子进行分频,机动调解计数速度。
中断哀求
在每次捕捉 / 比较事件以及最终计数事件发生时,定时器能够天生中断哀求,实时通知处理器进行相应的处理。
DMA 触发
具备 DMA 触发功能,可在无需 CPU 干预的环境下自动完成数据传输,进步系统团体效率。
三、CC2530时钟配置:
(1)时钟配置寄存器说明:
系统时钟概览:
系统时钟不配置时,默认使用内部16MHz时钟。
(2)振荡器和时钟:
设备有一个内部系统时钟或主时钟。
该系统时钟的源既可以用 16 MHzRC 振荡器
,
也可以采用 32 MHz 晶体振荡器。
时钟的控制可以使用 CLKCONCMD SFR 寄存器实行。
还有一个 32 MHz 时钟源,可以是 RC 振荡器或晶振,也由 CLKCONCMD 寄存器控制。
CLKCONSTA 寄存器是一个只读的寄存器,用于获恰当前时钟状态。
振荡器可以选择高精度的晶体振荡器,也可以选择低功耗的高频 RC 振荡器。
留意,运行 RF 收发器,必须使用 32 MHz 晶体振荡器。
振荡器:
CC2530带有可用时钟源的时钟系统。
设备有两个高频振荡器:
32MHz 晶振和16MHz RC 振荡器。
32 MHz 晶振启动时间对一些应用步伐来说大概比较长,因此设备可以运行在 16 MHz RC 振荡器,直到晶振稳固。16 MHz RC 振荡器功耗少于晶振,但是由于不像晶振那么准确,不能用于 RF 收发器操纵。
设备有两个低频振荡器:
32 kHz 晶振和32 kHz RC 振荡器。
32 kHz XOSC 用于运行在 32.768 kHz,为系统必要的时间精度提供一个稳固的时钟信号。校准时 32 kHzRCOSC 运行在 32.753 kHz 。 校准只能发生在 32 kHz XOSC 使能的时间 , 这个校 准 可 以通 过使能SLEEPCMD.OSC32K_CALDIS 位禁用。比起 32 kHz XOSC 解决方案,32 kHz RCOSC 振荡器应用于低落成本和电源消耗。
这两个 32 kHz 振荡器不能同时运行。
系统时钟:
系统时钟是从所选的主系统时钟源得到的
,主系统时钟源可以是 32 MHz XOSC 或 16 MHz RCOSC。
CLKCONCMD.OSC 位选择主系统时钟的源。
留意要使用 RF 收发器,必须选择高速且稳固的 32 MHz 晶振。
留意改变 CLKCONCMD.OSC 位不会立即改变系统时钟。
时钟源的改变起首在CLKCONSTA.OSC = CLKCONCMD.OSC 的时间见效。这是由于在现实改变时钟源之前必要有稳固的时钟 。
还要留意CLKCONCMD.CLKSPD 位反映系统时钟的频率,因此是 CLKCONCMD.OSC 位的映像。
选择了 32 MHz XOSC 且稳固之后,即当 CLKCONSTA.OSC 位从 1 变为 0,16 MHz RC 振荡器就被校准。
留意:
从 16 MHz 时钟变到 32 MHz 时钟源(反之亦然)与 CLKCONCMD.TICKSPD 的设置一致。当 CLKCONCMD.OSC 改变时,较慢的 CLKCONCMD.TICKSPD 设置导致现实源改变见效的时间较长。最快的转换是当 CLKCONCMD.TICKSPD 等于 000 时得到。
(3)32 kHz 振荡器:
设备配备两个32kHz振荡器作为32kHz时钟源:32kHz XOSC和32kHz RCOSC。
默认复位后,32kHz RCOSC被启用并选为32kHz时钟源。
RCOSC功耗低,但精度不如XOSC。所选的32kHz时钟源用于驱动就寝定时器、为看门狗定时器产生时钟信号,并在计算就寝定时器就寝时间时作为定时器2的选通下令。通过CLKCONCMD.OSC32K寄存器位选择振荡器作为32kHz时钟源,但在16MHz RCOSC成为活跃系统时钟源之前,该寄存器位的写入无效。
当系统时钟从16MHz RCOSC切换到32MHz XOSC时,若选中32kHz RCOSC,其校准开始,使RCOSC运行在32.753kHz,校准大概需2ms,可通过设置SLEEPCMD.OSC32K_CALDIS=1禁用。校准竣事时,32kHz时钟源大概产生额外脉冲,使就寝定时器增长1。
留意,切换到32MHz XOSC后,若从PM3唤醒且32MHz XOSC已启用,振荡器需多达500ms稳固在正确频率。在32MHz XOSC稳固前,就寝定时器、看门狗定时器和时钟丢失探测器不可用。
(4) 时钟寄存器:
CLKCONCMD (0xC6) - 时钟控制下令:
位名称复位R/W描述7OSC32K1R/W 32kHz时钟振荡器选择。设置该位只能发起一个时钟源改变。CLKCONSTA.OSC32K反映当前的设置。当要改变该位必须选择16MHz RCOSC作为系统时钟。
0:32kHz XOSC
1:32kHz RCOSC
6OSC[1]1R/W 系统时钟源选择。设置该位只能发起一个时钟源改变。CLKCONSTA.OSC反映当前的设置。
0:32MHz XOSC
1:16MHz RCOSC
5:3TICKSPD[2:0]001R/W 定时器标记输出设置。不能高于通过OSC位设置的系统时钟设置。
000:32MHz
001:16MHz
010:8MHz
011:4MHz
100:2MHz
101:1MHz
110:500kHz
111:250kHz
留意CLKCONCMD.TICKSPD可以设置为任意值,但是结果受CLKCONCMD.OSC设置的限制,即如果CLKCONCMD.OSC=1且CLKCONCMD.TICKSPD=000,CLKCONCMD.TICKSPD读出001且现实TICKSPD是16MHz。
2:0CLKSPD001R/W 时钟速度。不能高于通过OSC位设置的系统时钟设置。表现当前系统时钟频率。
000:32MHz
001:16MHz
010:8MHz
011:4MHz
100:2MHz
101:1MHz
110:500kHz
111:250kHz
留意CLKCONCMD.CLKSPD可以设置为任意值,但是结果受CLKCONCMD.OSC设置的限制,即如果CLKCONCMD.OSC=1且CLKCONCMD.CLKSPD=000,CLKCONCMD.CLKSPD读出001且现实CLKSPD是16MHz。
还要留意调试器不能和一个划分过的系统时钟一起工作。当运行调试器,当CLKCONCMD.OSC=0时,CLKCONCMD.CLKSPD的值必须设置为000,或当CLKCONCMD.OSC=1设置为001。
CLKCONSTA (0x9E) - 时钟控制状态:
位名称复位R/W描述7OSC32K1R 当前选择的32kHz时钟源。
0:32kHz XOSC
1:32kHz RCOSC
6OSC1R 当前选择的系统时钟。
0:32MHz XOSC
1:16MHz RCOSC
5:3TICKSPD[2:0]001R 当前设置的定时器标记输出。
000:32MHz
001:16MHz
010:8MHz
011:4MHz
100:2MHz
101:1MHz
110:500kHz
111:250kHz
2:0CLKSPD001R 当前时钟速度。
000:32MHz
001:16MHz
010:8MHz
011:4MHz
100:2MHz
101:1MHz
110:500kHz
111:250kHz
(5)32Mhz时钟配置:
//设置系统主时钟频率为 32MHZ
void Clock_config_32MHz(void){
CLKCONCMD &= ~0x40; //设置系统时钟源为32MHZ晶振
while(CLKCONSTA & 0x40); //等待晶振稳定为32M
CLKCONCMD &= ~0x47; //设置系统主时钟频率为32MHZ
}
复制代码
(6) 16Mhz时钟配置:
//设置系统主时钟频率为 16MHZ
void Clock_config_16MHz(void){
CLKCONCMD |= 0x40; // 设置系统时钟源为 16MHz RCOSC
while(CLKCONSTA & 0x40);
CLKCONCMD &= ~0x3F; // 先清除低6位
CLKCONCMD |= 0x01; // 设置定时器tick输出和时钟速度为16MHz
}
复制代码
四、定时器1(
Timer1
)实现准确延时:
定时器1包含一个
16位计数器
,可在每个活动时钟边沿递增或递减。其
活动时钟边沿周期由CLKCON.TICKSPD寄存器位界说
,可设置全球系统时钟的划分,提供0.25MHz到32MHz的不同时钟频率,也
可使用32MHz晶振作为时钟源
。定时器1中的T1CTL.DIV设置的分频器值可进一步划分此频率,分频器值有
1、8、32、128四种
。当32MHz晶振作为系统时钟源时,定时器1的最低时钟频率为1953.125Hz,最高为32MHz;当16MHz RC振荡器作为系统时钟源时,定时器1的最高时钟频率为16MHz。
该计数器可作为
自由运行计数器、模计数器或正计数/倒计数器运行
,用于中央对齐的PWM。
通过两个8位的SFR T1CNTH和T1CNTL读取16位计数器值,分别包含高位字节和低位字节
。读取T1CNTL时,计数器的高位字节被缓冲到T1CNTH,以便读取,
因此读取时需先读T1CNTL再读T1CNTH。写入T1CNTL寄存器会复位16位计数器。
计数器到达最终计数值(溢出)时产生中断哀求,可通过T1CTL控制寄存器设置启动和停止计数器。写入非00值到T1CTL.MODE时计数器开始运行,写入00时计数器停止在当前值。
(1)定时器 1 操纵模式 :
一般来说控制寄存器
T1CTL 用于控订定时器操纵
。状态寄存器
T1STAT 保存中断标志
。
自由运行模式:
在自由运行操纵模式下,
计数器从 0x0000 开始,每个活动时钟边沿增长 1。当计数器到达 0xFFFF(溢出),计数器载入 0x0000,继续递增它的值,
如图下所示。当到达最终计数值 0xFFFF,
设置标志 IRCON.T1IF 和T1STAT.OVFIF。
如果设置了相应的中断屏蔽位 TIMIF.OVFIM 以及 IEN1.T1EN,将产生一个中断哀求。自由运行模式可以用于产生独立的时间间隔,输出信号频率。
模模式:
当定时器运行在模模式,
16 位计数器从 0x0000 开始,每个活动时钟边沿增长 1。当计数器到达 T1CC0(溢出),寄存器 T1CC0H:T1CC0L 保存的最终计数值,计数器将复位到 0x0000,并继续递增。
如果定时器开始于T1CC0 以上的一个值,当到达最终计数值(0xFFFF)时,
设置标志 IRCON.T1IF 和 T1CTL.OVFIF。
如果设置了相应的中断屏蔽位 TIMIF.OVFIM 以及 IEN1.T1EN,将
产生一个中断哀求
。模模式可以用于周期不是 0xFFFF的应用步伐。
正计数/倒计数模式:
在正计数/倒计数模式,计数器反复从 0x0000 开始,正计数直到到达 T1CC0H:T1CC0L 保存的值。
然后计数器将
倒计数直到 0x0000
,如图所示。
这个定时器用于周期必须是对称输出脉冲而不是 0xFFFF 的应用步伐
,因此允许中央对齐的
PWM
输出应用的实现。在正计数/倒计数模式,当到达最终计数值时,
设置标志IRCON.T1IF 和 T1CTL.OVFIF
。如果设置了相应的中断屏蔽位 TIMIF.OVFIM 以及 IEN1.T1EN,将
产生一个中断哀求。
(2) 寄存器说明:
T1CNTH (0xE3) - 定时器 1 计数器高位:
位名称复位R/W描述7:0CNTH[15:8]0x00R定时器计数器高字节。包含在读取T1CNTL的时间定时计数器缓存的高16位字节。
T1CNTL (0xE2) - 定时器 1 计数器低位:
位名称复位R/W描述7:0CNTL[7:0]0x00R/W定时器计数器低字节。包括16位定时器计数器低字节。往该寄存器中写任何值,导致计数器被扫除为0x0000,初始化所有相通道的输出引脚。
T1CTL (0xE4) - 定时器 1 的控制和状态:
位名称复位R/W描述7:4-0000bR0保留3:2DIV[1:0]00R/W 分频器划分值。产生主动的时钟边沿用来更新计数器。
00:标记频率/1
01:标记频率/8
10:标记频率/32
11:标记频率/128
1:0MODE[1:0]00R/W 选择定时器1模式。定时器操纵模式通过下列方式选择:
00:暂停运行。
01:自由运行,从0x0000到0xFFFF反复计数。
10:模,从0x0000到T1CC0反复计数。
11:正计数/倒计数,从0x0000到T1CC0反复计数并且从T1CC0倒计数到0x0000。
T1STAT (0xAF) - 定时器 1 状态:
位名称复位R/W描述7:6-0R0保留5OVFlF0R/W0定时器1计数器溢出中断标志。当计数器在自由运行或模模式下到达最终计数值时设置,当在正计/倒计数模式下到达0时设置。写1没有影响。4CH4IF0R/W0定时器1通道4中断标志。当通道4中断条件发生时设置。写1没有影响。3CH3IF0R/W0定时器1通道3中断标志。当通道3中断条件发生时设置。写1没有影响。2CH2IF0R/W0定时器1通道2中断标志。当通道2中断条件发生时设置。写1没有影响。1CH1IF0R/W0定时器1通道1中断标志。当通道1中断条件发生时设置。写1没有影响。0CH0IF0R/W0定时器0通道4中断标志。当通道0中断条件发生时设置。写1没有影响。
(3)微秒级延时函数:
/*
定时器1 精确延时函数
主频:32MHz
*/
void Delay_us(unsigned int us) {
// 寄存器 T1CC0H:T1CC0L 保存的最终计数值
T1CC0L = 0x20; // 低八位:0x20 = 32
T1CC0H = 0x00; // 高八位:0x00 = 0 → 组合为0x0020
// 计数值: 0x0020=32
T1CTL = 0x02; // 0000 0010 32Mhz 不分频 模模式
// T1CTL = 0x06; // 0000 0110 32Mhz 8分频 模模式
// T1CTL = 0x0A; // 0000 1010 32Mhz 32分频 模模式
// T1CTL = 0x0E; // 0000 1110 32Mhz 128分频 模模式
while(us)
{
while(!((T1CNTL >= 0x20)&&(T1CNTH == 0x00)));
us--;
}
T1CTL = 0x00; //关闭定时器
}
复制代码
时钟频率32MHz,不分频,最大计数值为32,外层循环控制总的延时微秒数,内层循环等待定时器计数到目标值,每次到达目标值即表现经过1微秒,最后关闭定时器。(1/32000000)*32s=1us
(4)毫秒级延时函数:
void Delay_ms(unsigned int ms) {
T1CC0L = 0xE8; // 低八位: 0xE8 = 232
T1CC0H = 0x03; // 高八位: 0x03 = 3 → 组合为0x03E8
// 计数值: 0x03E8=1000
T1CTL = 0x0A; // 0000 1010 32分频 模模式
while(ms)
{
while(!((T1CNTL >= 0xE8)&&(T1CNTH >= 0x03)));
ms--;
}
T1CTL = 0x00; //关闭定时器
}
复制代码
时钟频率32MHz,32分频,最大计数值为1000,外层循环控制总的延时微秒数,内层循环等待定时器计数到目标值,每次到达目标值即表现经过1毫秒,最后关闭定时器。(32/32000000)*1000s=1ms。
(5)秒级延时函数:
void Delay_s(unsigned int s) {
T1CC0L = 0x24; // 低八位:0x24 = 36
T1CC0H = 0xF4; // 高八位:0xF4 = 244 → 组合为0xF424
// 计数值:0xF424 = 62500
T1CTL = 0x0E; // 0000 1110 32Mhz 128分频 模模式
// 将秒数转换为 250ms 的循环次数(s × 4)
s *= 4;
while (s--) {
// 等待定时器计数到62500(250ms)
while(!((T1CNTL >= 0x24)&&(T1CNTH >= 0xF4)));
}
T1CTL = 0x00; // 关闭定时器
}
复制代码
时钟频率32MHz,128分频,最大计数值为1000,外层循环控制总的延时微秒数,内层循环等待定时器计数到目标值,每次到达目标值即表现经过1毫秒,最后关闭定时器。(128/32000000)*62500*4s=1s。
五、延时实现LED闪烁:
#include <ioCC2530.h>
#include "LED.h"
#include "Delay.h"
void main(void) {
LED_Init();
Clock_config_32MHz();
// 主循环
while (1) {
Delay_s(1);
LED_Control(1);
Delay_s(1);
LED_Control(0);
}
}
复制代码
LED定时1s闪烁
六、代码下载:
代码下载链接
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
本帖子中包含更多资源
您需要
登录
才可以下载或查看,没有账号?
立即注册
x
回复
使用道具
举报
0 个回复
倒序浏览
返回列表
快速回复
高级模式
B
Color
Image
Link
Quote
Code
Smilies
您需要登录后才可以回帖
登录
or
立即注册
本版积分规则
发表回复
回帖并转播
回帖后跳转到最后一页
发新帖
回复
写过一篇
金牌会员
这个人很懒什么都没写!
楼主热帖
hibernate入门
kubernetes数据持久化StorageClass动态 ...
回忆我的第一个软件项目
Debian/Ubuntu使用apt安装php8.x
26基于java的电影院售票管理系统设计 ...
Java EnumMap putAll()方法具有什么功 ...
管理软件定制公司 广州管理软件定制开 ...
OpenHarmony开源鸿蒙与HarmonyOS商业鸿 ...
基于LSTM的多变量多输出温湿度预测 ...
Jvm调优
标签云
运维
CIO
存储
服务器
快速回复
返回顶部
返回列表