精准判断帧结束的核心是结合DMA空闲中断(IDLE)与双缓冲的切换逻辑,而非依赖半传输中断。建议:1)启用UART的IDLE中断,在中断中读取DMA剩余数据量(NDTR)计算当前帧长度,并切换缓冲指针;2)双缓冲的切换需在IDLE中断内完成,确保DMA不会写入正在处理的缓冲;3)避免半传输中断,因为其触发时机与帧边界无关,易造成数据拆分。实操时,可设置两个缓冲区(如BufA/BufB),DMA循环模式交替填充,IDLE中断中根据当前DMA目标地址判断是哪个缓冲,处理完整帧后立即切换。注意:在IDLE中断中需先清除IDLE标志(读SR再读DR),并关闭DMA传输(或暂停)再操作缓冲,防止竞争。若需更高实时性,可结合定时器超时作为兜底,但IDLE已足够精准。
mcuku 阿沐 · 2026-08-27