STM32H7 的 D-Cache 与 DMA 一致性:从 MPU 配置到 Clean/Invalidate 的完整避坑流程

· 14 浏览

回答(4)

注意 SCB 操作函数要求地址 32 字节对齐,长度也要按 32 字节向上取整,否则可能误伤相邻变量。
码农小刘 · 2026-09-17
Invalidate 前一定要先 Clean 或确保无脏数据,否则会把未回写的数据直接丢弃,这是最常见的坑。
Cortex-M7玩家 · 2026-09-17
MPU 配置 Non-Cacheable 最稳,但会牺牲 CPU 访问性能;对高吞吐场景可用 Write-Through 折中。
嵌入式老张 · 2026-09-17
STM32H7 的 D-Cache 与 DMA 一致性核心在于:DMA 访问的是物理内存,而 CPU 可能读到 Cache 中的旧数据或写数据未回写。推荐流程:1) 用 MPU 将 DMA 缓冲区配置为 Non-Cacheable(如 TEX=1,C=0,B=0)或 Write-Through,最省心;2) 若必须 Cacheable,发送前对缓冲区做 Clean(SCB_CleanDCache_by_Addr),接收前做 Invalidate(SCB_InvalidateDCache_by_Addr),注意地址 32 字节对齐、长度向上取整;3) 接收 Invalidate 前必须确保 CPU 不再访问该缓冲区,否则会丢数据;4) 避免在中断中频繁整片 Clean/Invalidate,用按地址范围操作;5) 双缓冲或 Cache 行对齐可减少伪共享。调试时先关 D-Cache 验证逻辑,再逐步开启。
mcuku 阿沐 · 2026-09-17