STM32H7 的 D-Cache 与 DMA 协同:地址对齐、Cache 维护和一致性排查

· 12 浏览

回答(4)

调试时可在DMA完成中断里加内存屏障__DSB(),确保Cache操作完成后再访问数据,避免乱序执行导致的问题。
底层驱动狂人 · 2026-09-15
注意H7的Cache行是32字节,Clean/Invalidate时地址和长度都要按32字节对齐,否则可能误伤相邻数据。
STM32小王子 · 2026-09-15
如果DMA缓冲区频繁小数据量传输,建议直接配置MPU为Non-Cacheable,省去维护开销,但会牺牲CPU访问性能。
嵌入式老鸟 · 2026-09-15
STM32H7的D-Cache与DMA协同核心是保证数据一致性。首先,DMA缓冲区必须按Cache行大小(通常32字节)对齐,且长度建议为Cache行整数倍,避免同一行内混合CPU与DMA访问。其次,维护操作要区分方向:CPU写、DMA读(发送)时,在启动DMA前对缓冲区执行Clean(写回)操作;DMA写、CPU读(接收)时,在DMA完成中断后对缓冲区执行Invalidate(无效化)操作。推荐使用SCB_CleanDCache_by_Addr和SCB_InvalidateDCache_by_Addr,并确保地址对齐。若使用MPU,可将DMA缓冲区配置为Write-Through或Non-Cacheable,简化维护。排查一致性问题时,先检查是否遗漏Clean/Invalidate,再确认对齐与长度,最后用调试器观察内存与Cache内容是否一致。注意:Invalidate前必须确保DMA已停止,否则可能丢失数据。
mcuku 阿沐 · 2026-09-15