STM32 HAL库串口发送函数HAL_UART_Transmit()分析

STM32 HAL库串口发送函数HAL_UART_Transmit()分析

硬件平台:STM32F103VET6

软件平台:STM32CubeMX 4.22

MDK 5.23

HAL库版本:FW_F1 V1.6.0

以下是分析过程:

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 */
  /*检查有没有一个发送的处理正在运行*/
  /*如果是准备好的状态就判断指针是否为空或者接收到数据的大小是否为0,上述条件满足
   *任意一个就返回错误标志。
   */
  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;
    /*判断数值是否大于0*/
    while(huart->TxXferCount > 0U)
    {
      huart->TxXferCount--;
      /*判断是不是9个字节的长度*/应该是字长是9位数据格式2022.7.20
      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;
        }
      }
      /*不是9个字节长度*/应该是字长是9位数据格式2022.7.20
      else
      {
        /*等待超时标志,如果发送寄存器为空(详见STM32中文参考手册V10),则执行此if函数
         *并返回HAL_TIMEOUT
         */
        if(UART_WaitOnFlagUntilTimeout(huart, UART_FLAG_TXE, RESET, tickstart, Timeout) != HAL_OK)
        {
          return HAL_TIMEOUT;
        }
       /*将数据送给发送数据移位寄存器*/
        huart->Instance->DR = (*pData++ & (uint8_t)0xFF);
      }
    }
    /*等待超时标志,如果发送还未完成(详见STM32中文参考手册V10),则执行此if函数,并
     *返回HAL_TIMEOUT
     */
    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;

    /* Process Unlocked */
    /*处理解锁*/
    __HAL_UNLOCK(huart);
    /*返回HAL_OK成功标志*/
    return HAL_OK;
  }
 /*如果状态不是准备好的状态则返回忙标志*/
  else
  {
    return HAL_BUSY;
  }
}

ST官方手册Description of STM32F1 HAL and Low - layer drivers对于此函数的介绍

这是在写STM32F103VET6基于HAL库(非标准库)关于串口发送时的时候出现了一些问题,将分析函数的过程记录在这里,还会继续更新相关内容。

  • 6
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值