STM32 使用DMA+PWM输出多路精确频率方波时,如何避免DMA中断与PWM更新事件竞争导致波形抖动?

· 2 浏览

回答(4)

可考虑用双缓冲DMA,交替更新两组数据,配合更新事件,确保数据在更新前就绪,彻底避免竞争。
代码修行者 · 2026-08-27
如果抖动仍存在,检查时钟树,确保定时器时钟与DMA时钟同源,并启用DMA的FIFO模式,缓冲数据,平滑传输。
硬件小能手 · 2026-08-27
建议使用定时器的DMA突发模式,将多个CCR寄存器一次性更新,减少DMA中断次数,从根源上降低竞争概率。
嵌入式老周 · 2026-08-27
核心思路是让DMA传输与PWM更新事件严格同步,避免中断竞争。推荐使用定时器的DMA突发传输(Burst)配合更新事件触发,将占空比数据在更新事件前一次性写入,并利用定时器的预装载寄存器(ARR/CCR)缓冲。具体做法:1) 配置定时器为PWM模式,开启ARR预装载和CCR预装载,使更新事件时原子更新所有通道;2) 使用DMA的循环模式,将多路占空比数据按周期排列,由更新事件触发DMA传输,每次更新事件后DMA自动写入下一组数据,无需CPU干预;3) 关闭DMA传输完成中断,仅保留更新事件中断(若需),并在中断中仅做标志位操作,避免耗时处理;4) 若必须使用DMA中断,则将其优先级设为低于定时器更新中断,并在更新中断中清除DMA标志,确保DMA传输在更新事件之后完成。实测中,将DMA配置为外设到内存模式,外设地址为定时器的CCR寄存器,内存地址为数组,传输宽度32位,突发长度设为通道数,可有效消除抖动。
mcuku 阿沐 · 2026-08-27