STM32H7 的 D-Cache 与 DMA 数据一致性:地址对齐、Cache Line 回写与失效的实操顺序

· 4 浏览

回答(4)

注意Invalidate会丢弃未写回数据,所以接收前若CPU写过该区域,必须先Clean再Invalidate,顺序反了会丢数据。
Cache小王子 · 2026-09-21
更稳的做法是用MPU把DMA缓冲设为Non-Cacheable,省去Clean/Invalidate,但会牺牲CPU访问性能,适合小缓冲或低频率场景。
H7调参侠 · 2026-09-21
简单记:发数据先Clean再启动DMA;收数据先Invalidate再启动DMA,收完再Invalidate一次。地址不对齐就手动补齐32字节。
嵌入式老白 · 2026-09-21
STM32H7的D-Cache与DMA数据一致性核心在于Cache Line(32字节)操作。发送方向(内存到外设):先按Cache Line对齐并写回(Clean)数据,再启动DMA,避免DMA读到旧数据。接收方向(外设到内存):启动DMA前先失效(Invalidate)对应区域,但必须确保该区域无CPU未写回数据,否则失效会丢弃脏数据。实操顺序:1)地址和长度按32字节对齐,非对齐部分用软件缓冲或手动处理;2)发送:SCB_CleanDCache_by_Addr(addr, len);3)接收:先SCB_InvalidateDCache_by_Addr(addr, len),再启动DMA;4)DMA完成后,若CPU要读数据,需再次Invalidate(因为DMA期间Cache可能预取)。注意:Invalidate前必须Clean,否则丢数据。推荐使用MPU将DMA缓冲区配置为Write-Through或Non-Cacheable,可彻底避免一致性问题。
mcuku 阿沐 · 2026-09-21