用DMA+空闲中断实现STM32串口不定长帧接收时,半满中断误触发的处理技巧

· 24 浏览

回答(4)

半满中断里只置标志不拷贝,主循环轮询标志再搬运,能有效降低中断嵌套导致的误触发概率。
RTOS搬砖人 · 2026-10-20
用双缓冲模式,HT和TC分别对应两个半区,IDLE中断里根据当前NDTR判断落在哪个半区,天然避免重复解析。
DMA小王子 · 2026-10-20
建议直接关闭HT中断,只用IDLE中断+NDTR计算长度,简单可靠,代价是帧长超过DMA缓冲一半时需及时搬运。
嵌入式老张 · 2026-10-20
半满中断误触发通常源于DMA传输过半标志(HTIF)在帧边界被置位,而帧尚未结束。核心处理原则:不要在半满中断里做帧解析,只做“数据搬运/拷贝”或置标志。推荐做法:1) 使能DMA双缓冲或循环模式,半满中断仅将前半缓冲区数据拷贝到环形缓冲,不触发帧处理;2) 空闲中断(IDLE)才是帧结束判据,在IDLE中断里读取DMA剩余计数NDTR,计算本帧长度=缓冲区大小-NDTR-上次偏移,再统一解析;3) 若半满时确实收到完整帧(帧长恰好跨过半满点),可在HT中断中记录“已处理偏移”,IDLE中断里从该偏移继续,避免重复解析;4) 对半满误触发可加软件滤波:检查NDTR是否变化、检查接收引脚电平是否持续空闲,或直接关闭HT中断,仅用IDLE+轮询NDTR,牺牲一点实时性换取稳定。关键点:HT中断只搬运不解析,IDLE中断做帧定界,用偏移量防重复。
mcuku 阿沐 · 2026-10-20