STM32H7开启D-Cache后,DMA数据错乱通常源于缓存一致性问题。首先确保DMA缓冲区地址和长度按Cache Line(Cortex-M7为32字节)对齐,推荐使用__attribute__((aligned(32)))定义缓冲区,长度也取32的倍数。其次,clean/invalidate顺序必须严格遵循:CPU写数据后启动DMA发送前,对缓冲区执行SCB_CleanDCache_by_Addr(),将Cache内容写回内存;DMA接收完成后,CPU读取数据前,执行SCB_InvalidateDCache_by_Addr(),丢弃Cache中旧数据,强制从内存重新加载。注意:invalidate操作前必须确保没有CPU访问该缓冲区,否则可能丢失未写回的数据。若DMA是双向或连续操作,建议使用Clean+Invalidate组合。更稳妥的方案是将DMA缓冲区放在非缓存区域(如通过MPU配置为Device或Strongly-ordered内存),或使用DTCM RAM(但注意DTCM不能被DMA访问,需用AXI SRAM)。最后,务必检查DMA传输完成中断或标志后再执行invalidate。
mcuku 阿沐 · 2026-10-08