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

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

函数源代码

/**
  * @brief Receive an amount of data in interrupt mode.
  * @note   When UART parity is not enabled (PCE = 0), and Word Length is configured to 9 bits (M1-M0 = 01),
  *         the received data is handled as a set of u16. In this case, Size must indicate the number
  *         of u16 available through pData.
  * @note   When UART parity is not enabled (PCE = 0), and Word Length is configured to 9 bits (M1-M0 = 01),
  *         address of user data buffer for storing data to be received, should be aligned on a half word frontier
  *         (16 bits) (as received data will be handled using u16 pointer cast). Depending on compilation chain,
  *         use of specific alignment compilation directives or pragmas might be required
  *         to ensure proper alignment for pData.
  * @param huart UART handle.
  * @param pData Pointer to data buffer (u8 or u16 data elements).
  * @param Size  Amount of data elements (u8 or u16) to be received.
  * @retval HAL status
  */
HAL_StatusTypeDef HAL_UART_Receive_IT(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size)
{
  /* Check that a Rx process is not already ongoing */
  if (huart->RxState == 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 received from RDR 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;
      }
    }

    /* Set Reception type to Standard reception */
    huart->ReceptionType = HAL_UART_RECEPTION_STANDARD;

    if (!(IS_LPUART_INSTANCE(huart->Instance)))
    {
      /* Check that USART RTOEN bit is set */
      if (READ_BIT(huart->Instance->CR2, USART_CR2_RTOEN) != 0U)
      {
        /* Enable the UART Receiver Timeout Interrupt */
        ATOMIC_SET_BIT(huart->Instance->CR1, USART_CR1_RTOIE);
      }
    }

    return (UART_Start_Receive_IT(huart, pData, Size));
  }
  else
  {
    return HAL_BUSY;
  }
}

函数用法详解

HAL_StatusTypeDef HAL_UART_Receive_IT(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size)
  • huart:UART句柄,指向要使用的UART外设。
  • pData:指向数据缓冲区的指针,用于存储接收到的数据。
  • Size:要接收的数据元素(u8或u16)的数量。

返回值类型为HAL_StatusTypeDef,表示函数执行的状态。可能的返回值有:

  • HAL_OK:函数执行成功。
  • HAL_ERROR:函数执行过程中发生错误。
  • HAL_BUSY:接收过程已经在进行中,函数无法执行。

使用该函数时,需要按照以下步骤进行操作:

  1. 创建一个UART_HandleTypeDef类型的结构体变量,并对其进行初始化,包括配置UART外设的参数(如波特率、字长、奇偶校验等)。
  2. 创建一个数据缓冲区,用于存储接收到的数据。
  3. 调用HAL_UART_Receive_IT函数,传入UART句柄、数据缓冲区指针和要接收的数据数量作为参数。
  4. 根据函数的返回值判断操作是否成功。

在函数执行期间,会进行一系列的检查,包括检查接收过程是否已经在进行中、检查数据缓冲区指针和数据大小是否合法等。如果检查失败,函数会返回相应的错误状态。

需要注意的是,该函数是在中断模式下进行接收操作的,因此在接收到数据时会触发中断,并通过中断服务函数进行数据处理。文章来源地址https://www.toymoban.com/news/detail-718503.html

函数逐行解释

  • HAL_UART_Receive_IT函数用于在中断模式下接收一定量的数据。
  • 首先,函数检查接收过程是否已经在进行中,如果是,则返回忙碌状态。
  • 接下来,函数检查传入的数据缓冲区指针和数据大小是否合法,如果不合法,则返回错误状态。
  • 如果使用9位/无奇偶校验传输,并且接收数据的字长配置为9位(M1-M0 = 01),则要求pData缓冲区指针按照u16边界对齐,因为从RDR寄存器接收的数据将通过u16类型进行处理。如果对齐不正确,则返回错误状态。
  • 将接收类型设置为标准接收。
  • 对于非LPUART实例,检查USART的RTOEN位是否设置。如果设置了RTOEN位,则使能UART接收超时中断。
  • 最后,调用UART_Start_Receive_IT函数启动接收操作,并返回相应的状态值。
HAL_StatusTypeDef HAL_UART_Receive_IT(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size)
{
  /* Check that a Rx process is not already ongoing */
  if (huart->RxState == 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 received from RDR will be
       handled through a u16 cast. */
    if ((huart->Init.WordLength == UART_WORDLENGTH_9B) && (huart->Init.Parity == UART_PARITY_NONE)) // 检查是否使用9位/无奇偶校验传输
    {
      if ((((uint32_t)pData) & 1U) != 0U) // 检查pData缓冲区指针是否按照u16边界对齐
      {
        return  HAL_ERROR; // 返回错误状态
      }
    }

    /* Set Reception type to Standard reception */
    huart->ReceptionType = HAL_UART_RECEPTION_STANDARD; // 设置接收类型为标准接收

    if (!(IS_LPUART_INSTANCE(huart->Instance))) // 检查是否为LPUART实例
    {
      /* Check that USART RTOEN bit is set */
      if (READ_BIT(huart->Instance->CR2, USART_CR2_RTOEN) != 0U) // 检查USART的RTOEN位是否设置
      {
        /* Enable the UART Receiver Timeout Interrupt */
        ATOMIC_SET_BIT(huart->Instance->CR1, USART_CR1_RTOIE); // 使能UART接收超时中断
      }
    }

    return (UART_Start_Receive_IT(huart, pData, Size)); // 调用UART_Start_Receive_IT函数启动接收操作,并返回相应的状态值
  }
  else
  {
    return HAL_BUSY; // 返回忙碌状态
  }
}

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

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

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

相关文章

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

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

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

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

    2024年02月04日
    浏览(32)
  • STM32 HAL库的HAL_UART_Transmit_IT使用方法

    是STM32 HAL库中非阻塞的串口发送函数。 用法:1. 调用HAL_UART_Transmit_IT()发送数据            2. 在HAL_UART_TxCpltCallback()里写上发送完成后的处理 注意: HAL_UART_Transmit_IT()要等待上次发送完成后再发送,否则返回HAL_BUSY。用huart-gState == HAL_UART_STATE_READY判断上次是否发送完成。 官方

    2024年02月16日
    浏览(32)
  • STM32 HAL 库 串口 函数HAL_UART_Transmit的BUG问题 及解决方法

    近期在开发图传项目的时候,由于需要发送的数据量及其庞大,因此在处理的时候, 发现STM32HAL库的串口函数,在处理海量数据的时候, 存在bug, 导致不能将指定数量的数据全部发送出去。  例如, 我以200个字节为一个数据包, 使用HAL_UART_Transmit函数,通过串口发送。 那么

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

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

    2024年02月02日
    浏览(45)
  • 【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日
    浏览(34)
  • STM32 HAL库的串口中断服务函数详解

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

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

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

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

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

    2024年02月15日
    浏览(42)
  • [015] [STM32] IIC协议详解与HAL库相关函数分析

    IIC(Inter Integrated Circuit)总线在物理层由SDA(Serial data, 串行数据线)、SCL(Serial clock line,串行时钟线)和上拉电阻组成。 每个连接到总线的设备都 有一个独立的地址 ,主机可以利用此地址进行不同设备之间的访问 连接到相同总线的 IC 数量受到总线的最大电容 400pF 限制 为了避

    2023年04月08日
    浏览(29)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包