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使能串口中断。

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

    关注

    8

    文章

    1157

    浏览量

    53063
  • STM32
    +关注

    关注

    2254

    文章

    10782

    浏览量

    351780
  • 串口中断
    +关注

    关注

    0

    文章

    64

    浏览量

    13777
  • 系统时钟
    +关注

    关注

    1

    文章

    30

    浏览量

    9231
  • HAL库
    +关注

    关注

    1

    文章

    114

    浏览量

    6001
收藏 人收藏

    评论

    相关推荐

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

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

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

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

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

    基于 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

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

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

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

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

    串口中断丢失数据问题

    关于51单片机, 串口中断发送与接收出现数据丢失问题 串口中断的接收器具有双缓冲结构,即在从接收寄存器 读出前一个已收到的字节之前,便能接收第2个字节,如果第2个字节已经接收完毕,第1个字节还没有被读出
    发表于02-17 00:13 3379次阅读

    【STM32+cubemx】0005HAL开发:uart串口中断和fifo环形队列

    上一节我们学习了 串口的轮询收发,以及 HAL 自带的 中断收发。也分析了优缺点,这一节我们来讲讲如何改写 HAL库函数,使它能更高效地收发数据,更
    发表于11-15 20:36 39次下载
    【STM32+cubemx】0005 <b class='flag-5'>HAL</b><b class='flag-5'>库</b>开发:uart<b class='flag-5'>串口中断</b>和fifo环形队列

    HAL实验中断开关点灯及串口通信

    HAL 实验 中断开关点灯及 串口通信 中断介绍1、什么是 中断2、
    发表于11-23 18:06 8次下载
    <b class='flag-5'>HAL</b><b class='flag-5'>库</b>实验<b class='flag-5'>中断</b>开关点灯及<b class='flag-5'>串口</b>通信

    STM32HAL串口空闲中断+DMA 实现串口数据的不定长接收

    Package for STM32F0 Series)本文内容:不定长数据接收的原理 串口接收 中断的配置 串口接收DMA线的配置示例程序及起运行 流程附件:代码工程(MDK)文章...
    发表于12-06 18:36 20次下载
    STM32 <b class='flag-5'>HAL</b><b class='flag-5'>库</b><b class='flag-5'>中</b><b class='flag-5'>串口</b>空闲<b class='flag-5'>中断</b>+DMA 实现<b class='flag-5'>串口</b>数据的不定长接收

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

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

    STM32使用HAL实现串口通讯

    文章目录理论讲解查询模式 中断模式 中断的概念一、对 中断的理解。二、 中断源, 中断标志等概念 中断接收
    发表于12-24 18:42 13次下载
    STM32使用<b class='flag-5'>HAL</b><b class='flag-5'>库</b>实现<b class='flag-5'>串口</b>通讯