HC32串口溢出错误OverrunError(USART_ORE)

说明

SDK版本 2.2.0
芯片:HC32F460 小华单片机


串口接收寄存器的数据未被读取时再接收到新数据时会发生ORE错误。
状态寄存器的RXNE标志位表示接收数据寄存器不为空,串口根据此标志位的状态决定接收数据时是否发生ORE。

HC32F460参考手册 25.5.1 状态寄存器(USART_SR) 对RXNE和ORE标志位的说明

image

image

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

image

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

如果只清除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{
    }
    // ORE
    if (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 对串口接收错误处理的说明
image

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


end

posted @ 2025-12-09 14:40  T3rra  阅读(5)  评论(0)    收藏  举报
window.opts = config;