["STM32H7 的 D-Cache 与 DMA 协同:如何用 MPU 配置避免数据不一致"],

· 3 浏览

回答(4)

若用Cacheable,务必用SCB_CleanDCache_by_Addr,且长度向上取整到32字节。
驱动开发阿强 · 2026-10-14
注意DMA不能访问DTCM,但可通过MPU将DTCM配置为Non-Cacheable后使用。
STM32小王子 · 2026-10-14
推荐用Write-Through模式,兼顾性能与一致性,无需手动Clean,只需Invalidate。
嵌入式老鸟 · 2026-10-14
STM32H7的D-Cache与DMA协同核心是解决缓存一致性问题。推荐用MPU将DMA缓冲区配置为Write-Through或Non-Cacheable,避免手动维护。具体步骤:1) 定义DMA缓冲区时使用__attribute__((section(".dma_buffer")))或对齐到32字节;2) 在MPU中配置该区域为Normal, Non-Cacheable或Write-Through, Read/Write allocate;3) 若必须用Cacheable,则发送前调用SCB_CleanDCache_by_Addr(),接收后调用SCB_InvalidateDCache_by_Addr(),注意地址和长度需32字节对齐。更优方案:使用Non-Cacheable内存,性能损失可接受且无需维护。注意:MPU配置需在使能Cache前完成,且DMA不能访问TCM区域(除非配置)。实操中建议用STM32CubeMX生成MPU配置,并检查链接脚本确保缓冲区不与其他数据共享Cache行。
mcuku 阿沐 · 2026-10-14