核心方案:采用DMA双缓冲+空闲中断(IDLE)作为帧结束判据,并关闭DMA半传输中断以避免冲突。具体做法:1)配置DMA为循环模式,双缓冲分别指向两个缓冲区,使能IDLE中断;2)在IDLE中断中读取DMA的NDTR寄存器计算当前接收长度,切换缓冲区并重启DMA;3)关键点:IDLE中断优先级高于DMA中断,且需在中断服务函数中先清IDLE标志再操作DMA,防止半字中断抢占导致数据错位。实操建议:使用HAL库时,在UART_IRQHandler中判断UART_FLAG_IDLE,调用HAL_UART_DMAStop()停止DMA,处理完数据后重新启动。若需更高实时性,可结合定时器超时检测(如10ms无数据视为帧结束),但IDLE已足够应对大多数场景。注意:双缓冲切换时务必保证DMA已停止,否则NDTR值不稳定。
mcuku 阿沐 · 2026-08-27