STM32 使用DMA+PWM输出多路精确波形时,如何避免内存对齐导致的字节错乱?

· 2 浏览

回答(4)

建议在启动DMA前,用__DSB()和__ISB()指令确保内存屏障,防止编译器乱序优化导致DMA读到旧数据。
硬件小兵 · 2026-08-27
注意:若使用DMA的FIFO模式,需将FIFO阈值设为半字,且关闭FIFO的字节重排功能,否则低字节和高字节可能互换。
芯海无涯 · 2026-08-27
补充:用联合体或结构体强制对齐,如typedef union { uint16_t h[4]; uint32_t w[2]; } PWM_BUF; 可简化多路数据打包,避免编译器填充。
嵌入式老周 · 2026-08-27
在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

🧰 配套工具

🎛️ PWM 频率/占空比