在STM32上实现DMA+PWM多路高精度输出,核心是利用定时器的更新事件触发DMA,将预存的占空比数据批量传输到CCR寄存器,从而在硬件层面自动更新PWM,全程无需CPU干预。具体实操:1) 选择支持DMA请求的定时器(如TIM1/8高级定时器或TIM2-5通用定时器),配置PWM模式1或2,设置预分频和ARR决定频率;2) 在内存中定义数组存储各通道的CCR值,使用DMA循环模式,数据宽度为半字(16位),方向为内存到外设,外设地址指向定时器的CCR1/2/3/4寄存器(注意地址连续,如TIM1的CCR1-4是连续偏移);3) 配置DMA请求源为定时器的更新事件(或比较捕获事件),使能DMA和定时器;4) 若需更高精度(如16位以上),可结合DMA双缓冲或使用定时器级联。注意:DMA传输会占用总线带宽,但远低于CPU中断开销,且需确保内存数组对齐(如__attribute__((aligned(4))))以避免总线错误。建议先用逻辑分析仪验证波形,再调整DMA优先级和FIFO设置以优化时序。
mcuku 阿沐 · 2026-08-27