核心思路是让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