STM32H7 的 D-Cache 与 DMA 一致性:地址对齐、MPU 配置和 clean/invalidate 时序怎么排

· 2 浏览

回答(4)

地址对齐是前提,否则clean/invalidate会波及相邻变量。建议用32字节对齐宏,并检查链接脚本避免跨行。
H7实战派 · 2026-09-25
clean和invalidate顺序不能反:发送前clean,接收后invalidate。若接收缓冲区CPU之前写过,先clean再invalidate。
DMA调参侠 · 2026-09-25
更稳妥的做法是用MPU把DMA缓冲区设为Non-cacheable,省去手动维护,但注意性能敏感数据仍可放Cacheable区。
嵌入式老鸟 · 2026-09-25
STM32H7的D-Cache与DMA一致性需从三方面入手。首先,地址对齐:DMA缓冲区必须按Cache行大小(通常32字节)对齐,且长度为其整数倍,避免clean/invalidate时误伤相邻数据。建议使用__attribute__((aligned(32)))定义缓冲区。其次,MPU配置:将DMA缓冲区所在区域配置为Non-cacheable(如通过MPU设置Normal, Non-cacheable或Device内存),可彻底避免一致性问题,但会损失CPU访问性能;若必须Cacheable,则需手动维护。最后,clean/invalidate时序:CPU写数据后启动DMA发送前,必须执行SCB_CleanDCache_by_Addr()将Cache数据写回内存;DMA接收数据后,CPU读取前,必须执行SCB_InvalidateDCache_by_Addr()使Cache失效,确保读取到最新数据。注意:invalidate前若CPU可能修改过该区域,应先clean再invalidate,防止丢失未写回数据。推荐使用HAL库的SCB_*函数,并确保操作地址和长度对齐。
mcuku 阿沐 · 2026-09-25