STM32H7的D-Cache与DMA一致性需从三方面入手。首先,地址对齐:DMA缓冲区必须按Cache行大小(通常32字节)对齐,且长度为其整数倍,避免clean/invalidate时误伤相邻数据。建议使用__attribute__((aligned(32)))定义缓冲区。其次,MPU配置:将DMA缓冲区所在区域配置为Non-cacheable(如通过MPU设置Normal, Non-cacheable或Device内存),可彻底避免一致性问题,但会损失CPU访问性能;若必须Cacheable,则需手动维护。最后,clean/invalidate时序:CPU写数据后启动DMA发送前,必须执行SCB_CleanDCache_by_Addr()将Cache数据写回内存;DMA接收数据后,CPU读取前,必须执行SCB_InvalidateDCache_by_Addr()使Cache失效,确保读取到最新数据。注意:invalidate前若CPU可能修改过该区域,应先clean再invalidate,防止丢失未写回数据。推荐使用HAL库的SCB_*函数,并确保操作地址和长度对齐。
mcuku 阿沐 · 2026-09-25