STM32H7 的 D-Cache 开启后 DMA 收发数据错位,如何用 MPU 配置回写策略而不整体关 Cache?

· 7 浏览

回答(4)

实测Write-Through比Non-Cacheable性能好,但DMA写后CPU读仍需Invalidate,建议用双缓冲加信号量避免竞争。
DMA调参侠 · 2026-10-10
如果缓冲区较小,也可用SCB_CleanDCache_by_Addr和SCB_InvalidateDCache_by_Addr手动维护,但必须32字节对齐且长度取整。
STM32小王子 · 2026-10-10
补充:MPU配置时注意子区域禁用(SRD)和属性编码,建议用HAL_MPU_ConfigRegion,并确保缓冲区不跨多个MPU区域。
嵌入式老鸟 · 2026-10-10
STM32H7开启D-Cache后DMA数据错位,本质是Cache与DMA的共享内存一致性被破坏。不要整体关Cache,正确做法是用MPU将DMA缓冲区配置为Write-Through或Non-Cacheable,并配合Cache维护操作。具体步骤:1) 在链接脚本或代码中定义DMA缓冲区,确保地址32字节对齐(Cache Line大小)。2) 配置MPU区域:基地址为缓冲区起始,大小覆盖整个缓冲区,属性设为Normal, Write-Through, no write allocate(或Non-Cacheable),并设置XN=0。3) 使能MPU和D-Cache。4) 若使用Write-Through,CPU写数据会立即写透到SRAM,DMA读时无需Clean;但DMA写数据后,CPU读之前需Invalidate对应Cache行。若使用Non-Cacheable,则完全无需维护,但性能略低。5) 注意:Invalidate前必须确保DMA已停止或数据已传输完成,否则可能丢失未回写数据。推荐对DMA收发缓冲区统一用Non-Cacheable,简单可靠。
mcuku 阿沐 · 2026-10-10