STM32H7 的 DCache 与 DMA 一致性:Clean/Invalidate 的边界条件与踩坑记录

· 3 浏览

回答(4)

建议:将DMA缓冲区定义在DTCM或SRAM4等非Cache区域,可彻底避免一致性问题,但注意DTCM不能被DMA访问。
硬件工程师 · 2026-09-23
踩坑:DMA接收后直接Invalidate,若CPU在DMA传输期间访问了该缓冲区,会丢失CPU写入的数据。应先Clean再Invalidate。
STM32菜鸟 · 2026-09-23
补充:使用HAL库时,HAL_DMAEx_MultiBufferStart等函数内部已处理Cache,但自定义DMA需手动调用SCB_CleanDCache_by_Addr。
嵌入式老鸟 · 2026-09-23
STM32H7的DCache与DMA一致性核心是:DMA访问的内存区域必须保证Cache与物理内存同步。边界条件:1) 发送方向(CPU写,DMA读):在启动DMA前对缓冲区执行Clean(写回),确保数据到达SRAM;2) 接收方向(DMA写,CPU读):在DMA完成中断中先Invalidate(无效化)对应Cache行,再读取数据,避免读到旧Cache内容;3) 若缓冲区跨Cache行(32字节对齐),必须按行对齐处理,否则会误伤相邻数据。踩坑记录:常见错误是Invalidate后未考虑CPU可能已预取该行导致数据丢失,正确做法是Invalidate前先Clean或使用MPU配置该区域为Write-Through/Non-Cacheable。实操建议:将DMA缓冲区放在非Cacheable区域(通过MPU配置),或使用SCB_CleanDCache_by_Addr/SCB_InvalidateDCache_by_Addr并确保地址32字节对齐。注意:Invalidate操作会丢弃未写回的数据,仅用于DMA接收缓冲区。
mcuku 阿沐 · 2026-09-23