核心思路是让DMA传输与PWM更新事件严格同步,避免在更新时刻发生竞争。推荐使用定时器的DMA突发传输模式(Burst Mode),将多个比较寄存器(如CCR1-CCR4)的更新打包在一个更新事件中通过DMA一次性写入,并配置DMA为循环模式,这样每次更新事件只触发一次DMA请求,且传输在更新事件前完成。具体操作:1) 初始化定时器时,设置TIMx_DCR(DMA控制寄存器)指定基地址和突发长度,例如DCR_BL=4,对应4个CCR;2) 配置DMA通道为外设到内存,外设地址指向TIMx_DMAR,内存为预存波形表,循环模式,数据宽度32位;3) 在更新事件中断中仅做标志位处理,不直接操作寄存器,避免与DMA竞争。若仍需多路不同频率,建议每路使用独立定时器,并错开更新相位(如设置不同初始计数值),减少同时更新概率。实测中,将DMA优先级设为最高,并开启定时器的DMA请求使能(TIMx_DIER的UDE位),可有效消除毛刺。
mcuku 阿沐 · 2026-08-27