Diretório de artigos
código-fonte da função
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;
}
}
Explicação detalhada do uso da função
HAL_UART_Transmit_IT
O uso da função é o seguinte:
Parâmetros de entrada:
huart
: Ponteiro para a estrutura do identificador UART, que é usado para especificar o periférico UART a ser usado.pData
: Ponteiro para o buffer dos dados a serem enviados, que podem seruint8_t
do tipo ouuint16_t
dados do tipo.Size
: O tamanho dos dados a enviar, expresso no número de elementos de dados (uint8_t
ouuint16_t
).
valor de retorno:
HAL_StatusTypeDef
Um valor de retorno do tipo que representa o status de execução da função. Os possíveis valores de retorno incluem:HAL_OK
: A operação de envio foi iniciada com sucesso.HAL_BUSY
: Existe uma operação de envio em andamento.HAL_ERROR
: O parâmetro passado é inválido.
O que a função faz:
- Enviar dados no modo de interrupção. A função verificará o status do UART, se houver uma operação de envio em andamento, retornará o status ocupado. Em seguida, ele verifica se o ponteiro do buffer de dados de entrada e o tamanho dos dados são legais e, caso contrário, retorna um status de erro.
- Se os parâmetros forem legais, a função definirá as variáveis de membro na estrutura do identificador UART e selecionará o ponteiro de função da rotina de serviço de interrupção correspondente de acordo com o modo FIFO e o comprimento de dados do UART e ativará a interrupção correspondente.
- Por fim, a função retorna um valor de status indicando o status inicial da operação de envio.
Ao usar esta função, você precisa criar uma estrutura de identificador UART válida e passá-la para a função como o primeiro parâmetro. Além disso, você precisa fornecer um ponteiro de buffer de dados válido e um tamanho de dados.
Antes de usar esta função, você precisa inicializar a configuração UART, incluindo as configurações de taxa de transmissão, bits de dados, bits de parada, paridade e outros parâmetros. Você também precisa ter certeza de que as interrupções do UART estão configuradas corretamente e implementar a rotina de serviço de interrupção correspondente para lidar com eventos como conclusão de transmissão e erros.
função função
O código acima é uma função da biblioteca HAL HAL_UART_Transmit_IT
para enviar dados no modo de interrupção.
HAL_UART_Transmit_IT
A função da função é enviar dados no modo de interrupção. Ele aceita um ponteiro para a estrutura de identificador UART huart
, um ponteiro para o buffer dos dados a serem enviados pData
e o tamanho dos dados a serem enviados Size
.
A função primeiro verifica o status do UART, se houver uma operação de envio em andamento, ele retornará HAL_BUSY
ocupado. Em seguida, ele verifica o ponteiro do buffer de dados de entrada e o tamanho dos dados e retorna se eles são inválidos (NULL ou tamanho 0) HAL_ERROR
.
Em seguida, a função define algumas variáveis de membro na estrutura de manipulação UART, incluindo o ponteiro do buffer de envio, o tamanho dos dados enviados, o tamanho dos dados restantes a serem enviados, o ponteiro de função da rotina de serviço de interrupção de envio e o erro código e status UART.
De acordo com o modo FIFO e comprimento de dados do UART, a função seleciona o ponteiro de função da rotina de serviço de interrupção correspondente e habilita a interrupção correspondente. Se o modo FIFO estiver habilitado, a função habilitará a interrupção do limite TX FIFO; se o modo FIFO não estiver habilitado, a função habilitará a interrupção vazia do registro de dados de transmissão.
Por fim, a função retorna HAL_OK
para indicar que a operação de envio foi iniciada com sucesso.
Em suma, HAL_UART_Transmit_IT
a função permite que os dados sejam enviados no modo de interrupção, e o envio assíncrono de dados pode ser realizado configurando a rotina de serviço de interrupção e habilitando a interrupção correspondente. Isso pode evitar o bloqueio do thread principal e melhorar a capacidade de resposta do sistema.
função linha por linha
Aqui está uma explicação detalhada de cada linha de código:
HAL_StatusTypeDef HAL_UART_Transmit_IT(UART_HandleTypeDef *huart, const uint8_t *pData, uint16_t Size)
Aqui está a definição da função, que leva um UART_HandleTypeDef
ponteiro para uma estrutura huart
, um ponteiro para um buffer para os dados a serem enviados pData
e o tamanho dos dados a serem enviados Size
. Ele retorna HAL_StatusTypeDef
o estado de um tipo.
if (huart->gState == HAL_UART_STATE_READY)
Esta linha de código verifica se o estado do UART é, ou seja, HAL_UART_STATE_READY
se não há nenhum processo de transmissão em andamento. Se o status UART não for READY
, significa que há uma operação de envio em andamento e a função retornará HAL_BUSY
.
if ((pData == NULL) || (Size == 0U))
{
return HAL_ERROR;
}
Essa linha de código verifica se o ponteiro do buffer de dados a ser enviado pData
é NULL e Size
se o tamanho dos dados a serem enviados é 0. Se sim, devolva HAL_ERROR
.
if ((huart->Init.WordLength == UART_WORDLENGTH_9B) && (huart->Init.Parity == UART_PARITY_NONE))
{
if ((((uint32_t)pData) & 1U) != 0U)
{
return HAL_ERROR;
}
}
pData
Este código verifica se o ponteiro do buffer de dados está alinhado em um limite u16 ao usar um comprimento de dados de 9 bits e sem paridade . Retorna se os limites não estiverem alinhados 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;
Esses códigos definem algumas variáveis de membro na estrutura de manipulação UART, incluindo o ponteiro do buffer de envio pTxBuffPtr
, o tamanho dos dados enviados TxXferSize
, o tamanho dos dados restantes a serem enviados TxXferCount
, o ponteiro de função da rotina de serviço de interrupção de envio TxISR
e o código de erro e estado 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);
}
Esta parte do código define o ponteiro de função da rotina de serviço de interrupção de acordo com o modo FIFO e comprimento de dados do UART TxISR
e habilita a interrupção correspondente. Se o modo FIFO estiver habilitado, selecione a rotina de serviço de interrupção de 16 bits ou 8 bits de acordo com o comprimento dos dados e habilite a interrupção de limite TX FIFO. Se o modo FIFO não estiver habilitado, selecione também a rotina de serviço de interrupção de 16 bits ou 8 bits de acordo com o comprimento dos dados e habilite a interrupção vazia do registro de envio de dados.
Por fim, a função retorna HAL_OK
para indicar que a operação de envio foi iniciada com sucesso.