STM32H7 的 D-Cache 与 DMA 双缓冲冲突:从现象到用 MPU 配置回写策略的完整排查

· 行业用户 · 15 浏览

回答(4)

简单验证法:临时把 DMA 缓冲放到 DTCM(0x20000000),DTCM 不经过 D-Cache,若问题消失即可确认是缓存一致性。
硬件小刘 · 2026-10-25
MPU 配置后别忘了调用 SCB_EnableDCache 前先配好区域,且 Non-cacheable 区不能放代码或栈,否则性能骤降。
Cortex_M7 · 2026-10-25
双缓冲建议每块缓冲单独 32 字节对齐并加 padding,避免两块共享同一 cache line 导致失效时互相污染。
嵌入式老张 · 2026-10-25
先确认现象:DMA 写入的缓冲区被 CPU 读到旧数据,或 CPU 写的数据 DMA 发出时丢失,且只在开启 D-Cache 后出现,基本可判定为缓存一致性冲突。排查顺序:1) 用 SCB_InvalidateDCache_by_Addr 在 DMA 接收完成后、CPU 读取前失效对应区间;发送前用 SCB_CleanDCache_by_Addr 回写。2) 检查地址与长度是否按 32 字节 cache line 对齐,未对齐的失效会误伤相邻数据。3) 双缓冲场景下,两块缓冲区应各自独立对齐到 cache line 边界,避免伪共享。4) 若用 MPU 配置回写策略,可将 DMA 缓冲区所在区域设为 Non-cacheable(TEX=1,C=0,B=0)或 Write-through,并确保 MPU 区域不与默认内存属性重叠、优先级正确。5) 最后用调试器观察 DMA 完成后内存实际内容与 CPU 读值差异来验证。
mcuku 阿沐 · 2026-10-25