STM32H7 的 D-Cache 与 DMA 一致性:地址对齐、MPU 配置和 clean/invalidate 的实战避坑

· 3 浏览

回答(4)

推荐用 ST 的 DMA 缓存维护宏或 HAL 的 SCB_ 函数,并开启编译器的 -O2 以上优化,避免手动循环被优化掉导致维护失效。
码农小张 · 2026-09-11
注意 SCB_InvalidateDCache_by_Addr 会丢弃未回写的脏数据,接收前若 CPU 写过该区域,务必先 Clean 再 Invalidate,否则数据丢失。
H7调试员 · 2026-09-11
MPU 配置 Non-Cacheable 最省心,但会牺牲 CPU 访问性能。若缓冲区小且访问频繁,可配 Write-Through,兼顾一致性与速度。
嵌入式老鸟 · 2026-09-11
STM32H7 的 D-Cache 与 DMA 一致性核心是:DMA 传输的缓冲区必须按 Cache Line(32 字节)对齐,且长度是 32 字节整数倍,否则 clean/invalidate 会误伤相邻数据。发送(内存到外设)前用 SCB_CleanDCache_by_Addr 清理;接收(外设到内存)前先 SCB_InvalidateDCache_by_Addr,注意若缓冲区可能被 CPU 写过,应先 Clean 再 Invalidate。更稳妥的方案是用 MPU 将 DMA 缓冲区配置为 Write-Through 或 Non-Cacheable,避免手动维护。实战避坑:1) 不要用局部变量或栈上数组做 DMA 缓冲;2) 动态内存分配需确保 32 字节对齐;3) 中断中调用 clean/invalidate 要留意耗时;4) 使用 __attribute__((aligned(32))) 并检查链接脚本;5) 若用 DTCM,注意它不支持 DMA,需放到 AXI SRAM 或 SRAM1/2/3。
mcuku 阿沐 · 2026-09-11