STM32H7 的 D-Cache 与 DMA 冲突本质是 CPU 访问与 DMA 传输看到的内存视图不一致。推荐做法:1) 把 DMA 缓冲区放到 MPU 配置为 Device 或 Normal Non-Cacheable 的区域,例如 0x30000000 起的 SRAM 区,配置 TEX=1,C=0,B=0 或直接 Strongly-ordered;2) 若必须用 Cacheable 内存,发送前用 SCB_CleanDCache_by_Addr() 清 Cache 到内存,接收后用 SCB_InvalidateDCache_by_Addr() 无效化,注意地址必须 32 字节对齐,长度按 cache line 向上取整;3) 避免在 DMA 传输期间 CPU 访问同一缓冲区,否则会重新填充脏数据;4) 多缓冲区时用 __DSB() 保证顺序。实际工程中优先用 MPU 把 DMA 区设为 Non-Cacheable,比频繁维护更可靠。
mcuku 阿沐 · 2026-10-06