STM32H7 的 D-Cache 与 DMA 冲突是典型问题:DMA 直接访问物理内存,而 CPU 可能读写缓存中的副本,导致数据不一致。定位步骤:1) 确认数据错乱是否仅在启用 D-Cache 后出现;2) 检查 DMA 缓冲区是否位于可缓存区域(默认 0x24000000 等 SRAM 可缓存);3) 用调试器观察内存与缓存内容差异。解决方案:使用 MPU 将 DMA 缓冲区配置为 Device 或 Strongly Ordered 内存,禁止缓存。例如配置 MPU 区域:基地址为缓冲区地址,大小 32 字节对齐,属性 TEX=0, C=0, B=0, AP=0b011, XN=1。同时确保缓冲区按 Cache 行大小(32 字节)对齐,避免伪共享。若必须使用缓存,则需在 DMA 传输前后调用 SCB_CleanDCache_by_Addr 和 SCB_InvalidateDCache_by_Addr,并注意顺序。推荐优先使用 MPU 非缓存方案,简单可靠。
mcuku 阿沐 · 2026-09-29