stm32重要概念
影子寄存器(Shadow Register)
STM32 影子寄存器(Shadow Register)是定时器硬件内部真正生效的寄存器,作用是确保时序参数(周期、占空比、分频)在更新时不产生毛刺、不破坏当前周期完整性,实现同步、无抖动的参数切换。
基本结构:预装载 + 影子
STM32 定时器里带 “阴影” 标记的寄存器(ARR、CCR、PSC、RCR)都由两部分组成:
- 预装载寄存器(Preload Register)
- 软件直接读写的对象(如 TIMx->ARR、TIMx->CCR1)
- 你写的值先存在这里,不一定立即生效
- 影子寄存器(Shadow Register)
- 硬件内部、用户不可直接访问
- 真正参与计数、比较、输出的寄存器
- 只有它的值决定当前定时器行为
核心作用(为什么需要影子)
- 保证当前计数周期完整,不被中途截断
- 计数器正在跑时,你改 ARR/CCR:
- 无影子:立即改硬件 → 周期突然变短 / 变长、PWM 出现毛刺、尖峰、丢脉冲
- 有影子:新值暂存预装载,等当前周期结束(更新事件 UEV)才加载到影子 → 平滑切换
- 计数器正在跑时,你改 ARR/CCR:
- 多通道参数同步更新
- 同时改多个 CCR(多通道 PWM):
- 软件不可能同一时刻写完所有寄存器
- 开启预装载 → 所有新值先缓存
- 一次更新事件 → 所有影子寄存器同时刷新 → 多通道严格同步
- 同时改多个 CCR(多通道 PWM):
- 防止运行中修改导致逻辑错乱
- 避免在计数中途突变阈值,造成:
- 意外中断 / 溢出
- 输出波形失真、电机异响、采样错位
- 时序逻辑不可预知
- 避免在计数中途突变阈值,造成:
常见带影子的寄存器(定时器)
- 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、电机控制、高精度定时必须理解的底层机制。
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来源 shaplus's blog!
评论