目录
一、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 | 描述 |
---|---|---|---|---|
7 | OSC32K | 1 | R/W | 32kHz时钟振荡器选择。设置该位只能发起一个时钟源改变。CLKCONSTA.OSC32K反映当前的设置。当要改变该位必须选择16MHz RCOSC作为系统时钟。 0:32kHz XOSC 1:32kHz RCOSC |
6 | OSC[1] | 1 | R/W | 系统时钟源选择。设置该位只能发起一个时钟源改变。CLKCONSTA.OSC反映当前的设置。 0:32MHz XOSC 1:16MHz RCOSC |
5:3 | TICKSPD[2:0] | 001 | R/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:0 | CLKSPD | 001 | R/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 | 描述 |
---|---|---|---|---|
7 | OSC32K | 1 | R | 当前选择的32kHz时钟源。 0:32kHz XOSC 1:32kHz RCOSC |
6 | OSC | 1 | R | 当前选择的系统时钟。 0:32MHz XOSC 1:16MHz RCOSC |
5:3 | TICKSPD[2:0] | 001 | R | 当前设置的定时器标记输出。 000:32MHz 001:16MHz 010:8MHz 011:4MHz 100:2MHz 101:1MHz 110:500kHz 111:250kHz |
2:0 | CLKSPD | 001 | R | 当前时钟速度。 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); //等待晶振稳定为32MCLKCONCMD &= ~0x47; //设置系统主时钟频率为32MHZ }
(6) 16Mhz时钟配置:
//设置系统主时钟频率为 16MHZ
void Clock_config_16MHz(void){CLKCONCMD |= 0x40; // 设置系统时钟源为 16MHz RCOSCwhile(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:0 | CNTH[15:8] | 0x00 | R | 定时器计数器高字节。包含在读取T1CNTL的时候定时计数器缓存的高16位字节。 |
T1CNTL (0xE2) - 定时器 1 计数器低位:
位 | 名称 | 复位 | R/W | 描述 |
---|---|---|---|---|
7:0 | CNTL[7:0] | 0x00 | R/W | 定时器计数器低字节。包括16位定时器计数器低字节。往该寄存器中写任何值,导致计数器被清除为0x0000,初始化所有相通道的输出引脚。 |
T1CTL (0xE4) - 定时器 1 的控制和状态:
位 | 名称 | 复位 | R/W | 描述 |
---|---|---|---|---|
7:4 | - | 0000b | R0 | 保留 |
3:2 | DIV[1:0] | 00 | R/W | 分频器划分值。产生主动的时钟边缘用来更新计数器。 00:标记频率/1 01:标记频率/8 10:标记频率/32 11:标记频率/128 |
1:0 | MODE[1:0] | 00 | R/W | 选择定时器1模式。定时器操作模式通过下列方式选择: 00:暂停运行。 01:自由运行,从0x0000到0xFFFF反复计数。 10:模,从0x0000到T1CC0反复计数。 11:正计数/倒计数,从0x0000到T1CC0反复计数并且从T1CC0倒计数到0x0000。 |
T1STAT (0xAF) - 定时器 1 状态:
位 | 名称 | 复位 | R/W | 描述 |
---|---|---|---|---|
7:6 | - | 0 | R0 | 保留 |
5 | OVFlF | 0 | R/W0 | 定时器1计数器溢出中断标志。当计数器在自由运行或模模式下达到最终计数值时设置,当在正计/倒计数模式下达到0时设置。写1没有影响。 |
4 | CH4IF | 0 | R/W0 | 定时器1通道4中断标志。当通道4中断条件发生时设置。写1没有影响。 |
3 | CH3IF | 0 | R/W0 | 定时器1通道3中断标志。当通道3中断条件发生时设置。写1没有影响。 |
2 | CH2IF | 0 | R/W0 | 定时器1通道2中断标志。当通道2中断条件发生时设置。写1没有影响。 |
1 | CH1IF | 0 | R/W0 | 定时器1通道1中断标志。当通道1中断条件发生时设置。写1没有影响。 |
0 | CH0IF | 0 | R/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=32T1CTL = 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=1000T1CTL = 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 = 36T1CC0H = 0xF4; // 高八位:0xF4 = 244 → 组合为0xF424// 计数值:0xF424 = 62500T1CTL = 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闪烁
六、代码下载:
代码下载链接