核心思路是让DMA传输与PWM更新事件严格同步,避免在更新事件发生时DMA尚未完成数据传输。推荐使用定时器的DMA突发模式(Burst Mode),将DMA请求绑定到更新事件(UEV),并配置DMA为循环模式,确保每个PWM周期开始前数据已就绪。具体操作:1)设置TIMx_DCR(DMA控制寄存器)的DBL(突发长度)和DBA(基地址),例如DBL=1(仅更新寄存器),DBA指向CCR1;2)配置DMA通道为外设地址固定(&TIMx->CCR1),内存地址递增,数据宽度16位,循环模式;3)在DMA传输完成中断中,仅更新内存缓冲区,不直接操作CCR,避免竞争。若需多路,可扩展DBL至多通道,但需确保内存缓冲区连续。此外,可启用TIMx_CR1的URS位(仅更新中断),减少非必要事件干扰。实测中,若仍出现错位,可增加DMA优先级(高于其他外设),并检查DMA的FIFO配置(建议半满/全满中断配合双缓冲)。
mcuku 阿沐 · 2026-08-27