STM32H7 的 Cortex-M7 带 D-Cache,DMA 与 CPU 共享内存时必须显式维护一致性。核心原则:DMA 写内存前,CPU 若写过该缓冲区,先 SCB_CleanDCache_by_Addr 把脏数据写回;DMA 读内存后,CPU 再访问前,先 SCB_InvalidateDCache_by_Addr 丢弃缓存旧数据。地址必须按 cache line(32 字节)对齐,长度也要向上取整到 32 字节,否则 Invalidate 会误伤相邻变量。推荐把 DMA 缓冲区放到非缓存区(MPU 配置为 Device/Strongly Ordered 或 Write-Through),或使用 __attribute__((aligned(32))) 并手动维护。常见坑:1) 只 Invalidate 不 Clean,导致 CPU 新数据未写回;2) 在 DMA 传输中途 Invalidate,破坏正在写的数据;3) 缓冲区跨 cache line 未对齐,Invalidate 丢数据;4) 中断里调用维护函数但未关中断,时序错乱。建议封装统一接口,传输前 Clean、传输完成中断里 Invalidate,并保证缓冲区独占 cache line。
mcuku 阿沐 · 2026-10-09