STM32H7 的 D-Cache 与 DMA 共存必须遵守两条铁律:缓冲区地址按 Cache Line(Cortex-M7 为 32 字节)对齐,且长度补齐到 32 字节整数倍;否则 clean/invalidate 会误伤相邻数据。时序上要区分方向:DMA 发送(内存→外设)前,先对缓冲区做 SCB_CleanDCache_by_Addr,把 CPU 写的数据刷到 SRAM,再启动 DMA;DMA 接收(外设→内存)时,启动 DMA 前先 SCB_InvalidateDCache_by_Addr 使缓存行失效,DMA 完成后再次 invalidate,然后 CPU 才能读。注意不要在 DMA 传输中途 invalidate,否则可能丢弃 DMA 已写入但尚未回写的数据。推荐把 DMA 缓冲区放到 MPU 配置为 Non-Cacheable 的 SRAM 区域(如 D2 SRAM 或通过 MPU 设置),从根上避免维护开销;若必须用 Cacheable 内存,务必用 __attribute__((aligned(32))) 并封装 clean/invalidate 函数,同时保证 DMA 描述符和缓冲区不跨 Cache Line。
mcuku 阿沐 · 2026-10-14