影子寄存器:改ARR下个周期才生效,波形不突变

短文标题:影子寄存器:改ARR下个周期才生效,波形不突变

你有没有想过一个问题:定时器正在输出PWM,突然改了ARR(周期),波形会不会断一下或出现毛刺?取决于ARPE位。 STM32的ARR(自动重装载寄存器)有两层:预装载寄存器 (软件读写)和影子寄存器(硬件使用)。影子寄存器在更新事件发生时从预装载寄存器加载新值。

**ARPE=0:立即生效(可能突变),**ARPE=0时,预装载寄存器直通影子寄存器,写ARR立即生效。计数器正在计数,比如当前值=800,ARR从1000改成500:

  • 800 > 500,计数器永远达不到ARR
  • 一直跑到16位定时器的上限65535才溢出
  • 一个周期变得超级长,波形完全乱掉

这称为"周期突变",可能导致PWM波形畸变、电机抖动。ARPE=1:下个周期生效(平滑过渡),ARPE=1时,预装载寄存器和影子寄存器隔离。修改ARR后,当前周期继续用旧ARR跑,计数到旧ARR值 → 产生更新事件 → 影子寄存器从预装载寄存器加载新ARR → 下个周期用新ARR。

波形连续,无毛刺。更新事件的发生时刻更新事件由硬件在计数器溢出(向上计数:从ARR→0;向下计数:从0→ARR)时自动产生,也可由软件设置UG位强制产生。设置UG位后:

  • 影子寄存器立即更新(ARR、PSC、CCR预装载值全部加载)
  • 计数器立即归零(如果设置了URS位,不触发更新中断,但仍更新影子寄存器)

重要:ARPE保护的是影子寄存器的更新时机,不是更新事件本身。 即使ARPE=1,软件写UG位仍会强制立即更新。配置方法

TIM2->CR1 |= TIM_CR1_ARPE; // 使能预装载,ARPE=1(默认0)

TIM2->ARR = 2000; // 修改ARR,下个周期生效

电机控制、PWM调光等需要连续波形的场合,必须设ARPE=1。PSC也一样,预分频器(PSC)也有影子寄存器,修改PSC后也是在下一次更新事件时才生效。所有会影响计数频率的寄存器,都有这种"缓冲"设计。

这个故事的启示, ARPE不是"延迟",是"优雅交接"。让新ARR在更新事件时生效,而不是在周期中间"野蛮插入"。波形平滑,电机不抖,PWM不毛刺。写在最后, 动态改变定时器周期或占空比时,设ARPE=1。不设,可能周期突变;设了,平滑过渡。一个bit,决定波形质量。


(本文灵感源于于振南《新概念ARM32单片机》教程第6.4节"基本定时器原理与动态周期控制"。)

觉得有用?点赞、转发,让更多人知道"影子寄存器"防突变的作用。

相关推荐
电气_空空4 分钟前
基于 LabVIEW 的深海气密采水器测控系统
单片机·嵌入式硬件·毕业设计·labview
星夜夏空9935 分钟前
STM32单片机学习(37) —— PWR和BKP
stm32·单片机·学习
牛牛,牛44 分钟前
榨干最后一微安:STM32 的低功耗设计与中断唤醒机制深度剖析
单片机·嵌入式硬件
暮云星影1 小时前
全志linux开发屏幕适配(二)`HDMI`驱动适配说明
linux·arm开发·驱动开发
星华云1 小时前
[STM32] SAR型ADC(逐次逼近型ADC)工作原理简介
stm32·单片机·嵌入式硬件
暮云星影2 小时前
瑞芯微rk3566开发FIT Secure Boot
linux·arm开发·驱动开发·安全
小娄~~2 小时前
时钟控制器原理
单片机·嵌入式硬件
望眼欲穿的程序猿2 小时前
按键控制 LED
嵌入式硬件·rust
天天爱吃肉82183 小时前
豆包 vs DeepSeek API 对比分析报告
android·java·大数据·开发语言·功能测试·嵌入式硬件·汽车
我命由我123454 小时前
RFID 技术极简理解
java·c语言·c++·嵌入式硬件·物联网·visualstudio·java-ee