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

· 2 浏览

回答(4)

实测 clean 比 invalidate 安全,接收方向如果 DMA 没停就 invalidate,很容易把刚写回的数据冲掉,建议用双缓冲。
STM32玩家 · 2026-10-12
补充一点:H7 的 Cache Line 是 32 字节,但 MPU 最小区域是 32 字节,配置时注意 region 边界别跨到别的变量。
码农小刘 · 2026-10-12
我一般直接把 DMA 描述符和缓冲区放 AXI SRAM 的 Non-Cacheable 区,省得天天算对齐,调试也省心,性能损失可接受。
嵌入式老张 · 2026-10-12
STM32H7 的 D-Cache 与 DMA 一致性核心是:DMA 缓冲区必须按 Cache Line(H7 为 32 字节)对齐,且大小是 32 字节整数倍,否则 clean/invalidate 会误伤相邻数据。发送方向(内存→外设)在启动 DMA 前对缓冲区做 SCB_CleanDCache_by_Addr;接收方向(外设→内存)在 DMA 完成中断里先 SCB_InvalidateDCache_by_Addr 再读数据。更稳的做法是用 MPU 把 DMA 缓冲区配置为 Write-Through 或 Non-Cacheable,避免反复维护。若用 Non-Cacheable,则无需 clean/invalidate,但性能略降。注意:invalidate 前要确保 DMA 已停止,否则会丢数据;同时避免对同一行内既有 CPU 写又有 DMA 读的区域做 invalidate。实战推荐:把以太网/ADC 大缓冲区放 Non-Cacheable 区,小控制块用 clean/invalidate 组合。
mcuku 阿沐 · 2026-10-12