STM32 HAL库函数——HAL_UART_Transmit_IT()详解

这篇具有很好参考价值的文章主要介绍了STM32 HAL库函数——HAL_UART_Transmit_IT()详解。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

函数源代码

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_tuint16_t)的数量表示。

返回值:

  • HAL_StatusTypeDef类型的返回值,表示函数的执行状态。可能的返回值包括:
    • HAL_OK:发送操作已成功启动。
    • HAL_BUSY:当前有正在进行的发送操作。
    • HAL_ERROR:传入的参数不合法。

函数的作用:

  • 以中断模式发送数据。函数会检查UART的状态,如果当前有正在进行的发送操作,则返回忙碌状态。然后,它会检查传入的数据缓冲区指针和数据大小是否合法,如果不合法,则返回错误状态。
  • 如果参数合法,函数会设置UART句柄结构体中的成员变量,并根据UART的FIFO模式和数据长度选择相应的中断服务程序的函数指针,并使能相应的中断。
  • 最后,函数返回状态值表示发送操作的启动状态。

使用该函数时,你需要先创建一个有效的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表示发送操作已成功启动。文章来源地址https://www.toymoban.com/news/detail-716619.html

总而言之,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;

这些代码设置了UART句柄结构体中的一些成员变量,包括发送缓冲区指针 pTxBuffPtr、发送的数据大小 TxXferSize、剩余待发送的数据大小 TxXferCount、发送中断服务程序的函数指针 TxISR,以及错误码和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);
}

这部分代码根据UART的FIFO模式和数据长度设置中断服务程序的函数指针 TxISR,并使能相应的中断。如果FIFO模式使能,根据数据长度选择16位或8位的中断服务程序,并使能TX FIFO阈值中断。如果FIFO模式未使能,同样根据数据长度选择16位或8位的中断服务程序,并使能发送数据寄存器空中断。

最后,函数返回HAL_OK表示发送操作已成功启动。

到了这里,关于STM32 HAL库函数——HAL_UART_Transmit_IT()详解的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • STM32 HAL库函数——HAL_UART_RxCpltCallback()详解

    HAL_UART_RxCpltCallback 是一个回调函数,用于在使用 HAL 库进行串口接收时处理接收完成事件。当使用 HAL_UART_Receive_IT 函数启动串口接收并且接收到指定数量的数据后,HAL 库会自动调用 HAL_UART_RxCpltCallback 函数。 回调函数是一种特殊的函数,它在特定事件发生时由系统或库调用,

    2024年02月13日
    浏览(36)
  • STM32 HAL库函数——HAL_TIM_Base_Start_IT()详解

    以STM32G030C8T6中的HAL_TIM_Base_Start_IT()函数为例,进行解释; 函数原型: 函数原型: 该函数用于 启动定时器的中断模式 。在使用该函数之前,需要先初始化好定时器的配置,并将相关的中断处理函数注册到对应的中断向量中。 htim:指向TIM_HandleTypeDef结构体的指针,包含了定时

    2024年02月04日
    浏览(36)
  • STM32 串口接收不定长数据 HAL_UART_Receive_IT (帧头帧尾)

    最近使用sw4stm32调试串口时发现串口接收不定长数据很不方便,这里是帧头帧尾的接收方式,欢迎大佬指导。 这里要用串口中断接收的数据帧帧头为0xEB,帧尾为0XBE 这里是其中定义的变量  主函数里打开串口接收中断 然后串口接收处理部分全都写在的回调函数中。

    2024年01月19日
    浏览(44)
  • 通过修改HAL_UART_Transmit_DMA()函数,解决串口发送DMA只能发送一次的问题

    废话不多说,先上代码: 在 stm32f1xx_hal_uart.c 文件中找到HAL_UART_Transmit_DMA()函数实现,在 解锁操作__HAL_UNLOCK;后添加代码:huart - gState = HAL_UART_STATE_READY;  编译以后运行完美解决。而且在低延迟的高速while循环中反复调用串口DMA请求,都可以运行。 HAL_UART_Transmit_DMA()函数

    2024年02月13日
    浏览(51)
  • STM32CubeMX-HAL库-UART串口接收中断回调函数代码分析

            CubeMx中HAL库函数的调用不同于库函数调用,在学习CubeMx串口通信时,不理解HAL库中的回调函数是怎么被调用的,于是查看每个的定义,参考其他人写的博客,总算弄明白了HAL库中断调用与库函数不同之处。写下这篇博客一是加深自己的理解,二是希望对不理解HA

    2024年02月02日
    浏览(51)
  • 【STM32+HAL库+CubeMX】UART轮询收发、中断收发、DMA收发方法及空闲中断详解

    Author: DrinkCat(szt@drinkcat.com) Copyright © 2023 DrinkCat Original link: DrinkCat’s Blog UART是一种异步串行通信接口,常用于通过串口与外部设备进行通信。它通过发送和接收数据帧来实现数据传输,使用起来相对简单。UART通常包含发送器(Transmitter)和接收器(Receiver),通过两根信号线

    2024年02月10日
    浏览(37)
  • 完美解决HAL库HAL_UART_Transmit_DMA()不延时就发不了下一条的问题

    问题原因 在连续用HAL_UART_Transmit_DMA()函数的时候,会遇到只能发出第一条的问题,原因是DMA传输数据到串口这个外设太快了,传输完后程序并不会在该处停留,但是串口发送需要时间,运行到下一条HAL_UART_Transmit_DMA()函数的时候,上一条数据还没来得及发完,导致串处于

    2024年02月11日
    浏览(35)
  • STM32 HAL库的串口中断服务函数详解

    最近在实现利用上位机通过串口发送指令给下位机执行操作的实验,在之前学习串口的过程中我就一直有一个疑惑,那就是为什么在串口中断回调函数内除了要加上自己的操作以外还要在末尾再执行一次 接收中断 ,在查阅了一些资料后我才发现原来和 中断服务函数 有关 我

    2024年02月10日
    浏览(39)
  • STM32 HAL库 STM32CubeMx -- 串口的使用(USART/UART)

    在上一篇博客里面写了串口通信的理论知识,在这一篇中将讲述串口通信在STM32CubeMx里面的配置,以及在函数里面怎么使用。 对于串口发送信息,分为三种方法: 串口阻塞方式收发 、 串口中断方式收发 、 串口DMA方式收发 。(DMA方式在之后的DMA章节讲解) 关于STM32CubeMx的基

    2024年02月06日
    浏览(68)
  • stm32 笔记 UART读取及HAL库应用

     由此图可知: 采用HAL库,中断方式接收串口,只有当RxXferCount == 0 时,也就是调用这个函数,接收指定量的数据大小完成时,才会调用回调函数HAL_UART_RxCpltCallback()。 而且,RxXferCount == 0 后,也会使得中断退出,此时需要从新设置 HAL_UART_Receive_IT() 开启中断。 这里还需要注意

    2024年02月15日
    浏览(46)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包