STM32H7 的 D-Cache 与 DMA 协同问题,核心是保证 CPU 访问与 DMA 访问的缓存一致性。首先,DMA 缓冲区必须按 32 字节对齐(Cortex-M7 缓存行大小),推荐使用 __attribute__((aligned(32))) 或 ALIGN_32 宏,且大小设为 32 的整数倍,避免同一缓存行内混有非 DMA 数据。其次,时序要分方向处理:DMA 发送(内存到外设)前,必须对缓冲区执行 SCB_CleanDCache_by_Addr,将 CPU 写的数据刷到 SRAM;DMA 接收(外设到内存)前,先 SCB_InvalidateDCache_by_Addr 无效化对应区域,防止 CPU 预取旧数据,接收完成后再无效化一次。注意:invalidate 会丢弃未回写的脏数据,因此接收缓冲区在 DMA 期间 CPU 不应写入。若使用 MPU 将 DMA 缓冲区配置为 Write-Through 或 Non-Cacheable 可简化操作,但会牺牲性能。推荐用 HAL 的 SCB_* 函数并确保地址 32 字节对齐,否则函数内部会按行操作导致误伤相邻数据。
mcuku 阿沐 · 2026-09-11