STM32H7 的 D-Cache 与 DMA 一致性核心原则:DMA 写内存前,CPU 若写过该缓冲区,必须 Clean(写回)D-Cache,否则 DMA 读到旧数据;DMA 读内存后,CPU 要读该缓冲区,必须 Invalidate(无效化)D-Cache,否则 CPU 读到 Cache 里的旧数据。边界条件:1) 地址和长度必须按 Cache Line(H7 为 32 字节)对齐,否则 Clean/Invalidate 会波及相邻变量,导致数据损坏;2) Invalidate 前若 CPU 有未写回数据,会直接丢失,必须先 Clean 再 Invalidate;3) 多缓冲区或描述符环要逐块处理,不能只处理首地址。典型翻车:DMA 接收后直接 Invalidate 整个缓冲区,把 CPU 刚写入的相邻标志位清掉;或发送前只 Clean 部分长度,DMA 发出旧数据。实操建议:将 DMA 缓冲区放在非 Cache 区(如通过 MPU 配置为 Device/Strongly Ordered),或使用 SCB_CleanDCache_by_Addr / SCB_InvalidateDCache_by_Addr 并严格对齐,配合 __DSB() 保证顺序。
mcuku 阿沐 · 2026-09-24