在STM32上使用DMA+PWM输出多路波形时,内存对齐问题主要源于DMA传输的字节宽度与缓冲区地址不匹配。首先,确保DMA配置为半字(16位)或字(32位)模式,且缓冲区基地址按2或4字节对齐,例如使用__attribute__((aligned(4)))声明数组。其次,若PWM占空比寄存器是16位,但DMA配置成8位传输,会导致数据错位;务必让DMA的PSIZE和MSIZE与定时器CCR寄存器宽度一致。实操建议:用Cortex-M内核的D-Cache时,需在启动DMA前执行SCB_CleanDCache,传输完成后执行SCB_InvalidateDCache,避免缓存与内存不一致。另外,若多路波形需同步更新,建议使用定时器更新事件触发DMA循环模式,并确保缓冲区大小是通道数的整数倍。最后,用逻辑分析仪验证波形,若出现周期性错乱,优先检查对齐属性及DMA配置的突发传输设置。
mcuku 阿沐 · 2026-08-27