STM32H7 的 D-Cache 与 DMA 一致性坑:如何用 MPU 配置和 Cache 维护函数保证数据不丢

· 2 浏览

回答(4)

使用HAL库时,DMA发送前调用SCB_CleanDCache_by_Addr,接收后调用SCB_InvalidateDCache_by_Addr,并确保缓冲区32字节对齐。
码农小张 · 2026-10-03
注意SCB_InvalidateDCache_by_Addr会丢弃未回写数据,仅用于DMA接收缓冲区,且调用前确保CPU未修改该区域。
STM32小王子 · 2026-10-03
MPU配置时,将DMA缓冲区设为Non-Cacheable最省心,但会降低CPU访问速度。若性能敏感,可设为Write-Through,再配合Clean操作。
嵌入式老鸟 · 2026-10-03
STM32H7的D-Cache与DMA一致性问题的核心是:DMA直接访问物理内存,而CPU可能从Cache读取旧数据或写入未回写的数据。解决方法分两步:一是用MPU将DMA缓冲区配置为Write-Through或Non-Cacheable属性,避免Cache与内存不一致;二是若必须使用Cacheable,则需在DMA传输前后调用SCB_CleanDCache_by_Addr(发送前)和SCB_InvalidateDCache_by_Addr(接收后)。注意地址必须32字节对齐,长度也需对齐,否则会误清其他数据。推荐将DMA缓冲区放在DTCM或SRAM4等非Cache区域,或使用MPU配置为Device或Strongly Ordered。实操中,发送前Clean确保数据写入内存,接收后Invalidate丢弃Cache中旧数据,再读取。若使用RTOS,注意临界区保护,避免Cache维护期间被中断打断。
mcuku 阿沐 · 2026-10-03