影子寄存器(Shadow Register)

STM32 影子寄存器(Shadow Register)是定时器硬件内部真正生效的寄存器,作用是确保时序参数(周期、占空比、分频)在更新时不产生毛刺、不破坏当前周期完整性,实现同步、无抖动的参数切换。

基本结构:预装载 + 影子

STM32 定时器里带 “阴影” 标记的寄存器(ARR、CCR、PSC、RCR)都由两部分组成:

  • 预装载寄存器(Preload Register)
    • 软件直接读写的对象(如 TIMx->ARR、TIMx->CCR1)
    • 你写的值先存在这里,不一定立即生效
  • 影子寄存器(Shadow Register)
    • 硬件内部、用户不可直接访问
    • 真正参与计数、比较、输出的寄存器
    • 只有它的值决定当前定时器行为

核心作用(为什么需要影子)

  1. 保证当前计数周期完整,不被中途截断
    • 计数器正在跑时,你改 ARR/CCR:
      • 无影子:立即改硬件 → 周期突然变短 / 变长、PWM 出现毛刺、尖峰、丢脉冲
      • 有影子:新值暂存预装载,等当前周期结束(更新事件 UEV)才加载到影子 → 平滑切换
  2. 多通道参数同步更新
    • 同时改多个 CCR(多通道 PWM):
      • 软件不可能同一时刻写完所有寄存器
      • 开启预装载 → 所有新值先缓存
      • 一次更新事件 → 所有影子寄存器同时刷新 → 多通道严格同步
  3. 防止运行中修改导致逻辑错乱
    • 避免在计数中途突变阈值,造成:
      • 意外中断 / 溢出
      • 输出波形失真、电机异响、采样错位
      • 时序逻辑不可预知

常见带影子的寄存器(定时器)

  • ARR(自动重装载):决定周期
    • 控制位:TIMx_CR1.ARPE(ARR 预装载使能)
  • CCR(捕获 / 比较):决定 PWM 占空比、比较阈值
    • 控制位:TIMx_CCMRx.OCxPE(通道 x 预装载使能)
  • PSC(预分频器):计数时钟分频
    • 始终带影子,无使能位 → 必须等更新事件才生效
  • RCR(重复计数器):高级定时器,更新事件分频

两种工作模式(以 ARR 为例)

模式 1:立即生效(ARPE=0)

  • 预装载 ↔ 影子直通
  • 写 TIMx->ARR → 立即更新影子
  • 缺点:中途改值易产生波形异常、周期错乱

模式 2:预装载缓冲(ARPE=1,推荐)

  • 写 TIMx->ARR → 只改预装载
  • 更新事件(UEV)到来时:
    • 预装载 → 影子(一次性拷贝)
    • 新值从下一个周期开始生效
      更新事件何时发生
  • 计数器溢出 / 下溢(计数到 0 或 ARR)
  • 软件触发:TIMx->EGR = TIM_EGR_UG

典型应用场景(PWM 动态调参)

  • 电机调速、LED 调光:随时改频率 / 占空比
  • 无影子:改 CCR/ARR → 瞬间突变 → 波形毛刺、电机抖响
  • 有影子(ARPE=1、OCxPE=1):
    • 软件写新值到 TIMx->ARR / TIMx->CCR
    • 等待当前周期结束(UEV)
    • 影子自动更新 → 下一个周期完美切换

一句话总结

影子寄存器 = 硬件级双缓冲:让你在定时器运行时安全修改参数,保证时序干净、周期完整、多通道同步,是 PWM、电机控制、高精度定时必须理解的底层机制。