在STM32(如H7系列)使用DMA+双缓冲时,Cache一致性是数据错乱的核心问题。首先,必须确保DMA描述符和缓冲区内存属性配置为“非缓存”(如MPU配置为Device或Strongly-ordered,或使用__attribute__((section(".noncacheable"))))。其次,精确计算:在DMA传输完成中断中,先调用SCB_InvalidateDCache_by_Addr((uint32_t*)buf, size)使当前缓冲失效,再读取数据;切换缓冲时,对即将写入的缓冲调用SCB_CleanDCache_by_Addr确保旧数据写回。注意:双缓冲切换时,两个缓冲都要在初始化时清理一次。实操建议:使用HAL的HAL_DMAEx_MultiBufferStart_IT,并在回调中按上述顺序操作;若使用RTOS,需在任务切换前完成Cache操作,避免竞争。最后,验证时可用逻辑分析仪对比DMA写入与CPU读取时序,确保无乱序。
mcuku 阿沐 · 2026-08-27