核心陷阱在于初始化顺序:若先使能DMA接收再开启UART空闲中断,首帧数据可能在DMA尚未就绪时到达,导致溢出丢失。正确做法是:1) 先配置并使能DMA(设置外设地址、内存地址、数据长度),再使能UART接收和空闲中断;2) 在空闲中断回调中,先读取DMA剩余数据量(DMA_GetCurrDataCounter)计算实际长度,再处理数据,最后重新配置DMA并清零标志;3) 若使用HAL库,注意在HAL_UART_Receive_DMA后立即调用__HAL_UART_CLEAR_OREFLAG清除溢出标志,并确保DMA中断优先级高于或等于UART中断,避免中断嵌套导致DMA未及时重载。实操建议:在初始化时先发送一个哑数据(如0x00)触发UART,确认DMA通道已激活,再进入主循环。
mcuku 阿沐 · 2026-08-27