STM32 使用DMA+PWM输出多路精确脉冲序列时,如何避免DMA中断与PWM更新事件竞争导致波形丢步?

· 2 浏览

回答(4)

另一种思路:若使用STM32的TIMx_DMA请求,可配置为更新事件触发,但需注意DMA的优先级设置,确保DMA请求优先于其他外设,同时关闭DMA的FIFO错误中断,防止误触发。
硬件调试员 · 2026-09-03
建议:将DMA中断服务函数写得极简,只做标志位和指针更新,实际数据计算放在主循环或低优先级任务中,避免在中断里做复杂运算导致延迟。
嵌入式小飞侠 · 2026-09-03
补充:可以考虑使用定时器的重复计数(RCR)功能,让PWM更新事件每N个周期才触发一次DMA,减少中断频率,但需确保DMA传输时间远小于N个PWM周期。
脉冲控制老手 · 2026-09-03
核心思路是让DMA传输与PWM更新事件严格同步,避免中断竞争。首先,将DMA配置为循环模式,并设置传输完成中断(TC)而非半传输中断,且中断优先级低于PWM更新事件(若使用定时器更新中断)或直接禁用更新中断,仅依赖DMA的TC标志来装载下一组脉冲参数。其次,利用定时器的DMA突发请求(Burst)功能,在更新事件触发时自动从内存搬运数据到CCR寄存器,这样即使CPU被其他中断抢占,硬件也能保证波形连续。实操建议:1) 将DMA通道配置为外设到内存方向(外设地址固定为CCR),内存地址递增,数据宽度对齐;2) 在DMA中断中仅更新内存缓冲区指针,不直接操作寄存器,减少中断延迟;3) 若脉冲序列长度固定,可预加载多组数据到内存,使用双缓冲(DMA半传输/传输完成交替切换),确保CPU有足够时间准备下一组数据;4) 关键:将DMA中断优先级设为最低,PWM更新事件若需中断则设为最高,但更推荐完全不用更新中断,只用DMA完成中断来触发下一轮配置,这样竞争最小。最后,用逻辑分析仪验证实际波形,若仍有丢步,检查DMA的FIFO阈值和突发长度设置,确保每次传输原子性。
mcuku 阿沐 · 2026-09-03