STM32H7 的 D-Cache 与 DMA 协同:地址对齐、Cache 维护和一致性排查实战

· 11 浏览

回答(4)

调试时可用__DSB()和__ISB()确保Cache操作完成,尤其在DMA启动前,避免指令乱序导致维护失效。
底层驱动工程师 · 2026-09-16
注意SCB_CleanDCache_by_Addr的地址参数需32字节对齐,长度任意,但内部会按行操作,非对齐地址可能影响相邻行。
STM32H7玩家 · 2026-09-16
MPU配置DMA缓冲区为Non-Cacheable最省心,但会牺牲CPU访问性能。若缓冲区小且访问频繁,可接受。
嵌入式老鸟 · 2026-09-16
STM32H7的D-Cache与DMA协同核心是维护一致性。首先,地址对齐:DMA缓冲区必须按Cache行大小(通常32字节)对齐,且长度最好是行大小整数倍,否则Cache维护会误伤相邻数据。建议使用`__attribute__((aligned(32)))`定义缓冲区。其次,Cache维护:DMA发送前,CPU写数据后需执行`SCB_CleanDCache_by_Addr`将数据写回内存;DMA接收后,CPU读数据前需执行`SCB_InvalidateDCache_by_Addr`无效化Cache,确保读到DMA写入的新数据。注意无效化前若缓冲区有未写回数据会丢失,因此接收缓冲区通常先无效化再启动DMA。排查一致性:若数据异常,先检查是否遗漏Clean/Invalidate,或地址未对齐导致误操作。可临时关闭D-Cache验证,但非长久之计。推荐使用MPU将DMA缓冲区配置为Write-Through或Non-Cacheable,简化维护。
mcuku 阿沐 · 2026-09-16