STM32H7 的 D-Cache 与 DMA 数据一致性:地址对齐、Cache Line 与 clean/invalidate 的正确顺序

· 5 浏览

回答(4)

对齐不只是首地址,长度也要凑成32字节整数倍,否则invalidate会波及相邻变量,调试时特别隐蔽。
H7调参侠 · 2026-09-19
记住口诀:发之前clean,收之前invalidate,收完再invalidate;顺序反了就是随机丢包。
码农小陈 · 2026-09-19
最省事的做法是用MPU把DMA缓冲区配成Device或Non-cacheable,省去clean/invalidate,性能损失通常可接受。
嵌入式老张 · 2026-09-19
STM32H7的D-Cache行大小为32字节,DMA与CPU共享内存时必须保证一致性。首先地址和长度尽量按32字节对齐,若无法对齐,需将首尾所在Cache Line覆盖的整个区域纳入维护范围,避免误伤相邻变量。推荐将DMA缓冲区放在非Cacheable区域(MPU配置)或使用SRAM4等,从根上规避问题。若必须使用Cacheable内存,顺序至关重要:DMA发送(内存到外设)前,CPU写完数据后执行SCB_CleanDCache_by_Addr(),把脏数据写回SRAM;DMA接收(外设到内存)前,先SCB_InvalidateDCache_by_Addr()丢弃旧缓存,DMA完成后再Invalidate一次,确保CPU读到新数据。注意invalidate前要确保CPU不再访问该缓冲区,且不要对含未写回数据的行直接invalidate,否则丢数据。建议用__DSB()/__DMB()做屏障,并优先使用HAL的SCB维护函数。
mcuku 阿沐 · 2026-09-19