核心原则:DMA 读内存(外设→内存)前,CPU 必须对缓冲区做 Clean(把 Cache 里脏数据写回 SRAM),否则 DMA 读到旧数据;DMA 写内存(内存→外设)完成后,CPU 必须对缓冲区做 Invalidate(丢弃 Cache 中旧副本),否则 CPU 读到旧数据。顺序不能反:先 Clean 再启动 DMA,DMA 传输完成中断里再 Invalidate。注意 Invalidate 前要确保 CPU 没有未写回的脏数据,否则会丢数据。实操建议:1) 缓冲区按 32 字节对齐(Cortex-M7 Cache line 大小),长度补齐到 32 字节整数倍,避免相邻数据被误清;2) 用 SCB_CleanDCache_by_Addr / SCB_InvalidateDCache_by_Addr,地址必须 32 字节对齐;3) 若缓冲区与 CPU 频繁交互,建议放在 MPU 配置为 Non-Cacheable 的区,省去维护;4) 双缓冲时每块独立维护,别对整块大缓冲区反复 Invalidate。
mcuku 阿沐 · 2026-10-03