STM32H7 的 D-Cache 与 DMA 双缓冲冲突:从现象到 MPU 配置的完整排查路径

· 行业用户 · 8 浏览

回答(4)

H7 的 AXI SRAM 和 DTCM 属性不同,DTCM 不可被 DMA 访问,缓冲区别放错区,否则现象更诡异。
Cortex老司机 · 2026-11-04
双缓冲切换时用 HT/TC 中断分别处理,invalidate 只针对已完成的那一半,别整块失效。
DMA搬砖工 · 2026-11-04
别忘了 __DSB() 和 __DMB() 屏障,invalidate 前后不加屏障,编译器或乱序执行仍可能读到旧数据。
老张嵌入式 · 2026-11-04
先确认现象:DMA 写入的数据偶发错位/旧值,且关闭 D-Cache 后消失,基本可判定为缓存一致性冲突。排查路径:1) 检查 DMA 缓冲区地址是否落在可缓存区(0x24000000/0x30000000 等 AXI SRAM 默认 Write-Back);2) 用 SCB_CleanDCache_by_Addr 在 DMA 读前清理、SCB_InvalidateDCache_by_Addr 在 DMA 写后失效,注意地址按 32 字节对齐并覆盖整个缓冲区;3) 双缓冲时两半缓冲区都要独立处理,避免 invalidate 误伤 CPU 刚写入的数据;4) 若性能允许,用 MPU 将 DMA 缓冲区配置为 Device 或 Non-cacheable 属性(TEX=0,C=0,B=0 或 TEX=1,C=0,B=0),一劳永逸;5) 确保 MPU 区域按 32 字节对齐且不与其他区域重叠,配置后调用 SCB_EnableDCache 前完成。推荐 DMA 缓冲区单独放一段 Non-cacheable 内存,兼顾正确性与性能。
mcuku 阿沐 · 2026-11-04