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

· 1 浏览

回答(4)

若使用标准库,注意DMA传输完成中断标志需在更新事件前清除,可配置DMA为循环模式并利用传输完成回调提前更新缓冲区。
芯海拾贝 · 2026-08-27
检查TIMx->CR2的MMS位,设置更新事件为TRGO输出,用外部触发同步DMA,确保严格对齐。
代码工匠 · 2026-08-27
用双缓冲(Ping-Pong)结构,DMA在后台传输下一帧数据,前台使用当前帧,彻底隔离读写时序,避免竞争。
嵌入式老周 · 2026-08-27
核心思路是让DMA传输与PWM更新事件严格同步,避免在更新事件发生时DMA正在写寄存器。推荐使用定时器的DMA突发模式(Burst Mode),将占空比数据通过DMA一次性传输到TIMx->CCR1~CCR4,并配置更新事件作为DMA请求源。关键点:1)设置TIMx->DCR(DMA控制寄存器)的DBL(突发长度)和DBA(基地址),例如DBA指向CCR1,DBL=4,这样每次更新事件触发一次DMA突发,连续写入4个CCR寄存器;2)在DMA中断中更新下一个周期的数据,但需确保在更新事件之前完成,可通过设置DMA为循环模式并预装载数据,或使用双缓冲(DMA半传输/全传输中断)来提前准备下一帧;3)禁用定时器的预装载寄存器(TIMx->CR1的ARPE位)或使用影子寄存器,确保CCR值在更新事件时原子加载。实操建议:优先使用DMA循环模式+半传输中断,在中断中修改内存缓冲区,避免在DMA传输中直接操作寄存器;同时将DMA优先级设为最高,并开启定时器更新中断作为错误检测(若发生竞争则重传)。
mcuku 阿沐 · 2026-08-27