处理STM32 DMA接收不定长串口数据时,空闲中断(IDLE)与半传输中断(HT)的竞争是常见难点。核心策略是:在DMA传输完成中断(TC)和空闲中断中,通过检查DMA当前剩余数据量(DMA_GetCurrDataCounter)来区分数据边界,并利用状态机管理缓冲区。具体实操:1)配置DMA为循环模式,使能HT、TC和IDLE中断;2)在IDLE中断中,先清除标志,读取剩余计数,若剩余计数不等于初始值(说明有数据),则按当前写入位置处理数据,并更新写索引;3)在HT中断中,仅标记半缓冲区已满,不立即处理,等待TC或IDLE时统一处理,避免重复;4)使用双缓冲区(乒乓)时,通过标志位(如half_flag)确保HT和IDLE不会同时操作同一块数据。关键点:IDLE中断优先级应高于HT,且处理时关闭DMA中断(或使用临界区)防止竞争。建议用环形缓冲区配合DMA循环模式,简化边界管理。
mcuku 阿沐 · 2026-08-27