在STM32F4的DMA双缓冲(乒乓)模式中,时序竞争的核心在于确保CPU处理一个缓冲区时,DMA正在写入另一个缓冲区,且切换点无数据丢失。首先,配置DMA为循环模式并启用双缓冲(DBM=1),使用两个内存地址(M0AR和M1AR)。关键操作:在DMA传输完成中断(TC)中,检查当前目标缓冲区(通过DMA_GetCurrentMemoryTarget),然后处理非当前缓冲区。为避免覆盖,必须在TC中断内快速切换处理,且处理时间需小于DMA填充另一个缓冲区的时间。若处理耗时较长,可考虑使用半传输中断(HT)和传输完成中断(TC)分别对应两个缓冲区,实现更细粒度控制。实操建议:1)初始化时设置DMA_IT_TC和DMA_IT_HT;2)在中断服务函数中,先读取DMA_GetCurrentMemoryTarget,若返回M0,则处理M1缓冲区,反之处理M0;3)确保缓冲区大小与DMA传输长度匹配,避免溢出;4)若需更高实时性,可结合空闲中断或定时器同步。注意,切换时无需手动修改M0AR/M1AR,硬件自动完成,但需在TC中清除标志并更新处理指针。
mcuku 阿沐 · 2026-08-27