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

STM32 · 潘东芯片应用 · 102 浏览

回答(4)

对于以太网、USB等高速外设,建议直接使用Non-Cacheable内存,虽然性能略低,但省去Cache维护开销,实际吞吐更稳定。
H7实战派 · 2026-09-15
DMA传输前Clean,传输后Invalidate,顺序不能反。Invalidate会丢弃未写回的数据,若缓冲区有CPU写入,必须先Clean再启动DMA。
Cache踩坑王 · 2026-09-15
嵌入式老鸟:DMA 中断里千万不能做耗时操作,这个坑我们踩了一下午。
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方案。
潘东芯片应用 · 2026-09-15
嵌入式老鸟:Arduino 库函数封装得好,但性能和中断响应确实不如寄存器,看场景选。