【CC2530 教程 二】CC2530定时器实现微秒、毫秒、秒延时函数 ...

打印 上一主题 下一主题

主题 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时钟配置:

  1. //设置系统主时钟频率为 32MHZ
  2. void Clock_config_32MHz(void){
  3.   
  4.     CLKCONCMD &= ~0x40;                 //设置系统时钟源为32MHZ晶振
  5.     while(CLKCONSTA & 0x40);           //等待晶振稳定为32M
  6.     CLKCONCMD &= ~0x47;                //设置系统主时钟频率为32MHZ   
  7. }
复制代码
(6) 16Mhz时钟配置:

  1. //设置系统主时钟频率为 16MHZ
  2. void Clock_config_16MHz(void){
  3.   
  4.     CLKCONCMD |= 0x40;             // 设置系统时钟源为 16MHz RCOSC
  5.     while(CLKCONSTA & 0x40);
  6.     CLKCONCMD &= ~0x3F;            // 先清除低6位
  7.     CLKCONCMD |= 0x01;            // 设置定时器tick输出和时钟速度为16MHz
  8. }
复制代码
四、定时器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. /*
  2.   定时器1 精确延时函数
  3.   主频:32MHz
  4. */
  5. void Delay_us(unsigned int us) {
  6.   
  7.     // 寄存器 T1CC0H:T1CC0L 保存的最终计数值
  8.     T1CC0L = 0x20;              // 低八位:0x20 = 32   
  9.     T1CC0H = 0x00;              // 高八位:0x00 = 0 → 组合为0x0020
  10.                                 // 计数值: 0x0020=32
  11.     T1CTL = 0x02;               // 0000 0010 32Mhz  不分频  模模式
  12. //  T1CTL = 0x06;               // 0000 0110 32Mhz  8分频   模模式
  13. //  T1CTL = 0x0A;               // 0000 1010 32Mhz  32分频  模模式
  14. //  T1CTL = 0x0E;               // 0000 1110 32Mhz  128分频 模模式
  15.     while(us)
  16.     {
  17.         while(!((T1CNTL >= 0x20)&&(T1CNTH == 0x00)));
  18.         us--;
  19.     }
  20.     T1CTL = 0x00;               //关闭定时器
  21. }
复制代码
时钟频率32MHz,不分频,最大计数值为32,外层循环控制总的延时微秒数,内层循环等待定时器计数到目标值,每次到达目标值即表现经过1微秒,最后关闭定时器。(1/32000000)*32s=1us
(4)毫秒级延时函数:

  1. void Delay_ms(unsigned int ms) {
  2.     T1CC0L = 0xE8;               // 低八位:  0xE8 = 232        
  3.     T1CC0H = 0x03;               // 高八位:  0x03 = 3 → 组合为0x03E8   
  4.                                  // 计数值: 0x03E8=1000
  5.     T1CTL  = 0x0A;               // 0000 1010 32分频  模模式
  6.     while(ms)
  7.     {
  8.         while(!((T1CNTL >= 0xE8)&&(T1CNTH >= 0x03)));
  9.         ms--;
  10.     }
  11.     T1CTL = 0x00;               //关闭定时器
  12. }
复制代码
时钟频率32MHz,32分频,最大计数值为1000,外层循环控制总的延时微秒数,内层循环等待定时器计数到目标值,每次到达目标值即表现经过1毫秒,最后关闭定时器。(32/32000000)*1000s=1ms。
(5)秒级延时函数:

  1. void Delay_s(unsigned int s) {
  2.   
  3.    
  4.     T1CC0L = 0x24;   // 低八位:0x24 = 36
  5.     T1CC0H = 0xF4;   // 高八位:0xF4 = 244 → 组合为0xF424
  6.                      // 计数值:0xF424 = 62500
  7.     T1CTL = 0x0E;    // 0000 1110 32Mhz  128分频 模模式
  8.     // 将秒数转换为 250ms 的循环次数(s × 4)
  9.     s *= 4;
  10.     while (s--) {
  11.         // 等待定时器计数到62500(250ms)
  12.         while(!((T1CNTL >= 0x24)&&(T1CNTH >= 0xF4)));
  13.     }
  14.     T1CTL = 0x00; // 关闭定时器
  15. }
复制代码
时钟频率32MHz,128分频,最大计数值为1000,外层循环控制总的延时微秒数,内层循环等待定时器计数到目标值,每次到达目标值即表现经过1毫秒,最后关闭定时器。(128/32000000)*62500*4s=1s。
五、延时实现LED闪烁:

  1. #include <ioCC2530.h>
  2. #include "LED.h"
  3. #include "Delay.h"
  4. void main(void) {
  5.     LED_Init();
  6.     Clock_config_32MHz();
  7.     // 主循环  
  8.     while (1) {
  9.       
  10.       Delay_s(1);
  11.       LED_Control(1);
  12.       Delay_s(1);
  13.       LED_Control(0);
  14.       
  15.     }
  16. }
复制代码
    LED定时1s闪烁
  六、代码下载:

代码下载链接


免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

写过一篇

金牌会员
这个人很懒什么都没写!
快速回复 返回顶部 返回列表