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