STM32 HALライブラリ関数 - HAL_UART_Receive_IT()の詳細説明

関数のソースコード

/**
  * @brief Receive an amount of data in interrupt mode.
  * @note   When UART parity is not enabled (PCE = 0), and Word Length is configured to 9 bits (M1-M0 = 01),
  *         the received data is handled as a set of u16. In this case, Size must indicate the number
  *         of u16 available through pData.
  * @note   When UART parity is not enabled (PCE = 0), and Word Length is configured to 9 bits (M1-M0 = 01),
  *         address of user data buffer for storing data to be received, should be aligned on a half word frontier
  *         (16 bits) (as received data will be handled using u16 pointer cast). Depending on compilation chain,
  *         use of specific alignment compilation directives or pragmas might be required
  *         to ensure proper alignment for pData.
  * @param huart UART handle.
  * @param pData Pointer to data buffer (u8 or u16 data elements).
  * @param Size  Amount of data elements (u8 or u16) to be received.
  * @retval HAL status
  */
HAL_StatusTypeDef HAL_UART_Receive_IT(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size)
{
    
    
  /* Check that a Rx process is not already ongoing */
  if (huart->RxState == HAL_UART_STATE_READY)
  {
    
    
    if ((pData == NULL) || (Size == 0U))
    {
    
    
      return HAL_ERROR;
    }

    /* In case of 9bits/No Parity transfer, pData buffer provided as input parameter
       should be aligned on a u16 frontier, as data to be received from RDR will be
       handled through a u16 cast. */
    if ((huart->Init.WordLength == UART_WORDLENGTH_9B) && (huart->Init.Parity == UART_PARITY_NONE))
    {
    
    
      if ((((uint32_t)pData) & 1U) != 0U)
      {
    
    
        return  HAL_ERROR;
      }
    }

    /* Set Reception type to Standard reception */
    huart->ReceptionType = HAL_UART_RECEPTION_STANDARD;

    if (!(IS_LPUART_INSTANCE(huart->Instance)))
    {
    
    
      /* Check that USART RTOEN bit is set */
      if (READ_BIT(huart->Instance->CR2, USART_CR2_RTOEN) != 0U)
      {
    
    
        /* Enable the UART Receiver Timeout Interrupt */
        ATOMIC_SET_BIT(huart->Instance->CR1, USART_CR1_RTOIE);
      }
    }

    return (UART_Start_Receive_IT(huart, pData, Size));
  }
  else
  {
    
    
    return HAL_BUSY;
  }
}

機能の使い方を詳しく解説

HAL_StatusTypeDef HAL_UART_Receive_IT(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size)
  • huart: UART ハンドル。使用する UART ペリフェラルを指します。
  • pData: 受信したデータを格納するために使用されるデータ バッファへのポインタ。
  • Size: 受信するデータ要素 (u8 または u16) の数。

戻り値の型は でHAL_StatusTypeDef、関数の実行ステータスを示します。考えられる戻り値は次のとおりです。

  • HAL_OK: 関数は正常に実行されました。
  • HAL_ERROR: 関数の実行中にエラーが発生しました。
  • HAL_BUSY:すでに受信処理中のため、機能を実行できません。

この機能を使用する場合は、次の手順に従う必要があります。

  1. 構造変数のタイプを作成しUART_HandleTypeDef、UART ペリフェラルのパラメータ (ボー レート、ワード長、パリティなど) の構成を含めて初期化します。
  2. 受信したデータを格納するデータバッファを作成します。
  3. この関数を呼び出してHAL_UART_Receive_IT、UART ハンドル、データ バッファ ポインタ、および受信するデータの量をパラメータとして渡します。
  4. 関数の戻り値に基づいて、操作が成功したかどうかを判断します。

関数の実行中には、受信処理が既に進行中かどうかの確認、データバッファのポインタやデータサイズが正当かどうかの確認など、一連のチェックが行われます。チェックが失敗した場合、関数は適切なエラー ステータスを返します。

なお、本関数は割り込みモードで受信動作を行うため、データを受信すると割り込みが発生し、割り込みサービス関数によりデータ処理が行われます。

関数を一行ずつ

  • HAL_UART_Receive_ITこの関数は、割り込みモードで一定量のデータを受信するために使用されます。
  • まず、関数は受信プロセスがすでに進行中かどうかを確認し、進行中の場合はビジー ステータスを返します。
  • 次に、関数は渡されたデータ バッファ ポインタとデータ サイズが正当であるかどうかをチェックし、正当でない場合はエラー ステータスを返します。
  • pData9 ビット/パリティなし転送が使用され、受信データのワード長が 9 ビット (M1-M0 = 01) に設定されている場合、バッファ ポインタはu16 境界上に配置される必要があります。 RDR レジスタは u16 タイプを処理に渡します。位置合わせが正しくない場合は、エラー ステータスを返します。
  • 受信タイプを標準受信に設定します。
  • 非 LPUART インスタンスの場合は、USART の RTOEN ビットが設定されているかどうかを確認してください。RTOEN ビットがセットされると、UART 受信タイムアウト割り込みが有効になります。
  • 最後に、呼び出し側UART_Start_Receive_IT関数は受信操作を開始し、適切なステータス値を返します。
HAL_StatusTypeDef HAL_UART_Receive_IT(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size)
{
    
    
  /* Check that a Rx process is not already ongoing */
  if (huart->RxState == HAL_UART_STATE_READY) // 检查接收过程是否已经在进行中
  {
    
    
    if ((pData == NULL) || (Size == 0U)) // 检查数据缓冲区指针和数据大小是否合法
    {
    
    
      return HAL_ERROR; // 返回错误状态
    }

    /* In case of 9bits/No Parity transfer, pData buffer provided as input parameter
       should be aligned on a u16 frontier, as data to be received from RDR will be
       handled through a u16 cast. */
    if ((huart->Init.WordLength == UART_WORDLENGTH_9B) && (huart->Init.Parity == UART_PARITY_NONE)) // 检查是否使用9位/无奇偶校验传输
    {
    
    
      if ((((uint32_t)pData) & 1U) != 0U) // 检查pData缓冲区指针是否按照u16边界对齐
      {
    
    
        return  HAL_ERROR; // 返回错误状态
      }
    }

    /* Set Reception type to Standard reception */
    huart->ReceptionType = HAL_UART_RECEPTION_STANDARD; // 设置接收类型为标准接收

    if (!(IS_LPUART_INSTANCE(huart->Instance))) // 检查是否为LPUART实例
    {
    
    
      /* Check that USART RTOEN bit is set */
      if (READ_BIT(huart->Instance->CR2, USART_CR2_RTOEN) != 0U) // 检查USART的RTOEN位是否设置
      {
    
    
        /* Enable the UART Receiver Timeout Interrupt */
        ATOMIC_SET_BIT(huart->Instance->CR1, USART_CR1_RTOIE); // 使能UART接收超时中断
      }
    }

    return (UART_Start_Receive_IT(huart, pData, Size)); // 调用UART_Start_Receive_IT函数启动接收操作,并返回相应的状态值
  }
  else
  {
    
    
    return HAL_BUSY; // 返回忙碌状态
  }
}

おすすめ

転載: blog.csdn.net/AnChenliang_1002/article/details/131783668