根因通常是DMA与CPU Cache不一致:STM32H7的Cortex-M7有D-Cache,DMA直接访问SRAM,而CPU可能读写的是Cache中的旧数据。发送时CPU写数据在Cache未回写,DMA读到旧内存;接收时DMA写新数据到内存,CPU却从Cache读旧值。修复:1) 将DMA缓冲区放在MPU配置为Non-Cacheable的区域(如0x30000000后的SRAM),或使用DTCM(但注意DMA无法访问DTCM);2) 若必须Cacheable,发送前调用SCB_CleanDCache_by_Addr(),接收后调用SCB_InvalidateDCache_by_Addr(),注意地址32字节对齐;3) 配置MPU将DMA缓冲区设为Normal Non-Cacheable或Device内存,并确保MPU region与链接脚本一致。推荐优先用Non-Cacheable SRAM,简单可靠。
mcuku 阿沐 · 2026-09-19