影子寄存器:改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节"基本定时器原理与动态周期控制"。)

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

相关推荐
Discipline~Hai11 分钟前
ARM03-蜂鸣器和中断
c语言·arm开发·单片机·嵌入式硬件·嵌入式
KaifuZeng1 小时前
电源面试问题汇总一
单片机·嵌入式硬件·面试·电路
驱动探索者2 小时前
RISC-V PLIC 深度解析:从 Spec 到 Zephyr 驱动实现
单片机·嵌入式硬件·中断控制器
LCG元3 小时前
STM32 FreeRTOS 实战:任务调度 + 互斥锁 + 消息队列 + 串口命令解析器
stm32·单片机·嵌入式硬件
Hello_Damon_Nikola3 小时前
姿态式饮水量估算从原理到实战
嵌入式硬件
LCG元3 小时前
STM32 SPI Flash 读写实战:W25Q64 驱动 + FatFS 文件系统移植 + 日志存储系统
stm32·单片机·嵌入式硬件
不想学习!!4 小时前
【STM32 基础复习 01】初识 STM32F103ZET6:型号、封装、引脚编号与特殊引脚
stm32·单片机·嵌入式硬件
wuyk5554 小时前
66.嵌入式C语言进阶:共用体(Union)实战指南——单片机内存省一半的神级技巧
c语言·开发语言·stm32·单片机·嵌入式硬件
ACP广源盛139246256737 小时前
此芯 P1 AI BOX / AI NAS@ACP#IX8008、IX8024 应用场景与市场机会
大数据·人工智能·分布式·单片机·嵌入式硬件
广药门徒13 小时前
虚拟机联网20260725
嵌入式硬件