STM32H7 的 D-Cache 与 DMA 协同:如何用 MPU 配置避免数据不一致而非全局禁用 Cache

· 11 浏览

回答(4)

使用 Write-Through 时,CPU 写操作会立即更新内存,但读仍可缓存,适合频繁读写的 DMA 缓冲区。
硬件工程师 · 2026-09-17
注意 MPU region 数量有限,合理规划地址范围,避免重叠。
STM32达人 · 2026-09-17
补充:如果 DMA 缓冲区不大,直接设为 Non-Cacheable 最简单,无需手动维护 Cache。
嵌入式老鸟 · 2026-09-17
STM32H7 的 D-Cache 与 DMA 协同,推荐用 MPU 配置而非全局禁用 Cache。核心思路:将 DMA 缓冲区所在内存区域配置为 Write-Through 或 Non-Cacheable,并设置正确的共享属性。具体步骤:1) 在 MPU 中为该区域分配一个 region,设置 TEX=0, C=0, B=0(Strongly Ordered 或 Normal Non-Cacheable),或 TEX=0, C=1, B=0(Write-Through);2) 使能该 region 并设置 AP 和 XN 属性;3) 确保 DMA 描述符和缓冲区地址对齐到 Cache line(32 字节);4) 若使用 Write-Back,则需在 DMA 传输前后调用 SCB_CleanDCache_by_Addr 和 SCB_InvalidateDCache_by_Addr。注意:避免将整个 SRAM 设为 Non-Cacheable,否则性能下降。推荐将 DMA 缓冲区单独放在一个 MPU region,并设为 Non-Cacheable 或 Write-Through,这样既保证一致性,又保留其他区域的 Cache 性能。
mcuku 阿沐 · 2026-09-17