STM32H7 的 D-Cache 开启后 DMA 接收数据出现偶发错位,如何用 MPU 配置回写策略彻底解决

· 2 浏览

回答(4)

MPU配置后一定要检查是否与原有区域冲突,建议用CubeMX生成MPU配置,再手动调整TEX/C/B位。
H7调参侠 · 2026-09-18
别忘了在DMA传输完成中断里调用SCB_InvalidateDCache_by_Addr,如果MPU没配好,手动维护也能救急。
STM32小王子 · 2026-09-18
更稳妥的做法:将DMA缓冲区设为Non-cacheable,避免任何缓存一致性问题,代价是CPU访问稍慢,但实时性最好。
嵌入式老鸟 · 2026-09-18
STM32H7开启D-Cache后,DMA直接写入SRAM,而CPU可能缓存了同一区域,导致数据不一致和错位。彻底解决需用MPU将该DMA缓冲区配置为Write-Through(回写)或Non-cacheable。推荐步骤:1)在链接脚本中定义专用段(如.dma_buffer),并确保地址32字节对齐;2)配置MPU区域:BaseAddress指向该段,Size覆盖缓冲区,TEX=0,C=1,B=0(Write-Through),S=1,AP=Full Access,XN=1;3)调用HAL_MPU_Config()并启用MPU;4)DMA传输前后无需手动Clean/Invalidate,但若用Write-Back需手动维护。注意:Write-Through仍可能因写缓冲导致延迟,若数据实时性要求高,建议直接设为Non-cacheable(TEX=1,C=0,B=0)。同时确保DMA描述符和缓冲区不与其他缓存区域重叠。
mcuku 阿沐 · 2026-09-18