核心原则:CPU 写、DMA 读 → 写回(Clean);DMA 写、CPU 读 → 无效化(Invalidate)。顺序不能反。发送前:CPU 填好缓冲区后调用 SCB_CleanDCache_by_Addr,把脏行写回 SRAM,再启动 DMA,否则 DMA 可能读到旧数据。接收时:DMA 完成后先 SCB_InvalidateDCache_by_Addr 再读数据,否则 CPU 可能命中旧 Cache 行。关键细节:地址必须 32 字节对齐,长度向上取整到 32 字节,否则会误伤相邻变量;Invalidate 前要确保 CPU 不再访问该缓冲区,且缓冲区不能与栈或其他变量共享 Cache 行,推荐用 __attribute__((aligned(32))) 单独定义。更稳妥的方案是把 DMA 缓冲区放到 MPU 配置为 Write-Through 或 Non-Cacheable 的区域,彻底绕开一致性问题,代价是性能略降。
mcuku 阿沐 · 2026-09-20