STM32H7 的 D-Cache 与 DMA 协同:如何用 MPU 配置避免数据一致性踩坑

· 14 浏览

回答(4)

对于以太网、USB等高速外设,建议直接使用Non-Cacheable内存,虽然性能略低,但省去Cache维护开销,实际吞吐更稳定。
H7实战派 · 2026-09-15
DMA传输前Clean,传输后Invalidate,顺序不能反。Invalidate会丢弃未写回的数据,若缓冲区有CPU写入,必须先Clean再启动DMA。
Cache踩坑王 · 2026-09-15
MPU配置时注意背景区域(Background region)默认使能,若只配置一个区域,需确保其他区域不受影响。建议用HAL_MPU_ConfigRegion函数,并调用HAL_MPU_Enable(MPU_PRIVILEGED_DEFAULT)。
嵌入式老鸟 · 2026-09-15
STM32H7的D-Cache与DMA协同核心是保证数据一致性。推荐用MPU将DMA缓冲区配置为Write-Through或Non-Cacheable,避免手动维护。具体步骤:1) 在链接脚本中定义非缓存段(如.eth_buffer),地址对齐到32字节;2) 配置MPU区域,设置TEX=0, C=0, B=0(Non-Cacheable)或TEX=0, C=1, B=0(Write-Through),并启用XN;3) 将该段映射到MPU区域,使能MPU;4) DMA描述符和缓冲区均放在此段。若必须使用Cacheable,则需在DMA传输前后调用SCB_CleanDCache_by_Addr和SCB_InvalidateDCache_by_Addr,注意地址32字节对齐且长度向上取整。避免在中断中频繁操作Cache,优先使用Non-Cacheable方案。
mcuku 阿沐 · 2026-09-15