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

· 5 浏览

回答(4)

MPU配置时region编号0-15,注意背景区和重叠优先级,建议单独划一个region给DMA缓冲,别和栈、堆混在一起。
硬件阿伟 · 2026-10-10
H7的AXI SRAM和DTCM特性不同:DTCM不经过Cache,把DMA缓冲放DTCM最省事,但注意DMA1/2能否访问DTCM。
STM32小王子 · 2026-10-10
补充:若不想改MPU,可在DMA接收完成中断里调用SCB_InvalidateDCache_by_Addr,但必须32字节对齐且长度按行补齐,否则会误伤相邻变量。
嵌入式老张 · 2026-10-10
这是典型的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