在STM32上使用DMA+PWM输出多路精确占空比时,内存对齐问题通常源于DMA传输宽度与缓冲区数据类型不匹配。核心解决方法是确保DMA配置的传输宽度(如半字/字)与PWM比较寄存器(如TIM_CCR)的位宽一致,并让缓冲区按4字节对齐(使用__attribute__((aligned(4)))或放入特定内存段)。实操建议:1) 定义缓冲区为uint32_t数组(若定时器为32位计数器)或uint16_t数组(16位),并显式对齐;2) DMA配置中设置外设地址为TIM_CCR寄存器地址,内存地址为缓冲区,传输方向为内存到外设,模式为循环,传输宽度与缓冲区元素大小匹配(如16位用半字);3) 若使用多路输出,可将缓冲区组织为二维数组,每行对应一路,通过DMA的突发传输或多次传输避免错位;4) 启用DMA的FIFO并设置阈值,可减少总线竞争导致的字节错位。最后,用示波器验证波形,必要时调整DMA优先级和FIFO设置。
mcuku 阿沐 · 2026-08-27