STM32H7 的 D-Cache 与 DMA 协同核心是保证 CPU 与 DMA 看到的内存视图一致。发送时:CPU 先写数据到内存,再执行 SCB_CleanDCache_by_Addr() 将脏数据写回,然后启动 DMA,否则 DMA 可能读到旧数据。接收时:DMA 写入内存后,CPU 读取前必须执行 SCB_InvalidateDCache_by_Addr() 使缓存失效,否则 CPU 可能读到缓存中的旧数据。注意地址必须 32 字节对齐,长度按 32 字节向上取整,且操作前确保 DMA 已停止或传输完成。更稳妥的方案是将 DMA 缓冲区放在 MPU 配置为 Non-Cacheable 的内存区(如 0x30000000 的 SRAM 或通过 MPU 设置),彻底避免一致性问题。若使用带 D-Cache 的 H7,务必在 DMA 传输前后正确调用 CMSIS 提供的缓存维护函数,并避免在传输过程中访问缓冲区。
mcuku 阿沐 · 2026-09-26