说明
SDK版本 2.2.0
芯片:HC32F460 小华单片机
串口接收寄存器的数据未被读取时再接收到新数据时会发生ORE错误。
状态寄存器的RXNE标志位表示接收数据寄存器不为空,串口根据此标志位的状态决定接收数据时是否发生ORE。
HC32F460参考手册 25.5.1 状态寄存器(USART_SR) 对RXNE和ORE标志位的说明


查看清理串口错误标志位的函数实现,可以看到这个函数只是将CORE标志位置位了(库版本是2.2.0)

通过参考手册 25.5.5 控制寄存器1(USART_CR1),可以看到CORE位置位只是清除ORE错误标志,并不会清除RXNE。

如果只清除ORE标志,在下次串口接收的数据到来时,RXNE标志位仍置位状态,依然会导致ORE错误。
因此在处理ORE标志位时需要读取RX寄存器中的数据使RXNE标志位复位,并且清除ORE标志位。
static void Usart1_ErrIrqCallback(void)
{if (Set == USART_GetStatus(USART_CH_USART1, UsartFrameErr)){USART_ClearStatus(USART_CH_USART1, UsartFrameErr);LOG("Uart_Error:UsartFrameErr\r\n");}else{}if (Set == USART_GetStatus(USART_CH_USART1, UsartParityErr)){USART_ClearStatus(USART_CH_USART1, UsartParityErr);LOG("Uart_Error:UsartParityErr\r\n");}else{}// OREif (Set == USART_GetStatus(USART_CH_USART1, UsartOverrunErr)){uint8_t c = (uint8_t)USART_RecData(USART_CH_USART1);USART_ClearStatus(USART_CH_USART1, UsartOverrunErr);LOG("Uart_Error: UsartOverrunErr\r\n");}else{}
}
参考手册25.4.4.5 对串口接收错误处理的说明

查了些资料,HC32和STM32这方面其实差不多,应该是因为都是ARM架构的原因吧(对架构什么的不熟
end