You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

关于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,提问作者심명선

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.16 20:10:12