HAL_UART_Transmit函数底层实现

目录

底层代码

代码实现讲解

代码细节


 底层代码

HAL_StatusTypeDef HAL_UART_Transmit(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size, uint32_t Timeout)
{
  uint16_t *tmp;
  uint32_t tickstart = 0U;

  /* Check that a Tx process is not already ongoing */
  if (huart->gState == HAL_UART_STATE_READY)
  {
    if ((pData == NULL) || (Size == 0U))
    {
      return  HAL_ERROR;
    }

    /* Process Locked */
    __HAL_LOCK(huart);

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

    /* Init tickstart for timeout managment */
    tickstart = HAL_GetTick();

    huart->TxXferSize = Size;
    huart->TxXferCount = Size;

    /* Process Unlocked */
    __HAL_UNLOCK(huart);

    while (huart->TxXferCount > 0U)
    {
      huart->TxXferCount--;
      if (huart->Init.WordLength == UART_WORDLENGTH_9B)
      {
        if (UART_WaitOnFlagUntilTimeout(huart, UART_FLAG_TXE, RESET, tickstart, Timeout) != HAL_OK)
        {
          return HAL_TIMEOUT;
        }
        tmp = (uint16_t *) pData;
        huart->Instance->DR = (*tmp & (uint16_t)0x01FF);
        if (huart->Init.Parity == UART_PARITY_NONE)
        {
          pData += 2U;
        }
        else
        {
          pData += 1U;
        }
      }
      else
      {
        if (UART_WaitOnFlagUntilTimeout(huart, UART_FLAG_TXE, RESET, tickstart, Timeout) != HAL_OK)
        {
          return HAL_TIMEOUT;
        }
        huart->Instance->DR = (*pData++ & (uint8_t)0xFF);
      }
    }

    if (UART_WaitOnFlagUntilTimeout(huart, UART_FLAG_TC, RESET, tickstart, Timeout) != HAL_OK)
    {
      return HAL_TIMEOUT;
    }

    /* At end of Tx process, restore huart->gState to Ready */
    huart->gState = HAL_UART_STATE_READY;

    return HAL_OK;
  }
  else
  {
    return HAL_BUSY;
  }
}

 

代码实现讲解

HAL_StatusTypeDef HAL_UART_Transmit(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size, uint32_t Timeout)

返回值:HAL_StatusTypeDef:返回值为HAL_OK、HAL_ERROR、HAL_LOCK、HAL_TIMEOUT等

参数:

        UART_HandleTypeDef *huart:UART的别名,如UART_HandleTypeDef huart1;   别名就是huart1;查看系统定义的句柄结构体

        *pData:需要发送的数据

        uint16_t Size:发送数据的大小

        uint32_t Timeout:最大发送时间,发送数据超过该时间退出发送 

代码细节(代码历程)

检查有没有正在进行的发送进程-->如果UART的状态是HAL_UART_STATE_READY,那么单片机就检查数据的指针和大小,如果指针为NULL或者接收到的数据大小为0,任意满足其中的一个则返回错误标志(HAL_ERROR)

  • 2
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
HAL_UART_Transmit函数HAL库中UART传输数据的函数,用于向UART外设发送数据。该函数的原型如下: ``` HAL_StatusTypeDef HAL_UART_Transmit(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size, uint32_t Timeout); ``` 参数说明: - huartUART句柄,包含了UART外设的配置信息,可以通过HAL_UART_Init函数进行初始化。 - pData:指向要发送的数据缓冲区的指针。 - Size:要发送的数据字节数。 - Timeout:发送超时时间,单位为毫秒。 函数返回值说明: 该函数返回类型为HAL_StatusTypeDef,表示函数执行的状态,包括: - HAL_OK:函数执行成功。 - HAL_BUSY:UART外设正在进行发送操作。 - HAL_TIMEOUT:发送超时。 函数实现说明: 该函数实现包括以下步骤: 1. 判断UART外设是否已经初始化。 2. 判断UART外设是否正在进行发送操作。 3. 设置UART发送标志位并入数据到数据寄存器。 4. 等待数据发送完成或超时。 示例代码: 下面是一个使用HAL_UART_Transmit函数发送数据的示例代码: ``` #include "stm32f1xx_hal.h" UART_HandleTypeDef huart2; void MX_USART2_UART_Init(void) { huart2.Instance = USART2; huart2.Init.BaudRate = 115200; huart2.Init.WordLength = UART_WORDLENGTH_8B; huart2.Init.StopBits = UART_STOPBITS_1; huart2.Init.Parity = UART_PARITY_NONE; huart2.Init.Mode = UART_MODE_TX_RX; huart2.Init.HwFlowCtl = UART_HWCONTROL_NONE; huart2.Init.OverSampling = UART_OVERSAMPLING_16; if (HAL_UART_Init(&huart2) != HAL_OK) { Error_Handler(); } } void send_data(uint8_t *data, uint16_t size) { if (HAL_UART_Transmit(&huart2, data, size, 1000) != HAL_OK) { Error_Handler(); } } int main(void) { HAL_Init(); MX_USART2_UART_Init(); uint8_t data[] = "Hello, World!"; uint16_t size = sizeof(data); while (1) { send_data(data, size); HAL_Delay(1000); } } ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值