Função da biblioteca STM32 HAL - explicação detalhada de HAL_UART_Transmit_IT()

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_ITO 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 ser uint8_tdo tipo ou uint16_tdados do tipo.
  • Size: O tamanho dos dados a enviar, expresso no número de elementos de dados ( uint8_tou uint16_t).

valor de retorno:

  • HAL_StatusTypeDefUm 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_ITpara enviar dados no modo de interrupção.

HAL_UART_Transmit_ITA 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 pDatae 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_BUSYocupado. 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_OKpara indicar que a operação de envio foi iniciada com sucesso.

Em suma, HAL_UART_Transmit_ITa 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_HandleTypeDefponteiro para uma estrutura huart, um ponteiro para um buffer para os dados a serem enviados pDatae o tamanho dos dados a serem enviados Size. Ele retorna HAL_StatusTypeDefo 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_READYse 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 Sizese 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;
  }
}

pDataEste 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 TxISRe 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 TxISRe 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_OKpara indicar que a operação de envio foi iniciada com sucesso.

Acho que você gosta

Origin blog.csdn.net/AnChenliang_1002/article/details/131780092
Recomendado
Clasificación