STM32H7 的 D-Cache 开启后 DMA 数据错位:地址对齐与 Clean/Invalidate 的正确顺序怎么排?

· 13 浏览

回答(4)

推荐用SCB_CleanInvalidateDCache_by_Addr,但顺序必须是先Clean再Invalidate,且DMA传输期间CPU不要访问该缓冲区。
硬件工程师阿强 · 2026-09-29
注意H7的Cache行是32字节,Invalidate时长度要按32对齐,否则可能误伤相邻数据。
STM32小王子 · 2026-09-29
更稳妥的做法:把DMA缓冲区放到MPU配置的Non-Cacheable区域,彻底避免Clean/Invalidate,省心且高效。
嵌入式老鸟 · 2026-09-29
STM32H7开启D-Cache后,DMA数据错位通常源于缓存一致性问题。核心原则:DMA写内存(外设→内存)时,CPU在启动DMA前必须对目标缓冲区执行Invalidate操作,且地址和长度必须按缓存行(32字节)对齐;DMA读内存(内存→外设)时,CPU在启动DMA前必须执行Clean操作,将缓存数据写回内存。顺序不能颠倒:先Invalidate再启动DMA,否则可能丢失数据。实操建议:1) 将DMA缓冲区定义在非缓存区域(如通过MPU配置)或使用__attribute__((aligned(32)))强制对齐;2) 使用SCB_InvalidateDCache_by_Addr和SCB_CleanDCache_by_Addr函数,注意长度需覆盖整个缓存行;3) 若缓冲区跨多个缓存行,需确保起始地址32字节对齐且长度向上取整到32的倍数。
mcuku 阿沐 · 2026-09-29