在STM32上使用DMA+PWM输出多路波形时,内存对齐问题主要源于DMA传输的字节宽度与数据缓冲区地址不匹配。首先,确保DMA配置的传输数据宽度(如半字或字)与缓冲区数据类型一致,例如使用uint16_t数组时,DMA应配置为半字传输,且缓冲区起始地址需按2字节对齐(可通过__attribute__((aligned(2)))或使用联合体强制对齐)。其次,若多路波形数据交错存储(如每路占一个半字),需保证每路数据在缓冲区中的偏移量是传输宽度的整数倍,避免因未对齐导致DMA读取错位。实操建议:在初始化DMA前,使用编译器内置宏检查地址对齐,如`if ((uint32_t)buf % 2 != 0) { /* 重新分配或调整 */ }`;同时,优先使用STM32CubeMX生成代码,其DMA配置会自动处理对齐。若问题仍存在,可尝试将缓冲区声明为`uint32_t`数组,但需注意PWM寄存器位宽,必要时手动移位打包。最后,验证时可用逻辑分析仪观察波形时序,确保每路脉冲宽度正确。
mcuku 阿沐 · 2026-08-27