07 定时器
定时器资源
CC2530 有四个定时器 TIM1~TIM4 和休眠定时器
TIM1
定时器 1 是一个独立的 16 位定时器,支持典型的定时 / 计数功能,比如输入捕获,输出比较和 PWM 功能。定时器有五个独立的捕获 / 比较通道。每个通道定时器使用一个 I/O 引脚。定时器用于范围广泛的控制和测量应用,可用的五个通道的正计数 / 倒计数模式将允许诸如电机控制应用的实现
- 五个捕获 / 比较通道
- 上升沿、下降沿或任何边沿的输入捕获
- 设置、清除或切换输出比较
- 自由运行、模或正计数 / 倒计数操作
- 可被 1,8,32 或 128 整除的时钟分频器
- 在每个捕获 / 比较和最终计数上生成中断请求
- DMA 触发功能
TIM3 和 TIM4
定时器 3 和 4 是两个 8 位的定时器。每个定时器有两个独立的比较通道,每个通道上使用一个 I/O 引脚。
- 两个捕获 / 比较通道
- 设置、清除或切换输出比较
- 时钟分频器,可以被 1,2,4,8,16,32,64,128 整除
- 在每次捕获 / 比较和最终计数事件发生时产生中断请求
- DMA 触发功能
TIM2 和休眠定时器
定时器 2 主要用于为 802.15.4 CSMA-CA 算法提供定时,以及为 802.15.4 MAC 层提供一般的计时功能。当定时器 2 和休眠定时器一起使用时, 即使系统进入低功耗模式也会提供定时功能。定时器运行在 CLKCONSTA.CLKSPD 指明的速度上。如果定时器 2 和睡眠定时器一起使用,时钟速度必须设置为 32 MHz,且必须使用一个外部 32 kHz XOSC 获得精确结果。
- 16 位定时器正计数提供的符号 / 帧周期,例如:16μs/320μs
- 可变周期可精确到 31.25ns
- 2×16 位定时器比较功能
- 24 位溢出计数
- 2×24 位溢出计数比较功能
- 帧首定界符捕捉功能
- 定时器启动 / 停止同步于外部 32kHz 时钟以及由睡眼定时器提供定时
- 比较和溢出产生中断
- 具有 DMA 触发功能
- 通过引入延迟可调整定时器值
定时器触发方式
基础知识
定时器基础理论
(1)系统时钟频率
时钟发生器会以恒定的时间间隔产生脉冲,这个间歇性的脉冲可以形象理解为芯片的心跳,时钟频率则是用来描述这个心跳的速率。大家通常用 1s 内时钟发生器产生的脉冲数量来描述时钟频率,例如 “时钟频率 10 MHz” 表示 1s 内的心跳次数为 10 000 000 次。CC2530 有两种时钟频率可供开发者使用:32MHz 和 16MHz。
(2)分频系数
分频是指将时钟频率降低为原来的 1/N,也称为 N 分频。比如当时钟频率是 16MHz 的时候,那么 2 分频是 8MHz。分频系数则是用 1/N 来表示,比如 2 分频的分频系数为:1/2。
(3)系统时钟周期
周期和频率的关系可以用公式表示: T = 1 /f,其中 T 为时钟周期,f 为时钟频率。时钟周期和时钟频率成倒数关系。举个例子说明一下,时钟频率为 16MHz 时表示在 1s 内时钟发生器可以产生 16 000 000 个脉冲,而时钟周期则可以表示产生一个脉冲所需要的时间,即 1 / 160 000 00s。
(4)计数器
计数器是定时器的核心,用于记录时钟发生器产生的脉冲数量。由于脉冲的时钟周期是恒定的,因此计算定时时间的公式是:t=nT,其中 t 为定时时间,n 为计数次数,T 为时钟周期
(5)溢出
由于计数器的范围是有限的,当计数次数超过最大值时就会产生溢出。例如当计数器的大小是 16 位时,那么计数范围是 0~65535,因此计数次数超过 65535 后计数器就会产生溢出。在产生溢出后,计算器的值会从最大值变为 0。
定时原理
利用公式对频率和周期的关系作进一步的解释。我们利用 f 表示时钟频率,T 来表示时钟周期,那么可以用此关系式来表示它们的关系:
- T = 1 / f (1)
我们计时 t 秒后,假设此时计数器从 0 开始计数了 N 次(假设此时计数器没有溢出)。前面已经讲解过,时钟周期 T 表示心跳 1 次所需要时间,因此 t 与 N 的关系如下:
- t = N × T (2)
接着,我们可以推导出:
- N = t / T (3)
CC2530 的默认系统时钟频率是 16MHz(16000000Hz),其定时器 1 使用 128 分频,因此定时器的时钟频率是 16000000 / 128 Hz。
- 根据公式(1)T = 1 /f 可以算出定时器 1 时钟周期为 T = 128/16000000 秒。
- 在定时 5 秒的情况下(即 t=5 秒),根据公式(2)N = t / T,计数器的计数值 N = 5 / (128/16000000) = 625000。
处理溢出
当定时器溢出时会发生中断,此时寄存器 IRCON 的 Bit1 位会由原先的 0 被设置为 1,因此我们只需要检测这个标志位即可判断是否发生了溢出,定时器 1 是一个 16 位定时器,每溢出一次计数 65536 次,所以定时 5 秒后将会溢出: 625000 / 65536 = 9.54,取整数,即 9 次。反过来,如果溢出了 9 次,我们可以大约第认为时间过了 5 秒。
查询触发(以 TIM1 为例)
实现代码
1 |
|
相关寄存器
T1CTL 定时器 1 控制寄存器
T1STAT 定时器 1 状态寄存器
中断标志寄存器
中断触发(以 TIM3 为例)
实现代码
1 |
|