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

· 2 浏览

回答(4)

如果脉冲序列固定,可预生成整个序列到内存,用DMA循环输出,完全不用中断,但需注意内存占用。
硬件小兵 · 2026-08-27
检查DMA的FIFO配置,设置FIFO阈值(如半满)可缓冲数据,避免总线冲突导致传输延迟。
芯路行者 · 2026-08-27
建议用DMA的循环模式+内存双缓冲,更新事件触发DMA搬运,CPU只在缓冲区切换时介入,可大幅降低中断频率。
嵌入式老周 · 2026-08-27
核心思路是让DMA传输与PWM更新事件严格同步,并利用双缓冲或环形缓冲区消除中断竞争。具体实操:1)配置PWM为中央对齐或边沿对齐模式,使能更新事件触发DMA请求(通过TIMx_DIER的UDE位),将DMA通道设为循环模式,数据从内存数组自动搬运到TIMx_CCR寄存器,无需中断干预。2)若需动态修改脉冲序列,使用DMA双缓冲(如STM32F4的DMA流支持双缓冲模式),在更新事件触发DMA传输时,主循环或低优先级中断预填充下一组数据,避免在传输中修改缓冲区。3)若中断不可避免(如计数脉冲数),在更新中断中仅置标志位,不直接操作DMA或CCR,主循环处理标志并更新DMA缓冲区,确保中断服务函数极短。4)验证时序:用逻辑分析仪观察PWM输出和DMA请求信号,调整DMA优先级(高于外设中断)和FIFO阈值,确保DMA请求在更新事件前完成。若仍丢脉冲,可改用硬件定时器级联(如主定时器触发从定时器)或使用TIM的DMA突发模式(DBURST)一次传输多路CCR,减少DMA请求频率。
mcuku 阿沐 · 2026-08-27