0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

HAL库中对串口中断执行流程的分解

冬至子 来源:O老师讲32 作者:O老师 2023-10-24 14:37 次阅读

我们使用轮询方式接收计算机端发送过来的数据,但是这种方式需要一直在循环语句中查询是否有数据发送过来,这种方式效率非常低。

为了提高处理器的执行效率,我们使用中断方式接收计算机端发送过来的数据,当计算机端有数据发送过来时,会触发STM32的串口中断,并执行中断回调函数。

在这种方式中,不用反复去查询串口是否接收到数据,所以效率非常高,实时性也更好。

HAL库的中断接收函数和中断发送函数分别为HAL_UART_Receive_IT和HAL_UART_Transmit_IT。下面我们对常用的中断方式接收函数HAL_UART_Receive_IT进行重点介绍。

HAL_UART_Receive_IT函数的原型如下

HAL_StatusTypeDef HAL_UART_Receive_IT(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size)

它的三个参数分别为串口句柄,接收到的数据存储的目标地址和接收多少个字节的数据。

打开函数HAL_UART_Receive_IT,可以看到它的定义如图8-24所示。

图片

图8-24 函数HAL_UART_Receive_IT内容示意图

可以看到,函数HAL_UART_Receive_IT并没有实际进行数据接收,而只是对串口句柄huart的接收信息进行初始化和使能相关中断,这些使能中断的最后一个即为使能串口接收中断。

由于函数HAL_UART_Receive_IT本质上是对串口的中断进行使能,所以和设置系统时钟一起放置于main函数的系统初始化代码中,而不是放在while循环中反复查询、执行。

为了便于对比,图8-25给出了轮询方式接收函数的定义。

图片

图8-25 轮询方式接收函数HAL_UART_Receive定义示意图

由轮询方式接收函数的定义可以看到,函数HAL_UART_Receive是确实在接收数据并保存到参数pData指向的存储单元中。这点和中断方式接收函数完全不同,读者千万不要被函数名迷惑了。

那中断方式是如何接收数据的呢?下面我们来介绍中断方式接收数据的步骤。

(1)使能接收中断。

(2)接收到数据后触发接收数据中断,此时程序按以下步骤执行。

①到中断向量表中找到USART1的中断入口,如图8-26所示。

图片

图8-26 USART1中断函数入口

②执行中断函数USART1_IRQHandler,在该中断函数中调用HAL库的USART1中断函数,如图8-27所示。

图片

图8-27 USART的中断函数的内容

注意,该函数需要用户自己实现,如果用户使用CubeMX生成工程,则工程会自动在输出文件stm32f4xx_it.c中生成该函数。

③执行HAL库的中断函数HAL_UART_IRQHandler。在该函数中先判断是否存在接收错误,如果不存在,则执行函数UART_Receive_IT(),如图8-28所示。

图片

图8-28 函数HAL_UART_IRQHandler定义示意图

④执行接收完成中断函数UART_Receive_IT(),如图8-29所示。

图片

图8-29 函数UART_Receive_IT()定义示意图

由图可见,在该函数中首先判断字长是9位还是8位,如果是8位,则根据是否使能奇偶校验使用如下语句读取数据(见图8-29中的①):

if (huart- >Init.Parity == UART_PARITY_NONE)  /* 如果没有使能奇偶校验,数据位为8位 */


     {


        *huart- >pRxBuffPtr++ = (uint8_t)(huart- >Instance- >DR & (uint8_t)0x00FF);


     }


     else  /* 如果使能了奇偶校验,数据位为7位 */


     {


       *huart- >pRxBuffPtr++ = (uint8_t)(huart- >Instance- >DR & (uint8_t)0x007F);


     }

在上述程序段中,程序首先将接收到的数据保存到句柄huart的接收区缓冲指针pRxBuffPtr指向的存储单元中,然后指针pRxBuffPtr的值加1,指向下一个存储单元。

所以,在中断方式接收中,数据的接收在中断函数中完成。

读到一个数据后,huart的接收计数变量RxXferCount的值减1,并判断减到0了没有,如果减到0了,说明数据已经接收完成,关闭串口中断,如图8-30中的②所示,接着执行接收完成中断回调函数HAL_UART_RxCpltCallback,如图8-30中的③所示。

⑤执行回调函数HAL_UART_RxCpltCallback。由于在步骤④中执行函数UART_Receive_IT时已经关闭了串口的接收中断,所以如果要继续采用中断方式接收数据,则需要在回调函数中再次调用函数HAL_UART_Receive_IT使能串口中断。

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 接收机
    +关注

    关注

    8

    文章

    1122

    浏览量

    52643
  • STM32
    +关注

    关注

    2240

    文章

    10674

    浏览量

    348794
  • 串口中断
    +关注

    关注

    0

    文章

    63

    浏览量

    13613
  • 系统时钟
    +关注

    关注

    1

    文章

    30

    浏览量

    9014
  • HAL库
    +关注

    关注

    1

    文章

    112

    浏览量

    5878
收藏 人收藏

    评论

    相关推荐

    请问HAL中用DMA方式使用串口串口中断用开吗?

    关于HAL中用DMA方式使用串口的问题,串口中断用开吗?使用DMA模式收发串口的核心语句为如下2句HA
    发表于 12-04 08:48

    STM32f405 HAL串口中断接受上溢错误(ORE)问题

    STM32f405 HAL串口中断接受上溢错误(ORE)问题,在哪可以找到官方的修改和订正解决方案。
    发表于 12-30 16:46

    使用HAL在进行串口中断使用的时候遇到了麻烦

    写在前面    最近需要使用一款STM32L4系列的芯片进行开发,需要学习使用HAL。在进行串口中断使用的时候遇到了一些小麻烦,写下解决方案供大家参考。1.UART相关的头文件引用错误   由于
    发表于 08-13 09:11

    STM32CubeMX串口中断模式收发数据

    . 串口中断函数使用实例四. HAL串口相关源码介绍环境:开发板:STM32F4探索者(正点原子)一. 在STM32CubeMX 图形
    发表于 08-13 08:34

    STM32使用CubeMAX配置的串口中断接收方法是什么

    STM32使用CubeMAX配置的串口中断接收方法目录1.定位串口中断发生的地方2.处理串口中断接收的流程是:(1)初始化串口(2)在mai
    发表于 08-13 09:06

    STM32 HAL串口中断通讯【任意长度 不丢帧】精选资料分享

    基于HAL的多串口通信入门,多串口中断通信,可以发任意字节数据,用的STM32F302CBTx,STM32F103也一样通用。本例使用三组串口中断
    发表于 08-16 06:30

    【STM32的HAL开发】CubeMX配置HAL,不进串口中断的问题 精选资料分享

    【STM32的HAL开发】串口中断开发环境在main.c添加代码(1/2)在stm32f4xx_it.c添加代码(2/2)注意附代码开发环境cubemx V5.5.0 + MDK Keil
    发表于 08-16 07:00

    HAL串口中断接收

    [STM32系列]一、HAL串口中断接收1、前言2、回调函数3、HAL中断接收函数使用1、
    发表于 08-16 08:13

    如何解决CubeMX配置HAL不进串口中断的问题?

    如何解决CubeMX配置HAL不进串口中断的问题?
    发表于 11-16 09:04

    基于HAL串口中断接收函数该如何去实现呢

    基于HAL串口中断接收函数该如何去实现呢?有什么方法吗?
    发表于 12-06 06:56

    STM32F0 HAL串口中断调用顺序是什么样的?

    STM32F0 HAL串口中断调用顺序是什么样的?
    发表于 12-08 07:59

    请问hal如何实现stm32串口中断接收数据?

    请问hal如何实现stm32串口中断接收数据?
    发表于 12-09 07:39

    有没有哪位大神分享一下stm32 HAL串口中断的callback流程图呢

    有没有哪位大神分享一下stm32 HAL串口中断的callback流程图呢
    发表于 12-09 07:27

    为什么需要修改串口中断的回调函数

    和porttimer.c的函数,和为什么需要修改串口中断的回调函数。从这篇文章,也可以看出,采用HAL是比较简单的,像是
    发表于 02-16 07:26

    STM32使用CubeMAX配置的串口中断接收方法

    STM32使用CubeMAX配置的串口中断接收方法目录1.定位串口中断发生的地方2.处理串口中断接收的流程是:(1)初始化串口(2)在mai
    发表于 12-14 18:45 28次下载
    STM32使用CubeMAX配置的<b class='flag-5'>串口中断</b>接收方法