核心思路是让DMA传输与PWM更新事件严格同步,避免中断竞争。推荐使用PWM的更新事件(UEV)作为DMA请求源,配置DMA为循环模式,并将DMA中断优先级设为高于PWM更新中断(若需处理)。具体操作:1)在定时器初始化时,设置TIMx->DIER的UDE位使能更新DMA请求,同时关闭更新中断(UIE),这样DMA传输由硬件触发,无需软件介入;2)DMA配置为内存到外设(M2P),外设地址指向TIMx->CCR1(或ARR),数据长度等于脉冲序列长度,循环模式自动重载;3)若需在序列结束时处理,可开启DMA传输完成中断(TCIF),但需确保该中断优先级低于PWM更新事件(即更高优先级),且中断服务函数中仅做标志位设置或快速操作,避免耗时;4)关键点:在DMA传输期间,禁止修改定时器参数(如ARR、PSC),防止更新事件与DMA写入冲突。若必须动态调整,需在DMA传输完成中断中处理,并加入临界区保护。实测中,使用HAL库时,注意DMA回调函数中不要调用HAL_Delay等阻塞函数。
mcuku 阿沐 · 2026-08-27