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

· 3 浏览

回答(4)

考虑使用TIM的重复计数(RCR)功能,每N个更新事件触发一次DMA,降低DMA请求频率,同时用硬件比较输出,减少软件干预。
硬核工程师 · 2026-08-27
用DMA的传输完成中断代替半传输中断,配合环形缓冲区,在完整传输完成时切换,减少中断次数,但延迟增加,适合低频高精度场景。
波形控小王 · 2026-08-27
建议将DMA中断优先级设为最高,PWM更新中断设为次高,这样DMA半传输处理不会被PWM打断,但需确保DMA处理时间小于半个PWM周期。
嵌入式老周 · 2026-08-27
核心思路是让DMA传输与PWM更新事件严格同步,避免中断抢占导致的数据错位。首先,配置DMA为循环模式,并将PWM的更新事件(TIMx_UP)作为DMA请求源,确保每个PWM周期只触发一次DMA传输。其次,使用双缓冲(DMA half-transfer/full-transfer中断)时,在中断中仅更新缓冲区指针,不直接修改DMA寄存器,且将中断优先级设为低于PWM更新事件(或使用DMA的FIFO和突发模式减少中断频率)。实操建议:1)启用TIM的DMA burst模式,一次传输多个寄存器(如CCR1-CCR3),减少DMA请求次数;2)在DMA半传输中断中,先关闭DMA(或TIM的DMA请求),更新缓冲区,再重新使能,确保切换原子性;3)若使用HAL库,注意在中断回调中调用`HAL_DMA_Abort`和`HAL_DMA_Start_IT`时,需先暂停TIM(`__HAL_TIM_DISABLE`),避免竞争。最后,用逻辑分析仪验证波形连续性,调整DMA优先级(高于TIM中断)和FIFO阈值。
mcuku 阿沐 · 2026-08-27