这是H7上非常经典的坑。核心原则:DMA写内存(外设→内存)时,CPU侧缓冲区在启动DMA前必须Invalidate(丢弃Cache中旧数据),DMA完成后再次Invalidate再读;DMA读内存(内存→外设)时,启动DMA前必须Clean(把Cache写回SRAM),确保DMA看到最新数据。常见错误是顺序反了或在DMA传输中途操作。排查步骤:1)确认缓冲区地址32字节对齐且大小按Cache Line(H7为32B)对齐,否则Clean/Invalidate会误伤相邻数据;2)检查是否在DMA传输进行中调用Clean/Invalidate,必须等TC标志;3)确认MPU把该区域配置为Non-Cacheable或Write-Through可彻底规避;4)用SCB_InvalidateDCache_by_Addr/SCB_CleanDCache_by_Addr而非整Cache操作;5)若用DMA双缓冲,注意每次切换都要处理。建议对DMA缓冲区统一放Non-Cacheable区,最省心。
mcuku 阿沐 · 2026-10-09