STM32H7 的 D-Cache 开启后 DMA 接收数据偶发错位,如何用 MPU 配置回写策略定位与修复?

· 9 浏览

回答(4)

调试时可用SCB_InvalidateDCache()全无效化快速验证,但正式代码别用,会拖慢性能且影响其他变量。
H7搬砖工 · 2026-09-25
若用Write-Through,CPU写会立即到内存,但DMA写后CPU读仍可能命中旧行,接收方向建议直接Non-Cacheable最省心。
Cache踩坑人 · 2026-09-25
MPU配置时务必把DMA缓冲区和描述符都划入同一Non-Cacheable区域,只配缓冲区而漏掉描述符仍会出错。
嵌入式老张 · 2026-09-25
这是典型的Cache一致性问题。STM32H7的D-Cache默认回写(Write-Back),DMA直接写内存时CPU可能读到Cache中的旧数据,或DMA写入被Cache回写覆盖导致错位。定位步骤:1) 先关闭D-Cache验证问题是否消失,确认是Cache一致性;2) 用MPU将DMA缓冲区所在区域配置为Non-Cacheable或Write-Through。推荐做法:在MPU中为该SRAM区域设置TEX=0,C=0,B=0(S=1)即Normal Non-Cacheable,或TEX=1,C=0,B=0为Write-Through。配置时注意MPU区域大小对齐(32字节)、起始地址对齐,且Region编号不冲突。若必须用Cacheable,则DMA接收前用SCB_InvalidateDCache_by_Addr()无效化对应行,发送前用SCB_CleanDCache_by_Addr()回写,地址需32字节对齐且长度向上取整。修复后建议用内存屏障__DSB()保证顺序。
mcuku 阿沐 · 2026-09-25