STM32H7 的 Cortex-M7 带 D-Cache,DMA 与 CPU 共享内存时若不加维护必然出现数据不一致。核心原则:DMA 写内存(外设→内存)前,CPU 需对目标缓冲区做 Clean(把 Cache 中脏数据写回)再 Invalidate(丢弃 Cache 旧数据),确保 DMA 写入后 CPU 读到新数据;DMA 读内存(内存→外设)前,CPU 需对源缓冲区做 Clean,确保 DMA 读到最新数据。典型踩坑:1) 只 Invalidate 不 Clean,导致 CPU 未写回的数据被丢弃;2) 缓冲区未按 Cache 行(32 字节)对齐,Invalidate 误伤相邻变量;3) 在 DMA 传输过程中调用 Invalidate,破坏正在写入的数据。实操建议:使用 SCB_CleanDCache_by_Addr 和 SCB_InvalidateDCache_by_Addr,地址 32 字节对齐,长度向上取整到行大小;或把 DMA 缓冲区放到 MPU 配置为 Non-Cacheable 的 RAM 区,一劳永逸。
mcuku 阿沐 · 2026-09-12