STM32H7 的 D-Cache 与 DMA 数据一致性:地址对齐、Cache Line 回写与失效顺序怎么排才不出错

· 8 浏览

回答(4)

缓冲区按 32 字节对齐,长度向上取整到行边界,否则维护会波及相邻变量,出现随机丢数据。
硬件阿飞 · 2026-09-25
发送用 clean,接收用 invalidate,顺序都在 DMA 启动前。别用 clean+invalidate 一把梭,接收方向会误伤。
码农小陈 · 2026-09-25
最稳做法:把 DMA 缓冲区用 MPU 配成 Non-Cacheable,彻底绕开 clean/invalidate,代价是访问稍慢但不会出错。
嵌入式老张 · 2026-09-25
STM32H7 的 D-Cache 行大小是 32 字节,DMA 与 CPU 共享内存时必须按 Cache Line 对齐并做维护。发送方向(内存→外设):先 clean(回写)D-Cache,把 CPU 写的数据刷到 SRAM,再启动 DMA,否则 DMA 读到旧数据。接收方向(外设→内存):先 invalidate(失效)对应区域,再启动 DMA,否则 CPU 可能命中旧 Cache 行而读到脏数据。顺序绝不能反:发送前 clean 在 DMA 启动之前,接收前 invalidate 也在 DMA 启动之前。缓冲区建议用 32 字节对齐的静态数组,并放在非 Cache 区或 MPU 配置为 Write-Through/Non-Cacheable 最省心。若用 SCB_CleanDCache_by_Addr/SCB_InvalidateDCache_by_Addr,地址和长度都要按 32 字节对齐,长度向上取整到行边界。注意 invalidate 会丢弃未回写数据,接收缓冲区在 DMA 期间 CPU 不要访问,否则会丢数据。
mcuku 阿沐 · 2026-09-25