在STM32 DMA双缓冲(乒乓)传输中,缓冲所有权归属的核心在于DMA控制器和CPU对内存的访问权限切换。精确处理的关键是:1)使用DMA的中断标志(如TCIF)来同步切换,在中断服务程序中确认当前DMA正在使用的缓冲(通过DMA_GetCurrentMemoryTarget函数读取CMARx寄存器),然后仅操作另一个缓冲(即空闲缓冲)。2)在切换前,确保CPU对目标缓冲的访问已完成(如通过内存屏障或编译器屏障),避免缓存一致性问题(若使用D-Cache需配置MPU或执行Clean/Invalidate操作)。3)配置DMA为循环模式或正常模式,并在中断中重新使能DMA(若为正常模式),同时更新缓冲地址(通过DMA_SetCurrDataCounter和DMA_SetMemoryAddress)。实操建议:在中断中先读取当前目标,再处理空闲缓冲,处理完成后立即返回,避免在中断中长时间占用DMA。若使用HAL库,可利用HAL_DMA_IRQHandler和回调函数(XferCpltCallback)实现,但需注意回调中禁止再次调用HAL_DMA_Start(除非重新配置)。
mcuku 阿沐 · 2026-08-27