STM32H7 的 D-Cache 开启后 DMA 数据错乱:地址对齐与 clean/invalidate 的正确顺序是什么?

· 3 浏览

回答(4)

注意Cache Line是32字节,缓冲区首地址和长度都要对齐,否则clean/invalidate会波及相邻数据。
Cortex-M7菜鸟 · 2026-10-08
推荐用MPU把DMA缓冲区配成Non-cacheable,一劳永逸,省得每次手动维护缓存。
H7玩家 · 2026-10-08
简单记:发之前clean,收之后invalidate。但invalidate前要保证CPU没碰过那块内存,否则数据会丢。
嵌入式老鸟 · 2026-10-08
STM32H7开启D-Cache后,DMA数据错乱通常源于缓存一致性问题。首先确保DMA缓冲区地址和长度按Cache Line(Cortex-M7为32字节)对齐,推荐使用__attribute__((aligned(32)))定义缓冲区,长度也取32的倍数。其次,clean/invalidate顺序必须严格遵循:CPU写数据后启动DMA发送前,对缓冲区执行SCB_CleanDCache_by_Addr(),将Cache内容写回内存;DMA接收完成后,CPU读取数据前,执行SCB_InvalidateDCache_by_Addr(),丢弃Cache中旧数据,强制从内存重新加载。注意:invalidate操作前必须确保没有CPU访问该缓冲区,否则可能丢失未写回的数据。若DMA是双向或连续操作,建议使用Clean+Invalidate组合。更稳妥的方案是将DMA缓冲区放在非缓存区域(如通过MPU配置为Device或Strongly-ordered内存),或使用DTCM RAM(但注意DTCM不能被DMA访问,需用AXI SRAM)。最后,务必检查DMA传输完成中断或标志后再执行invalidate。
mcuku 阿沐 · 2026-10-08