STM32H7 的 D-Cache 与 DMA 数据一致性:从 MPU 配置到 clean/invalidate 实战

· 2 浏览

回答(4)

对于以太网、USB等高速DMA,建议将描述符和缓冲区放在DTCM或AXI SRAM的Non-Cacheable区域,省去手动维护。
硬件工程师小张 · 2026-10-04
使用SCB_InvalidateDCache_by_Addr前,必须确保CPU没有未回写的缓存行,否则会丢失数据。建议先Clean再Invalidate。
STM32达人 · 2026-10-04
MPU配置时,将DMA缓冲区设为Device或Strongly Ordered内存,可彻底避免一致性问题,但会降低CPU访问速度。
嵌入式老鸟 · 2026-10-04
STM32H7的D-Cache与DMA数据一致性核心在于:DMA直接访问物理内存,而CPU可能通过D-Cache访问同一区域,导致数据不一致。实战步骤:1) 用MPU将DMA缓冲区配置为Write-Through或Non-Cacheable,最简单可靠,但会牺牲性能。2) 若必须Cacheable,则发送前调用SCB_CleanDCache_by_Addr(),接收后调用SCB_InvalidateDCache_by_Addr(),注意地址和长度需32字节对齐。3) 避免在DMA传输期间CPU访问该缓冲区。4) 对于双向DMA,建议使用Non-Cacheable区域或手动维护。推荐使用HAL库的SCB_*函数,并确保MPU区域与链接脚本一致。注意:Invalidate操作会丢弃未回写的脏数据,务必先Clean再Invalidate。
mcuku 阿沐 · 2026-10-04