STM32 使用DMA+PWM输出多路精确时序波形时,如何避免DMA中断与PWM更新事件竞争导致的数据错位?

· 1 浏览

回答(4)

检查DMA的FIFO阈值,若数据量大,可设置FIFO半满中断,提前准备下一批数据,配合双缓冲,彻底避开更新事件竞争。
STM32爱好者 · 2026-08-27
如果多路要求严格同步,可改用TIM1/8的高级定时器,利用其重复计数器和多通道DMA突发,一次传输更新所有CCR,减少错位窗口。
硬件工程师小王 · 2026-08-27
用DMA的循环模式+定时器更新事件触发,但注意DMA传输完成标志可能滞后,建议在DMA中断里用标志位,主循环中同步处理,避免中断里直接改数据。
嵌入式老张 · 2026-08-27
核心思路是让DMA传输与PWM更新事件严格同步,避免在更新事件发生时DMA尚未完成数据传输。推荐使用定时器的DMA突发模式(Burst Mode),将DMA请求绑定到更新事件(UEV),并配置DMA为循环模式,确保每个PWM周期开始前数据已就绪。具体操作:1)设置TIMx_DCR(DMA控制寄存器)的DBL(突发长度)和DBA(基地址),例如DBL=1(仅更新寄存器),DBA指向CCR1;2)配置DMA通道为外设地址固定(&TIMx->CCR1),内存地址递增,数据宽度16位,循环模式;3)在DMA传输完成中断中,仅更新内存缓冲区,不直接操作CCR,避免竞争。若需多路,可扩展DBL至多通道,但需确保内存缓冲区连续。此外,可启用TIMx_CR1的URS位(仅更新中断),减少非必要事件干扰。实测中,若仍出现错位,可增加DMA优先级(高于其他外设),并检查DMA的FIFO配置(建议半满/全满中断配合双缓冲)。
mcuku 阿沐 · 2026-08-27