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

関数のソースコード

HAL_StatusTypeDef HAL_UART_Transmit_IT(UART_HandleTypeDef *huart, const uint8_t *pData, uint16_t Size)
{
    
    
  /* Check that a Tx process is not already ongoing */
  if (huart->gState == 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 filled into TDR 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;
      }
    }

    huart->pTxBuffPtr  = pData;
    huart->TxXferSize  = Size;
    huart->TxXferCount = Size;
    huart->TxISR       = NULL;

    huart->ErrorCode = HAL_UART_ERROR_NONE;
    huart->gState = HAL_UART_STATE_BUSY_TX;

    /* Configure Tx interrupt processing */
    if (huart->FifoMode == UART_FIFOMODE_ENABLE)
    {
    
    
      /* Set the Tx ISR function pointer according to the data word length */
      if ((huart->Init.WordLength == UART_WORDLENGTH_9B) && (huart->Init.Parity == UART_PARITY_NONE))
      {
    
    
        huart->TxISR = UART_TxISR_16BIT_FIFOEN;
      }
      else
      {
    
    
        huart->TxISR = UART_TxISR_8BIT_FIFOEN;
      }

      /* Enable the TX FIFO threshold interrupt */
      ATOMIC_SET_BIT(huart->Instance->CR3, USART_CR3_TXFTIE);
    }
    else
    {
    
    
      /* Set the Tx ISR function pointer according to the data word length */
      if ((huart->Init.WordLength == UART_WORDLENGTH_9B) && (huart->Init.Parity == UART_PARITY_NONE))
      {
    
    
        huart->TxISR = UART_TxISR_16BIT;
      }
      else
      {
    
    
        huart->TxISR = UART_TxISR_8BIT;
      }

      /* Enable the Transmit Data Register Empty interrupt */
      ATOMIC_SET_BIT(huart->Instance->CR1, USART_CR1_TXEIE_TXFNFIE);
    }

    return HAL_OK;
  }
  else
  {
    
    
    return HAL_BUSY;
  }
}

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

HAL_UART_Transmit_IT関数の使用方法は次のとおりです。

入力パラメータ:

  • huart: 使用する UART ペリフェラルを指定するために使用される UART ハンドル構造体へのポインタ。
  • pData: 送信するデータのバッファへのポインタ。uint8_tタイプまたはuint16_tタイプのデータを指定できます。
  • Size: 送信するデータのサイズ。データ要素 (uint8_tまたはuint16_t) の数で表されます。

戻り値:

  • HAL_StatusTypeDef関数の実行ステータスを表す型の戻り値。考えられる戻り値は次のとおりです。
    • HAL_OK: 送信操作が正常に開始されました。
    • HAL_BUSY:現在送信操作中です。
    • HAL_ERROR: 渡されたパラメータは無効です。

関数の内容:

  • 割り込みモードでデータを送信します。この関数は UART のステータスをチェックし、現在進行中の送信操作がある場合は、ビジー ステータスを返します。次に、受信データ バッファ ポインタとデータ サイズが正当であるかどうかをチェックし、正当でない場合はエラー ステータスを返します。
  • パラメータが正当な場合、関数は UART ハンドル構造体のメンバー変数を設定し、FIFO モードと UART のデータ長に従って対応する割り込みサービス ルーチンの関数ポインタを選択し、対応する割り込みを有効にします。
  • 最後に、関数は送信操作の開始ステータスを示すステータス値を返します。

この関数を使用する場合、有効な UART ハンドル構造体を作成し、それを最初のパラメーターとして関数に渡す必要があります。さらに、有効なデータ バッファ ポインタとデータ サイズを指定する必要があります。

この機能を使用する前に、ボー レート、データ ビット、ストップ ビット、パリティ、その他のパラメーターの設定を含む UART 構成を初期化する必要があります。また、UART の割り込みが正しく構成されていることを確認し、送信完了やエラーなどのイベントを処理するために対応する割り込みサービス ルーチンを実装する必要もあります。

関数関数

上記のコードは、割り込みモードでデータを送信するための HAL ライブラリの関数ですHAL_UART_Transmit_IT

HAL_UART_Transmit_ITこの関数の機能は、割り込みモードでデータを送信することです。これは、UART ハンドル構造体へのポインタhuart、送信されるデータのバッファへのポインタpData、および送信されるデータのサイズを受け入れますSize

この関数はまず UART のステータスをチェックし、現在進行中の送信操作がある場合はHAL_BUSYビジーを返します。次に、受信データ バッファ ポインタとデータ サイズをチェックし、それらが無効な場合 (NULL またはサイズ 0) を返しますHAL_ERROR

次に、この関数は、送信バッファ ポインタ、送信データのサイズ、送信される残りのデータのサイズ、送信割り込みサービス ルーチンの関数ポインタ、エラーなどのいくつかのメンバー変数を UART ハンドル構造体に設定します。コードと UART ステータス。

UART の FIFO モードとデータ長に従って、関数は対応する割り込みサービス ルーチンの関数ポインタを選択し、対応する割り込みをイネーブルします。FIFO モードが有効な場合、関数は TX FIFO しきい値割り込みを有効にし、FIFO モードが有効でない場合、関数は送信データ レジスタ空割り込みを有効にします。

最後に、関数は戻り、HAL_OK送信操作が正常に開始されたことを示します。

全体として、HAL_UART_Transmit_ITこの関数により割り込みモードでデータを送信できます。データの非同期送信は、割り込みサービス ルーチンを構成し、対応する割り込みを有効にすることで実現できます。これにより、メインスレッドのブロックが回避され、システムの応答性が向上します。

関数を一行ずつ

コードの各行の詳細な説明は次のとおりです。

HAL_StatusTypeDef HAL_UART_Transmit_IT(UART_HandleTypeDef *huart, const uint8_t *pData, uint16_t Size)

以下に関数の定義を示します。この関数は、UART_HandleTypeDef構造体へのポインタhuart、送信するデータのバッファへのポインタpData、および送信するデータのサイズを受け取りますSizeHAL_StatusTypeDef型の状態を返します。

if (huart->gState == HAL_UART_STATE_READY)

このコード行は、UART の状態が次であるかどうか、つまりHAL_UART_STATE_READY進行中の送信プロセスがないかどうかをチェックします。UART ステータスが でない場合はREADY、現在送信操作が進行中であることを意味し、関数は を返しますHAL_BUSY

if ((pData == NULL) || (Size == 0U))
{
    
    
  return HAL_ERROR;
}

このコード行は、送信するデータ バッファー ポインターがpDataNULL かどうか、およびSize送信するデータ サイズが 0 かどうかをチェックします。「はい」の場合は、それを返しますHAL_ERROR

if ((huart->Init.WordLength == UART_WORDLENGTH_9B) && (huart->Init.Parity == UART_PARITY_NONE))
{
    
    
  if ((((uint32_t)pData) & 1U) != 0U)
  {
    
    
    return  HAL_ERROR;
  }
}

このコードは、9 ビットのデータ長でパリティなしを使用する場合に、pDataデータ バッファー ポインターが u16 境界上に配置されていることをチェックします。境界が揃っていない場合は返しますHAL_ERROR

huart->pTxBuffPtr  = pData;
huart->TxXferSize  = Size;
huart->TxXferCount = Size;
huart->TxISR       = NULL;

huart->ErrorCode = HAL_UART_ERROR_NONE;
huart->gState = HAL_UART_STATE_BUSY_TX;

pTxBuffPtrこれらのコードは、送信バッファ ポインタ、送信データのサイズTxXferSize、送信される残りのデータのサイズTxXferCount、送信割り込みサービス ルーチンの関数ポインタTxISR、エラー コードなど、UART ハンドル構造内のいくつかのメンバ変数を設定します。UARTのステータス。

if (huart->FifoMode == UART_FIFOMODE_ENABLE)
{
    
    
  if ((huart->Init.WordLength == UART_WORDLENGTH_9B) && (huart->Init.Parity == UART_PARITY_NONE))
  {
    
    
    huart->TxISR = UART_TxISR_16BIT_FIFOEN;
  }
  else
  {
    
    
    huart->TxISR = UART_TxISR_8BIT_FIFOEN;
  }

  ATOMIC_SET_BIT(huart->Instance->CR3, USART_CR3_TXFTIE);
}
else
{
    
    
  if ((huart->Init.WordLength == UART_WORDLENGTH_9B) && (huart->Init.Parity == UART_PARITY_NONE))
  {
    
    
    huart->TxISR = UART_TxISR_16BIT;
  }
  else
  {
    
    
    huart->TxISR = UART_TxISR_8BIT;
  }

  ATOMIC_SET_BIT(huart->Instance->CR1, USART_CR1_TXEIE_TXFNFIE);
}

コードのこの部分は、FIFO モードと UART のデータ長に従って割り込みサービス ルーチンの関数ポインタを設定しTxISR、対応する割り込みを有効にします。FIFO モードが有効な場合は、データ長に応じて 16 ビットまたは 8 ビット割り込みサービス ルーチンを選択し、TX FIFO しきい値割り込みを有効にします。FIFO モードが有効でない場合は、データ長に応じて 16 ビットまたは 8 ビット割り込みサービスルーチンを選択し、送信データレジスタのエンプティ割り込みを有効にします。

最後に、関数は戻り、HAL_OK送信操作が正常に開始されたことを示します。

おすすめ

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