关于STM32F103RB中UART_WaitOnFlagUntilTimeout函数的ORE检测疑问
关于STM32 HAL库UART_WaitOnFlagUntilTimeout函数ORE检测的疑问
我正在学习STM32F103RB,对HAL库中的UART_WaitOnFlagUntilTimeout函数存在疑问。当前调用该函数的语句是:
UART_WaitOnFlagUntilTimeout(huart, UART_FLAG_RXNE, RESET, tickstart, Timeout) != HAL_OK
这段代码是在等待RXNE标志为0(即RDR寄存器无接收数据)的过程中检测UART溢出错误(ORE),但我认为溢出错误应该发生在RXNE标志置位的情况下,想确认自己是否存在理解误区。
以下是UART_WaitOnFlagUntilTimeout函数的代码:
static HAL_StatusTypeDef UART_WaitOnFlagUntilTimeout(UART_HandleTypeDef *huart, uint32_t Flag, FlagStatus Status, uint32_t Tickstart, uint32_t Timeout) { /* Wait until flag is set */ while ((__HAL_UART_GET_FLAG(huart, Flag) ? SET : RESET) == Status) { /* Check for the Timeout */ if (Timeout != HAL_MAX_DELAY) { if (((HAL_GetTick() - Tickstart) > Timeout) || (Timeout == 0U)) { return HAL_TIMEOUT; } if ((READ_BIT(huart->Instance->CR1, USART_CR1_RE) != 0U) && (Flag != UART_FLAG_TXE) && (Flag != UART_FLAG_TC)) { if (__HAL_UART_GET_FLAG(huart, UART_FLAG_ORE) == SET) { /* Clear Overrun Error flag*/ __HAL_UART_CLEAR_OREFLAG(huart); /* Blocking error : transfer is aborted Set the UART state ready to be able to start again the process, Disable Rx Interrupts if ongoing */ UART_EndRxTransfer(huart); huart->ErrorCode = HAL_UART_ERROR_ORE; /* Process Unlocked */ __HAL_UNLOCK(huart); return HAL_ERROR; } } } } return HAL_OK; }
误区澄清与函数逻辑解析
首先明确STM32 UART溢出错误(ORE)的触发条件:当UART的接收移位寄存器已经接收到新数据,但RDR寄存器中的前一个数据还未被读取(即RXNE标志置位)时,新数据会覆盖移位寄存器内容,此时ORE标志被置位。
但函数中在等待RXNE为0的循环里检测ORE,是因为**ORE标志不会随RXNE的清除自动复位**,具体原因如下:
- 若之前发生过溢出,
ORE标志被置位,后续程序读取RDR寄存器清除RXNE后,ORE标志仍会保持置位状态。此时进入等待RXNE为0的流程时,函数需要检测这种遗留错误,避免被忽略。 - 在等待
RXNE为0的过程中,如果UART又接收到新数据且来不及处理(比如循环内耗时过长),会先触发RXNE置位,若未及时读取RDR,新数据到来就会触发ORE;即使后续RXNE被清除,ORE依然存在,函数能在循环中检测到该错误。
这段检测逻辑的核心目的是:在任何接收相关的等待流程中,确保没有未处理的溢出错误,及时终止流程并上报错误,避免后续操作基于错误状态执行。
内容的提问来源于stack exchange,提问作者심명선
相关产品推荐
相关产品推荐

