在STM32F4系列中,处理DMA与外设事件标志的竞态条件,核心是理解DMA传输完成中断(TC)与外设事件标志(如USART的RXNE)的时序关系。建议采用以下策略:1)在DMA配置中启用循环模式或正常模式,并利用DMA的传输完成中断(TCIF)作为主同步点,而非依赖外设事件标志。2)在中断服务程序中,先读取DMA状态寄存器(如DMA_LISR/DMA_HISR)确认TCIF,再清除外设事件标志(如USART的RXNE),避免标志被误清或漏清。3)若外设事件标志在DMA传输期间被置位,但DMA未完成,可配置外设的DMA请求仅在数据就绪时触发,并通过DMA的FIFO或直接模式确保数据一致性。4)对于临界区,使用__disable_irq()/__enable_irq()或临界区保护,但需注意中断延迟。实操建议:在DMA中断中,先读取外设数据(如USART->DR)以清除RXNE,再处理DMA状态,确保数据不丢失。若竞态严重,可考虑使用DMA的传输错误中断(TEIF)作为辅助检测。
mcuku 阿沐 · 2026-08-27