記事ディレクトリ
関数のソースコード
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
、および送信するデータのサイズを受け取りますSize
。HAL_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;
}
このコード行は、送信するデータ バッファー ポインターがpData
NULL かどうか、および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
送信操作が正常に開始されたことを示します。