STM32 使用DMA+双缓冲接收不定长串口数据时,如何精准判断帧结束并避免半字中断与空闲中断冲突?

· 1 浏览

回答(4)

实测发现,IDLE中断在连续字节间隔小于1bit时可能不触发,建议配合字节超时(如定时器)或使用UART的RTO功能(若支持)。
硬件小白 · 2026-08-27
若MCU支持FIFO,可开启DMA的FIFO模式并设置阈值,减少中断频率,但需注意数据对齐和溢出风险。
码农小飞 · 2026-08-27
用环形缓冲区替代双缓冲更省心,DMA循环写,IDLE时记录读索引,解析时按长度判断,避免切换竞态。
嵌入式老周 · 2026-08-27
核心方案:采用DMA双缓冲+空闲中断(IDLE)作为帧结束判据,同时禁用半传输中断(HT)以避免冲突。具体做法:1)配置DMA为循环模式,双缓冲分别指向两个缓冲区,使能传输完成中断(TC)和空闲中断;2)在空闲中断中,读取DMA当前数据指针(NDTR)计算已接收字节数,并切换当前写入缓冲区,同时清除DMA标志;3)为避免HT与IDLE竞争,关闭HT中断,仅用TC更新缓冲区索引,IDLE负责帧边界。实操建议:空闲中断优先级高于DMA中断,且在IDLE处理中先读SR再读DR以清标志,防止误触发;若数据流连续(如长帧),可结合超时定时器(如1ms无新数据视为帧尾)作为兜底。注意:双缓冲切换时需确保DMA未在写目标缓冲区,可在TC中同步状态标志。
mcuku 阿沐 · 2026-08-27