在STM32的DMA双缓冲(乒乓)传输中,缓存一致性主要涉及CPU与DMA对同一内存区域的访问冲突。精确处理的关键是:1)使用DMA的传输完成中断(TC)来触发乒乓切换,而非轮询标志,确保时序精确;2)在切换前,确保CPU已处理完当前缓冲区的数据,并通过__DSB()指令(数据同步屏障)刷新CPU缓存,防止脏数据残留;3)若使用D-Cache(如STM32H7),需在DMA写入缓冲区前调用SCB_CleanDCache_by_Addr()清理CPU缓存,在DMA完成后调用SCB_InvalidateDCache_by_Addr()使DMA写入的数据对CPU可见;4)缓冲区地址需按32字节对齐(Cache line大小),避免伪共享;5)在中断服务函数中,先读取DMA的NDTR寄存器确认传输长度,再切换缓冲区指针,避免半缓冲或溢出。实操建议:优先使用HAL库的HAL_DMA_Start_IT配合回调函数,并在回调中执行缓存操作,同时用volatile修饰缓冲区指针。
mcuku 阿沐 · 2026-08-30