定时器类型
Author:余生
核心底层组件回顾
在深入分类之前,先明确所有定时器共有的核心硬件模块:
- 时钟源选择逻辑:决定定时器使用哪个时钟(内部时钟、外部时钟、另一个定时器的输出等)。
- 预分频器 (PSC):一个 16 位可编程分频器,对输入时钟进行分频,产生计数器的时钟
CK_CNT
。 - 计数器 (CNT):一个 16 位(或 32 位,如 TIM2, TIM5)的向上 / 向下 / 中央对齐计数器。其时钟为
CK_CNT
。 - 自动重装载寄存器 (ARR):一个 16 位(或 32 位)寄存器,存储计数器的上限值。当 CNT 达到 ARR 时发生溢出。
- 更新事件 (UEV):当 CNT 发生溢出(或因软件 / 事件强制更新)时产生的事件。这是定时器最基础的事件。
- 更新中断 / DMA 请求:更新事件可以触发中断或 DMA 请求。
- 控制寄存器 (CR1, CR2, SMCR, DIER, EGR, CCMR, CCER, CNT, PSC, ARR, CCRx, DCR, DMAR 等):通过配置这些寄存器来控制定时器的行为。
现在,我们看它们如何组合成不同类型的定时器。
1. 基本定时器 (Basic Timer) - 以 TIM6/TIM7 为例
定位:功能最简单,成本最低,专为提供周期性更新事件而设计。常用于为 DAC 提供触发时钟,或作为简单的延时 / 中断源。
底层结构与关键特征
- 时钟源:仅支持内部时钟 (
CK_INT
)。没有外部时钟输入引脚或复杂的时钟选择逻辑。 - 计数器 (CNT):16 位向上计数器。不支持向下或中央对齐模式。
- 预分频器 (PSC):16 位可编程分频器。
- 自动重装载 (ARR):16 位寄存器。
- 核心功能模块:
- 更新事件 (UEV):当 CNT 从 ARR 溢出回 0 时产生。
- 更新中断 (UIF):UEV 可触发中断。
- DMA 请求:UEV 可触发 DMA 请求。
- 主模式 (Master Mode):可以将更新事件作为触发输出 (TRGO) 信号,去触发其他外设(如 ADC、DAC、其他定时器)。这是其一个重要用途。
- 缺失的功能:
- 无 GPIO 引脚:基本定时器 没有 与 GPIO 复用的通道。它不能直接输出任何信号到芯片引脚。
- 无输入捕获 / 输出比较单元:没有 CCRx 寄存器,没有捕获 / 比较通道逻辑。
- 无编码器接口。
- 无死区时间生成。
- 总结:就是一个 “纯” 计数器,产生周期性的 “滴答”(更新事件),并通过中断、DMA 或 TRGO 信号通知系统其他部分。 纯软件定时,无 IO 交互 。
2. 通用定时器 (General-Purpose Timer) - 以 TIM2, TIM3, TIM4, TIM5 为例
定位:功能全面,应用最广泛。在基本定时器的基础上,增加了与外部世界交互的能力。
通用定时器之所以 “通用”,其核心在于每个通道(CH1-CH4)都配备了一个高度可配置的数字协处理器 —— 捕获 / 比较单元 (Capture/Compare Unit)。它通过同一套硬件,在 “输入” 和 “输出” 两种截然不同的功能间无缝切换,实现了 “一物多用”。
- 捕获 (Capture) - “记录时间”:
- 目标:在外部事件(如引脚电平变化)发生的精确瞬间,将当前计数器 (CNT) 的值锁存到一个寄存器中。
- 应用:测量脉冲宽度、频率,记录事件发生的时间戳。
- 比较 (Compare) - “精确控制时间”:
- 目标:将计数器 (CNT) 的当前值与一个预设值 (CCR) 进行比较,当两者相等时,硬件自动执行一个预定义的动作(如翻转 IO、置高、置低)。
- 应用:生成精确的 PWM 信号、在特定时间点翻转 GPIO、实现周期性任务。
理解这个单元的底层结构,是掌握通用定时器强大功能的关键。
底层硬件模块详解:捕获 / 比较单元的解剖
一个通用定时器的每个通道(CH1-CH4)都包含一套独立的捕获 / 比较单元。其核心由以下几个部分组成,信号流从 GPIO 引脚流向定时器内部逻辑。
1. 输入滤波与边沿检测 (Input Filter & Edge Detector) - “信号净化站”
位置:位于通道的最前端,直接连接到复用的 GPIO 引脚。
功能:
- 滤波 (Filter):GPIO 引脚的信号常伴有毛刺(噪声)。滤波器是一个数字低通滤波器,通过
CCMRx
寄存器中的ICxF
位配置。- 原理:它要求输入信号在连续
N
个f_DTS
时钟周期内都保持稳定,才认为是一次有效的电平变化。f_DTS
是由定时器时钟分频得到的采样时钟(可通过CCMRx
的ICxF
和ICPSC
位配置分频比)。 - 目的:消除高频噪声,防止误触发,确保捕获的边沿是真实的。
- 原理:它要求输入信号在连续
- 边沿检测 (Edge Detection):滤波后的信号进入边沿检测电路。通过
CCER
寄存器中的CCxP
位(有时结合CCMRx
)选择检测上升沿、下降沿或双边沿。
- 滤波 (Filter):GPIO 引脚的信号常伴有毛刺(噪声)。滤波器是一个数字低通滤波器,通过
输出:产生一个干净的、代表有效边沿的窄脉冲信号
TIxFPx
。这个脉冲通常只有一个CK_INT
时钟周期宽,是触发后续动作的 “火药引信”。
2. 捕获 / 比较寄存器 (Capture/Compare Register - CCRx) - “双缓冲存储器”
- 位置:核心存储单元。
- 功能:这是一个双缓冲 (Double-Buffered) 的 16 位(或 32 位,如 TIM2/TIM5)寄存器,由两个物理寄存器构成:
- 预装载寄存器 (Preload Register):程序员直接写入或读取的寄存器。你在代码中调用
__HAL_TIM_SET_COMPARE(&htim, TIM_CHANNEL_1, 1000);
时,操作的就是这个寄存器。 - 影子寄存器 (Shadow Register):真正连接到比较逻辑的寄存器,其值决定硬件行为。
- 预装载寄存器 (Preload Register):程序员直接写入或读取的寄存器。你在代码中调用
- 工作原理:影子寄存器的更新时机由
CCMRx
寄存器中的OCxPE
(Output Compare Preload Enable) 位控制:OCxPE = 0
(禁止预装载):预装载寄存器的值会立即复制到影子寄存器。不推荐用于 PWM,因为可能在 PWM 周期中间改变占空比,导致产生非预期的窄脉冲。OCxPE = 1
(使能预装载):预装载寄存器的值会在下一个更新事件 (UEV) 发生时(即 CNT 溢出时),才被复制到影子寄存器。这保证了 PWM 参数的改变是同步的,避免了异常波形,是生成稳定 PWM 的关键。
3. 比较器 (Comparator) - “数字判官”
- 位置:连接计数器 (CNT) 和 CCRx 影子寄存器。
- 功能:这是一个简单的数字比较电路。
- 它持续地、并行地比较计数器 (CNT) 的当前值和 CCRx 影子寄存器的值。
- 输出:当
CNT == CCRx
时,输出一个高电平的比较匹配信号 (Compare Match)。这个信号在整个CNT == CCRx
的时钟周期内都有效。
4. 捕获 / 比较控制逻辑 (Capture/Compare Control Logic) - “中央大脑”
- 位置:协调所有模块的中央控制单元。其行为由
CCMRx
和CCER
寄存器的配置决定。 - 功能:这是一个状态机,根据
CCMRx
中的CCxS
(Capture/Compare Selection)位决定通道的工作模式。- A. 输入模式 (Input Capture Mode) -
CCxS[1:0] != 00
- 信号路径:
TIxFPx
(来自滤波 / 边沿检测) -> 控制逻辑。 - 动作:当
TIxFPx
脉冲到来时(代表有效边沿),控制逻辑立即执行:- 将当前计数器 (CNT) 的值锁存(复制)到 CCRx 影子寄存器中。
- 置位捕获 / 比较标志位 (CCxIF) 在
SR
(Status Register) 寄存器中。 - (如果使能)触发捕获 / 比较中断。
- (如果使能)触发 DMA 请求。
- 关键点:此时
CCRx
被用作 捕获寄存器 ,存储的是事件发生时的时间戳(CNT 值)。
- 信号路径:
- B. 输出模式 (Output Compare Mode) -
CCxS[1:0] = 00
- 信号路径:
CNT
和CCRx
(影子寄存器) -> 比较器 ->Compare Match
信号 -> 控制逻辑。 - 动作:当
Compare Match
信号有效时(CNT == CCRx
),控制逻辑根据CCMRx
中的OCxM[2:0]
(Output Compare Mode)位执行预定义的动作:- Toggle:翻转输出引脚的电平。
- Active/High:将输出引脚置为高电平(有效电平)。
- Inactive/Low:将输出引脚置为低电平(无效电平)。
- Forced Active/Inactive:强制输出,不依赖比较。
- PWM Mode 1/2:这是最复杂的模式,不仅依赖
CNT == CCRx
,还依赖CNT == 0
(或CNT == ARR
,取决于计数方向)和更新事件来改变输出。控制逻辑内部有更复杂的逻辑来实现 PWM 波形。
- 关键点:此时
CCRx
被用作 比较寄存器 ,存储的是一个预设的时间点或占空比值。
- 信号路径:
- A. 输入模式 (Input Capture Mode) -
5. 输出控制与极性 (Output Control & Polarity) - “最终执行者”
- 位置:通道的最后阶段,连接到 GPIO 的复用功能控制器。
- 功能:
- 极性控制:通过
CCER
寄存器中的CCxP
位,可以反转最终输出到 GPIO 引脚的信号极性。CCxP = 0
:正常极性(如 PWM 模式 1 中,CNT < CCRx
时输出高电平)。CCxP = 1
:反向极性(CNT < CCRx
时输出低电平)。
- 使能控制:通过
CCER
寄存器中的CCxE
位,可以打开或关闭该通道的输出功能。 - 最终输出信号 (OCxREF / OCx):控制逻辑产生的原始信号(
OCxREF
)经过极性控制后,变成最终的OCx
信号,送到 GPIO 引脚。
- 极性控制:通过
完整的信号流示例
场景 1:输入捕获 - 测量 **** 脉冲宽度
- 外部信号(待测脉冲) -> GPIO 引脚 -> 复用到 TIMx_CH1。
- 信号进入 输入滤波与边沿检测 -> 产生干净的
TIxFP1
脉冲(上升沿)。 TIxFP1
脉冲触发 捕获 / 比较控制逻辑 。- 控制逻辑立即将 当前 CNT 的值 (例如
5000
)锁存到 CCR1 影子寄存器 。 - 控制逻辑置位
SR
寄存器中的CC1IF
标志位。 - (如果使能)CPU 收到中断,执行 ISR。
- ISR 中读取
CCR1
的值,得到第一个边沿的时间戳T1 = 5000
。 - 稍后,下降沿的
TIxFP1
脉冲到来,重复步骤 4-7,得到T2 = 8000
。 - 脉冲宽度
= (T2 - T1) * T_tick
。
场景 2:输出比较 - PWM**** 输出
- 程序员设置
ARR = 999
(周期 1000 个滴答),CCR1 = 250
(占空比 25%),OC1PE = 1
(使能预装载)。 - 计数器
CNT
从 0 开始向上计数。 CNT
和CCR1
(影子寄存器) 的值持续输入 比较器 。- 当
CNT == 0
(周期开始):根据 PWM 模式 1, 控制逻辑 将OC1REF
设为 高电平 。 CNT
继续增加。- 当
CNT == 250
(CCR1
的值): 比较匹配 发生。 控制逻辑 将OC1REF
设为 低电平 。 CNT
继续增加到999
。- 当
CNT == 999
:发生 更新事件 (UEV) 。CNT
清零,同时CCR1
预装载寄存器的值(如果已更改)被复制到影子寄存器。 - 下一个周期开始,重复步骤 4-8,产生稳定的 PWM 波。
总结:通用定时器的底层优势
STM32 通用定时器的强大和灵活,源于其捕获 / 比较单元的精巧设计:
- 双模式切换:通过
CCMRx
寄存器,同一套硬件可在 “记录时间”(捕获)和 “ 精确控制时间 ”(比较 / PWM)间切换。 - 双缓冲机制:
CCRx
的预装载 / 影子结构,确保了参数更新的 原子性 和 同步性 ,是生成稳定 PWM 的基石。 - 硬件自动化:从检测边沿、锁存 CNT 值,到比较、翻转 IO,全过程由硬件自动完成, 不消耗 CPU 周期 ,精度达时钟周期级别。
- 灵活配置:通过
CCMRx
、CCER
等寄存器,可精细控制滤波、边沿、模式、极性、使能等所有行为。 - 扩展功能:支持 外部时钟源 和 编码器接口模式 ,能适应更复杂的测量和控制场景。
理解了这些底层硬件模块如何协同工作,你就真正掌握了通用定时器的 “灵魂”,能够自信地利用它完成各种高精度的嵌入式任务。
3. 高级定时器 (Advanced-Control Timer) - 以 TIM1, TIM8 为例(目前大概知道就行)
定位:功能最强大、最复杂,专为需要 高精度、高可靠性 的复杂控制应用设计,特别是 三相电机控制 (如 FOC)和 数字电源 。
底层结构与关键特征(在通用定时器基础上增加)
- 所有通用定时器的功能:支持内部 / 外部时钟、向上 / 下 / 中央对齐计数、4 个捕获 / 比较通道(CH1-CH4)、输入捕获、输出比较、PWM、编码器接口等。
- 核心新增功能模块:
- 互补通道 (Complementary Channels):
- 除了 CH1-CH4,还有 CH1N, CH2N, CH3N, CH4N。
- 这些是互补输出,即当 CHx 输出高电平时,CHxN 输出低电平,反之亦然。
- 用于驱动 H 桥电路的上桥臂和下桥臂,防止直通(Shoot-Through)。
- 死区时间生成 (Dead-Time Generation):
- 这是高级定时器的标志性功能。
- 在 CHx 和 CHxN 的切换过程中,硬件自动插入一段死区时间 (Dead Time)。
- 在这段死区时间内,CHx 和 CHxN 都输出为无效电平(通常是低电平,通过
BDTR
寄存器的MOE
和OSSI/OSSR
控制)。 - 目的:确保在 H 桥中,当一个桥臂的 MOSFET 完全关断后,另一个桥臂的 MOSFET 才导通,防止电源短路。
- 死区时间通过
BDTR
寄存器中的DTG[7:0]
位精确配置(通常为纳秒级)。
- 刹车 (Break) 功能:
- 一个紧急停机机制。
- 通过
BKIN
引脚(或软件)输入一个高优先级的刹车信号。 - 硬件立即(通常在一个时钟周期内)响应,根据
BDTR
寄存器的配置:- 将所有输出通道(CHx 和 CHxN)强制设置为预定义的安全状态(如高阻、低电平、高电平)。
- 清除计数器。
- 可选地触发刹车中断。
- 用于电机过流、过压、过热等故障保护。
- 重复计数器 (Repetition Counter, RCR):
- 一个 8 位计数器。
- 更新事件(UEV)不是每次溢出都发生,而是每经过
RCR + 1
次溢出才发生一次。 - 目的:实现更长的延迟或更低的中断频率,同时保持计数器的高分辨率。
- 高级控制寄存器 (BDTR - Break and Dead-Time Register):
- 集中控制刹车、死区、主输出使能 (
MOE
)、OSSR/OSSI 等高级功能。
- 集中控制刹车、死区、主输出使能 (
- 更复杂的主 / 从模式:支持更灵活的定时器同步和联动。
- 更高的计数频率:通常能运行在更高的 APB 时钟频率下。
- 互补通道 (Complementary Channels):
- 总结:高级定时器 = 通用定时器 + 互补输出 (CHxN) + 死区时间生成 + 硬件刹车 (Break) + 重复计数器 (RCR)。专为高可靠性、高效率的功率电子控制而生。
对比总结表
特性 | 基本定时器 (TIM6/7) | 通用定时器 (TIM2-5, 9-14) | 高级定时器 (TIM1/8) |
---|---|---|---|
主要用途 | 延时、DAC/ADC 触发 | 通用测量、控制、PWM | 电机控制、数字电源 |
GPIO**** 通道 | 无 | 4 个 (CH1-CH4) | 6 个 (CH1-CH4, CH1N-CH3N) |
互补输出 (CHxN) | 无 | 无 | 有 |
死区时间生成 | 无 | 无 | 有 |
硬件刹车 (Break) | 无 | 无 | 有 |
重复计数器 (RCR) | 无 | 无 | 有 |
编码器 **** 接口 | 无 | 有 | 有 |
外部时钟模式 | 有限 / 无 | 有 | 有 |
计数器位数 | 16 位 | 16 位 或 32 位 | 16 位 |
复杂度与成本 | 最低 | 中等 | 最高 |
通过理解这些底层硬件模块的差异,你就能根据项目需求(是简单延时、测速、调光,还是控制电机)精准地选择最合适的定时器,并高效地配置其寄存器来实现功能。