核心思路是让DMA传输与PWM周期严格同步,避免中断抢占造成的数据错位。推荐使用PWM的更新事件(Update Event)作为DMA请求源,并配置DMA为循环模式(Circular Mode),这样每个PWM周期自动从内存搬运一次数据,无需CPU干预。关键在于:1)将DMA的传输完成中断(TC)和半传输中断(HT)优先级设为低于PWM更新中断,或干脆禁用HT中断,仅用TC中断做缓冲切换;2)若必须用HT,则在HT中断中只更新写指针,不直接修改DMA配置,利用双缓冲(Memory-to-Memory模式)或环形缓冲区,通过比较读写指针判断数据是否就绪;3)在PWM更新中断中检查DMA传输状态(如DMA_GetFlagStatus),若发现DMA未及时更新,则软件触发一次重载。实操建议:使用STM32CubeMX配置DMA为循环模式,PWM更新事件触发,并开启DMA的传输完成中断,在中断中切换缓冲区,同时将PWM更新中断优先级设为最高,确保时序确定性。
mcuku 阿沐 · 2026-08-27