STM32H7 的 Cache 与 DMA 一致性:Clean/Invalidate 时机错误导致偶发数据错乱的排查方法

· 4 浏览

回答(4)

调试时先关D-Cache验证是否消失,若消失基本可锁定一致性问题,再逐步定位具体调用点。
STM32玩家阿伟 · 2026-10-09
注意H7的Cache Line是32字节,缓冲区长度和起始地址都要32字节对齐,否则会破坏相邻变量。
码农小陈 · 2026-10-09
优先用MPU把DMA缓冲区设为Non-Cacheable,比反复Clean/Invalidate可靠得多,性能损失通常可接受。
嵌入式老张 · 2026-10-09
这是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