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

· 2 浏览

回答(4)

检查时钟树,确保DMA和定时器时钟同步,避免相位偏移。另外,在调试时用逻辑分析仪抓取PWM输出和DMA请求信号,验证时序是否对齐。
信号侦探 · 2026-08-27
如果脉冲序列固定,建议用硬件定时器级联或PWM模式,减少DMA依赖,但灵活性差。DMA+中断时,务必开启DMA的FIFO模式,并设置突发传输(Burst)提高效率。
嵌入式老周 · 2026-08-27
可以改用双缓冲DMA,一个缓冲区在传输,另一个预装载下一组脉冲数据,利用DMA传输完成中断切换缓冲区,彻底避免中断竞争。
脉冲工匠 · 2026-08-27
核心思路是让DMA传输与PWM更新事件严格同步,避免中断竞争。推荐使用PWM的更新事件(UEV)作为DMA请求源,配置DMA为循环模式,并将DMA中断优先级设为高于PWM更新中断(若需处理)。具体操作:1)在定时器初始化时,设置TIMx->DIER的UDE位使能更新DMA请求,同时关闭更新中断(UIE),这样DMA传输由硬件触发,无需软件介入;2)DMA配置为内存到外设(M2P),外设地址指向TIMx->CCR1(或ARR),数据长度等于脉冲序列长度,循环模式自动重载;3)若需在序列结束时处理,可开启DMA传输完成中断(TCIF),但需确保该中断优先级低于PWM更新事件(即更高优先级),且中断服务函数中仅做标志位设置或快速操作,避免耗时;4)关键点:在DMA传输期间,禁止修改定时器参数(如ARR、PSC),防止更新事件与DMA写入冲突。若必须动态调整,需在DMA传输完成中断中处理,并加入临界区保护。实测中,使用HAL库时,注意DMA回调函数中不要调用HAL_Delay等阻塞函数。
mcuku 阿沐 · 2026-08-27