在STM32定时器的学习和应用过程中,“预装”是一个非常重要而关键的概念。它看起来只是某些寄存器“是否立即生效”,但本质上,它体现的是STM32定时器内部一种非常重要的设计思想:将“软件写入”与“硬件实际生效”分离,并通过特定事件在合适时机完成同步更新。
这一机制广泛用于PWM输出、周期更新、比较值更新以及高级定时器中的换相控制。理解它,不仅有助于正确使用ARR、CCR、PSC等常见寄存器,也有助于澄清高级定时器中COM event、CCxE、OCxM等控制位更新的工作方式。
本文将围绕STM32定时器中的预装机制进行整理。
一、什么是预装机制
从直观上理解,预装可以看成“先写进去,但不立即使用”。在不支持预装的情况下,软件写入某个寄存器后,新值会立即进入当前运行逻辑;而在支持预装的情况下,软件写入的新值会先进入一个预装层,只有等到某个规定事件发生时,才会被转移到真正参与定时器运行的活动层。
因此,预装机制可以抽象成如下过程:
新值进入预装寄存器;
某个同步事件到来;
新值被装载到实际寄存器;
定时器后续运行按新值执行。
这种设计的核心价值在于:
避免运行中途修改参数导致波形突变;
保证多个相关配置在同一时刻切换;
消除寄存器逐项修改带来的中间态问题;
为 PWM更新、电机换相等场景提供硬件同步保障。
二、STM32定时器预装机制的整体分类
STM32定时器中的预装机制大致可以分为两类:数值类寄存器的预装 和 控制位类的预装虽然它们都属于“预装”,但适用对象、触发事件和应用场景并不相同。
三、数值类寄存器的预装
数值类寄存器主要承载定时器运行中的参数值,例如周期、分频系数、比较值等,包括: PSC:计数时钟分频RCR:重复计数更新节奏ARR:自动重装值,即计数周期边界CCRx:比较值,直接决定输出比较时刻或PWM占空比数值类寄存器的预装机制,主要用于保证这些参数在更新时的连续性与可预测性。
3.1固定预装型寄存器
在数值类寄存器中,有一部分寄存器的预装机制是固定存在的,不能关闭,典型是PSC 和 RCR 。
3.1.1 PSC预分频寄存器
PSC用于对定时器时钟进行分频。当软件修改PSC后,新值不会立即进入正在运行的分频链路,而是必须等待一次更新事件(UEV),之后新的分频值才会真正生效。这意味着,PSC的更新天然具有“延迟到更新事件生效”的特点。
3.1.2 RCR重复计数寄存器
RCR通常存在于高级定时器中,用于控制若干个计数周期之后才产生一次更新事件。与PSC类似,RCR的新值也不是写入后立即作用于当前运行过程,而是依附于更新机制,在发生更新事件时加载生效。这一类寄存器可以统一概括为:固定预装型寄存器:写入新值后必须依赖更新事件才能生效。
3.2 可选预装型寄存器
另一类数值型寄存器支持“是否使用预装”这一行为由软件配置决定,典型是ARR 和 CCRx。
3.2.1 ARR自动重装寄存器
ARR决定定时器的周期边界。它的预装功能由CR1.ARPE控制:ARPE = 1:启用预装;
ARPE = 0:关闭预装当ARPE = 1时,软件写入的新ARR值不会立刻改变当前周期,而是先进入预装层,等到下一次更新事件到来时,才装载到实际寄存器。
当ARPE = 0时,新的ARR值会直接进入活动逻辑。此时如果定时器正在运行,周期边界可能在当前计数过程中就受到影响。因此,对ARR而言:开启预装更适合稳定而连续的PWM周期更新,避免产生异样的过渡波形;关闭预装则意味着新周期参数写入后即可直接参与当前运行。
3.2.2 CCRx捕获比较寄存器
CCRx决定比较匹配位置,对PWM模式而言,它直接决定占空比。其预装功能由对应通道的OCxPE控制:OCxPE = 1:启用预装; OCxPE = 0:关闭预装当OCxPE = 1时,新比较值要等更新事件到来时才装入实际比较寄存器,因此占空比通常会在PWM周期边界上平滑变更。
当OCxPE = 0时,新值直接进入当前比较逻辑,有可能在当前PWM周期内部立即影响输出波形。这也是为什么在实际PWM应用中,如果直接修改CCR而没有启用预装,常常会看到占空比边沿“瞬间跳动”或当前周期表现不连续的情形。
3.3 数值类寄存器预装总结

四、控制位类的预装
除了数值类寄存器,STM32高级定时器还支持对某些输出控制位进行预装。它的重点不在于“占空比什么时候变”,而在于“输出结构/模式什么时候同步切换”。支持预装的典型控制位主要包括:CCxE:通道输出使能位CCxNE:互补通道输出使能位OCxM:输出比较模式位这些位决定的不是简单的数值,而是:定时器通道输出是否启用;当前采用的OC输出模式是否生效。换句话说,这些位改变的是输出行为和模式。
4.1 为什么控制位也需要预装
在高级定时器中,尤其是电机控制、三相桥驱动、互补PWM场景下,如果在定时器运行过程中直接逐项修改CCxE、CCxNE、OCxM,可能会产生以下问题:不同控制位生效时刻不一致;输出切换出现中间态;导通关系短暂错误;换相点出现毛刺或异常波形。因此STM32高级定时器提供了控制位预装机制,使软件可以: 先写好下一步的输出使能和输出模式; 等待一次统一的同步事件; 再由硬件一次性装载到活动控制逻辑。从而实现真正意义上的同步切换。
4.2 控制位预装与COM事件
与数值类寄存器通常依赖更新事件不同,控制位类预装主要依赖换相事件。数值寄存器多在“周期/时间段更新点”生效;控制位多在“换相切换点”生效。在换相控制中,往往需要在某个确切时刻,把新的输出模式和导通关系整体切换到位,而不是在软件逐项写寄存器时零散生效。
4.3 相关控制寄存器
控制位预装主要涉及以下寄存器位:TIMx_CR2.CCPC:是否启用位预装功能;TIMx_CR2.CCUS:控制COM更新请求来源;TIMx_EGR.COMG:软件触发一次COM事件;TIMx_SR.COMIF:COM事件标志;TIMx_DIER.COMIE:COM中断使能。这些机制通常存在于支持互补输出的高级定时器中,例如TIM1和TIM8。
五、Update Event与COM Event的分工
STM32定时器中两类预装机制有时可能容易让人混淆,很大程度上是因为都涉及“某个事件到来后才生效”。但从职责上看,二者分工非常清晰。
5.1 Update Event(更新事件)
主要负责数值类预装寄存器内容到实际寄存器的装载,可以把它理解为在定时器的周期边界时刻,同步完成参数值更新。
5.2 COM Event(换相事件)
COM event主要负责部分输出控制位的装载,可以把它理解为在换相点或指定时刻,同步完成输出结构/模式的切换。
六、两类预装机制的对比
七、从整体上理解STM32的预装设计
从实现方式上看,STM32定时器中的预装机制虽然分散在不同寄存器与事件中,但本质上都体现了同一种设计思想:不让软件写入直接破坏当前正在运行的时序,而是通过预装层和同步事件,在可控时刻完成更新。对于波形参数,这个“可控时刻”往往是更新事件;对于输出模式,这个“可控时刻”则往往是换相事件。
可以说,STM32定时器中的预装并不是一个单独功能点,而是一整套围绕“同步更新”建立起来的硬件机制,实现写入与生效分离、通过事件同步装载之目的。
169