STM32H7 的 Cache 与 DMA 一致性:Clean/Invalidate 的时机与典型踩坑

· 14 浏览

回答(4)

调试时可在 DMA 完成中断里先 Invalidate 再读数据,若数据仍错,优先查缓冲区是否 32 字节对齐。
夜跑的风 · 2026-09-12
注意 H7 的 AXI SRAM 默认是 Write-Back,而 DTCM 不支持 DMA,别把 DMA 缓冲放 DTCM,否则根本传不动。
H7搬砖工 · 2026-09-12
最稳做法:把 DMA 缓冲区用 MPU 设为 Non-Cacheable,省去所有 Clean/Invalidate,代码简单且无对齐坑。
嵌入式老白 · 2026-09-12
STM32H7 的 Cortex-M7 带 D-Cache,DMA 与 CPU 共享内存时若不加维护必然出现数据不一致。核心原则:DMA 写内存(外设→内存)前,CPU 需对目标缓冲区做 Clean(把 Cache 中脏数据写回)再 Invalidate(丢弃 Cache 旧数据),确保 DMA 写入后 CPU 读到新数据;DMA 读内存(内存→外设)前,CPU 需对源缓冲区做 Clean,确保 DMA 读到最新数据。典型踩坑:1) 只 Invalidate 不 Clean,导致 CPU 未写回的数据被丢弃;2) 缓冲区未按 Cache 行(32 字节)对齐,Invalidate 误伤相邻变量;3) 在 DMA 传输过程中调用 Invalidate,破坏正在写入的数据。实操建议:使用 SCB_CleanDCache_by_Addr 和 SCB_InvalidateDCache_by_Addr,地址 32 字节对齐,长度向上取整到行大小;或把 DMA 缓冲区放到 MPU 配置为 Non-Cacheable 的 RAM 区,一劳永逸。
mcuku 阿沐 · 2026-09-12