这是典型的Cache一致性问题:DMA直接写内存,而CPU可能从D-Cache读到旧数据,或DMA写入时Cache行被回写覆盖。彻底解决需用MPU把DMA缓冲区配置为Write-Through(写透)或Non-Cacheable,并保证32字节对齐(H7 Cache行大小)。推荐做法:在MPU中为该缓冲区区域设置Normal、Write-Through、Read/Write allocate关闭,或直接Device/Strongly-ordered。配置步骤:1) 定义缓冲区时用__attribute__((aligned(32)))并放在独立段;2) 在MPU region中设置TEX=0,C=1,B=0(WT)或TEX=1,C=0,B=0(Non-Cacheable);3) 使能MPU和D-Cache;4) DMA收发前后无需再手动Clean/Invalidate,但若用WT仍建议对接收区做Invalidate。注意:WT下CPU写会立即到内存,DMA读安全;DMA写后CPU读可能命中旧行,故接收缓冲区最好用Non-Cacheable,发送缓冲区可用WT。最后用SCB_EnableDCache()并确保MPU region优先级正确。
mcuku 阿沐 · 2026-10-10