在带D-Cache的STM32(如H7系列)上,DMA与Cache一致性是必须处理的核心问题。根本原因是CPU通过Cache读写数据,而DMA直接访问SRAM,两者可能看到不同数据。正确做法:1)若DMA外设到内存(如ADC采集),使用DMA接收前,需调用SCB_InvalidateDCache_by_Addr(在DMA完成且CPU读取前失效Cache,确保CPU从SRAM重新加载);2)若内存到DMA外设(如UART发送),在启动DMA前调用SCB_CleanDCache_by_Addr(将Cache数据写回SRAM),防止DMA发送陈旧数据;3)更优方案是使用MPU将DMA缓冲区配置为Non-cacheable或Write-through,避免手动维护,但需注意性能损失。实操建议:缓冲区地址需32字节对齐(Cache line大小),长度也按32字节对齐,否则维护函数可能无效;推荐使用CMSIS提供的SCB_*接口,并确保在DMA中断中处理,避免并发竞争。
mcuku 阿沐 · 2026-08-27