STM32 HAL库串口回调机制详解

2023-05-16

在开始学习STM32的时候,会发现,怎么有个串口中断回调和串口中断不一样的概念啊,感觉很头晕,找了很久也没发现到底区别在哪儿,回调机制是怎么实现的。

下面就详解一下:

通过STM32CubeMx配置工程,生成代码,这一步就不操作了,读者自己熟悉吧。

在stm32h7xx_it.c保存着所有外设的中断入口函数,我们需要在这里添加UART2的重点函数。函数不需要声明,HAL库已经声明过了。所以当中断发生后,程序会通过USART2_IRQHandler函数进入到HAL_UART_IRQHandler中断处理函数。在这里插入图片描述
简单点来说, 就是串口中断来了,会进入这个函数,执行HAL_UART_IRQHandler;


HAL_UART_IRQHandler里面的代码如下:

在这里插入图片描述
进来之后之后使用READ_REG函数,这个函数看名字就知道是读取寄存器的值。ISR是中断和状态寄存器,也就是中断发生了没?哪个中断发生了?CR1和CR3都是控制寄存器,都是使能一些功能和中断的。
在这里插入图片描述
第一句代码就是通过逻辑与、或,看看ISR的PE位、FE位、ORE位、NE位有没有置1,置1代表发生错误了。所以这些位就叫状态标志位。
如果没有发生错误,首先看ISR的RXNE/EXFNE标志位,查看一下数据手册这个标志位干嘛用的。这个标志位主要是表示数据寄存器或RXFIFO里面是否有数据的,由硬件置1,读取操作直接清零,意味着不需要软件清零。

在这里插入图片描述
然后看CR1的RXNEIE/RXFNEIE标志位。就是看程序有没有使能接收中断,如果没有使能,那就跳过不处理了。
在这里插入图片描述
在这里插入图片描述

最后看CR3的RXFTIE位,这个位表示RXFIFO阈值中断使能。在这里插入图片描述
综上,判断语句的内容是,1.使能读取中断或者阈值中断;2.中断标志位置1;3.两个条件同时满足。这次使用的是普通中断,没有涉及到RXFIFO,主要看接收数据寄存器。
判断成功后,利用RxISR函数进行处理。接下来探索一下这个函数来自何方?
在这里插入图片描述
这个RxISR看串口结构体声明,这是一个函数指针。在这里插入图片描述
但是在前面设置很明显,并没有对RxISR进行赋值。看一下HAL_UART_Init函数源码也没有发现对RxISR进行赋值。

最后在HAL_UART_Receive_IT函数里面发现了以下代码。根据之前设置的数据长度8位,赋值的是UART_RxISR_8BIT函数。

在这里插入图片描述
查看UART_RxISR_8BIT函数或(UART_RxISR_16BIT)源码,发现HAL_UART_RxCpltCallback函数在这个源码里面。

至此就明白了回调函数是怎么实现的了,简单点就是,通过HAL_UART_Receive_IT函数,将RxISR函数指针指向UART_RxISR_8BIT或者(UART_RxISR_16BIT)这个函数。

当中断来了之后,执行中断服务程序USART2_IRQHandler,然后执行HAL_UART_IRQHandler函数,这个函数会调用UART_RxISR_8BIT这个函数,然后调用HAL_UART_RxCpltCallback回调函数。这就是整个回调机制

特别说明
前面提到每一次中断都会调用RxISR函数,而这个函数就是UART_RxISR_8BIT函数。这个函数有一个小坑。就是它每一次进去都会把中断使能给关掉(为啥这么坏),所以特别注意就是在等待新一次中断之前还得引用HAL_UART_Receive_IT函数在这里插入图片描述
重新使能中断。

意思就是:
在使能了 USART 接收中断之后,stm32 在每次接收到一个字节数据之后,就会自动运行 USART2_IRQHandler ()函数一次,但不会每次都运行 一 次 HAL_UART_RxCpltCallback 函 数 。 只 有 当 接 收 到 数 据 字 节 数 与 在HAL_UART_Receive_IT 函数设定的接收数目相等时才会运行一次接收完成回调函数。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

STM32 HAL库串口回调机制详解 的相关文章

  • NVIDIA GeForce 940M 设备是不可移动的,无法弹出或拔出问题解决办法

    上个月在新入手的笔记本上安装了一个CUDA的开发环境 xff0c 并选择安装了GeForce Experience工具 xff0c 前两天打开GeForce Experience工具浏览时 xff0c 工具提醒可以更新NVIDIA显卡驱动
  • 大学生职业规划要穿“营销三点式”

    我们现在就是这样的环境 xff0c 这样的 教育 xff0c 这样的模式 xff0c 这一切是无法改变的 xff0c 那你适应它吗 xff1f 不是 xff0c 你若适应它 xff0c 你只能茫然 xff01 为什么 xff1f 因为你适应
  • 网络与串口调试工具TCPCOM

    TCPCOM xff0c 网络与串口二合一调试助手 xff0c 将网络调试助手与串口调试助手合二为一 xff0c 绿色软件 xff0c 简单高效 软件特色 1 支持中英文双语言 xff0c 自动根据操作系统环境选择系统语言类型 xff1b
  • Cmake以及CmakeLists

    CMake使用 CMake1 gcc make和CMake的关系2 CMake一般使用流程2 1 生成构建系统2 2 执行构建 xff08 比如make xff09 xff0c 生成目标文件 xff1b 2 3 执行测试 安装或打包 3 C
  • 卡尔曼滤波公式及其详细推导(不涉及矩阵求导)

    卡尔曼滤波公式及推导 1 前言 卡尔曼滤波 Kalman Filter 是一种关于线性离散系统滤波问题的递推算法 其使用递推的形式对系统的状态进行估计 xff0c 以测量中产生的误差为依据对估计值进行校正 xff0c 使被估计的状态不断接近
  • Nmap常用命令及扫描原理

    Nmap常用参数 sS TCP SYN扫描 sU UDP扫描 sA ACK扫描 sW 窗口扫描 scanflags RSTSYNFIN 自定义扫描 O 检测目标操作系统类型 sV 检测目标上运行服务的版本 v 增加输出信息的详细程度 vv
  • pixhawk无人机结合openmv之精准降落

    pixhawk飞控与openmv之精准降落 一 精准降落概述二 精准降落流程三 代码逻辑流程四 总结反思改进 一 精准降落概述 1 概述 无人机在生产生活中逐渐获得更大的用途 xff0c 京东的物流无人机有望解决用户快递最后一分钟的问题 x
  • ROS Catkin 教程之 catkin_package(...) 到底在做什么?

    While looking at a CMakeLists txt file I was wondering the exact meaning of the CATKIN DEPENDS option of the catkin pack
  • c++中的sstream

    include lt sstream gt 头文件中主要包含了stringstream xff0c 可以用来进行数据格式转换 std stringstream ss 1 注意每当调用一次 lt lt 和 gt gt 后 xff0c stri
  • boost库之geometry

    Boost Geometry介绍 love code love life CSDN博客 boost geometry include lt boost assign hpp gt include lt boost geometry geom
  • Ali OSS

    常用工具 对象存储 OSS 阿里云
  • c++ 使用 matplotlibcpp

    xff08 1 xff09 拷贝matplotlibcpp h头文件到自己工程 GitHub lava matplotlib cpp Extremely simple yet powerful header only C 43 43 plo
  • Ubuntu16.04操作系统的安装

    由于今年才开始接触Linux操作系统 xff0c 并且一直在使用Ubuntu16 04 xff0c 已经在计算机上安装过很多次 xff0c 今天就在此总结一下Ubuntu16 04的安装 xff08 今天开到一位同事博客点击打开链接写的非常
  • 在Linux(Ubuntu)中使用终端编译并运行.c和.cpp文件

    首先要保证系统中安装了C语言和C 43 43 对应的编译器 xff1a gcc gt C g 43 43 gt C 43 43 1 c文件的编译与运行 xff08 1 xff09 c文件hello c代码如下 xff1a include l
  • ubuntu软件的编译安装方式

    在Linux操作系统上安装了好几天的VTK PCL OpenCV后来总结出了一条规律 xff0c 就是Linux下软件编译安装的方法 xff0c 困扰了自己好几天 xff0c 终于解决了 xff0c 所以乘热打铁现总结一下 xff0c 希望
  • C/C++字符串长度的计算

    char ch1 10 61 39 s 39 39 h 39 39 0 39 39 h 39 char ch2 61 34 sh 0h 34 char ch3 61 34 shh 34 xff08 1 xff09 strlen 统计字符串存
  • ROS-TF的使用(常用功能)

    tf 使用 人非人1991的博客 CSDN博客 一 TF中的数据格式 xff1a 这些数据格式全都是class 头文件 xff1a include lt tf transform datatypes h gt 基本上可以包含所有的tf数据类
  • STM32之MPU6050第一部分

    一 MPU6050基础介绍 MPU6050 是 InvenSense 公司推出的全球首款整合性 6 轴运动处理组件 xff0c 相较于多组件方案 xff0c 免除了组合陀螺仪与加速器时之轴间差的问题 xff0c 减少了安装空间 MPU605
  • 如何在Linux下运行Python脚本

    1 使用python的IDEL运行python 如果你的Linux安装了python Ctrl 43 Alt 43 T打开Terminal后输入指令 xff1a python 会出现 gt gt gt 这个时候就可以在里面输入python脚
  • 《《内存和性能优化》》给我带来的!

    内存和性能优化 这本书教会了我很多 xff01 有很多的东西自己知道 xff0c 但是确实想用语言表达出来很难 xff0c 下面就简单的发表我的一部分关于这本书的新的吧 xff01 我学会了在进行系统设计时要注意的问题 xff08 1 xf

随机推荐

  • java 中 Color类

    Color类 Color类是用来封装颜色的 xff0c 在上面的例子中多次用到 使用Color对象较为简单的方法是直接使用Color类提供的预定义的颜色 xff0c 像红色Color red 橙色Color orange等 xff1b 也可
  • C语言位运算符:与、或、异或、取反、左移和右移

    语言位运算符 xff1a 与 或 异或 取反 左移和右移 位运算是指按二进制进行的运算 在系统软件中 xff0c 常常需要处理二进制位的问题 C语言提供了6个位操作运算符 这些运算符只能用于整型操作数 xff0c 即只能用于带符号或无符号的
  • android 打开蓝牙设备 显示已经配对的蓝牙设备 ,并将已配对的蓝牙设备显示在textview中

    xff08 1 xff09 要想使用android 手机的Bluetooth xff0c 需要在androidmanifest文件中加入使用蓝牙的权限 lt uses permission android name 61 34 androi
  • iOS 7 点击按钮切换视图

    xff08 1 xff09 创建一个项目 xff0c 名字为切换视图 xff08 2 xff09 打开Main storyboard文件 xff0c 将视图中的ViewController视图控制器拖动到画布中 xff08 3 xff09
  • Javaweb 入门测试程序(jsp)

    关于进行jsp程序开发的入门测试小程序 xff08 1 xff09 必须的工具软件 java开发工具包jdk 需要进行环境变量的设置 xff0c 有Java开发基础的人这一步一看就懂 xff01 xff08 2 xff09 安装MyEcli
  • 自媒体平台运营的感悟

    1 关键是自媒体平台的定位 西游记中唐僧有着坚定的志向 西天取经 xff0c 普渡众生 抱着这样的初心和宗旨 xff0c 打造了自己的取经团队 一路上历经九九八十一难 xff0c 初心不改 xff0c 终于到达西天 xff0c 取得真经 x
  • 排序方法总结(1)冒泡排序 选择排序

    排序方法是一种基本的 重要的算法 xff0c 排序的方法有很多 xff0c 现把一些基本排序方法的算法和c 代码列出如下 xff0c 供大家思考 xff0c 借鉴 xff0c 进步 在进行排序之前首先要做的一件事就是选择排序的准则 xff0
  • 排序方法总结(2)插入排序

    插入排序 插入排序类和大家玩的纸牌游戏有些类似 xff0c 在发牌的过程的过程中用右手起的牌 xff0c 总是和左手里的排进行比较 xff0c 然后放在恰当的位置 这就是插入排序的思想 以数组为例 xff0c 其算法是 xff1a xff0
  • docker 备份

    docker数据管理 xff1b 把仓库挂载到 root adata v 挂载点前面虚拟机目录 xff1a 仓库内的目录 docker run itd v data data centos bash 数据卷容器用于多个容器共享文件 xff0
  • 排序方法总结(3)希尔排序

    希尔排序 希尔排序是对插入排序的改进 xff0c 对中等规模的数据排序效率较高 xff01 交换的次数变得少了 xff0c 效率就高了 希尔排序的算法 1 相距为 k 的数据进行比较 xff0c 若不符合排序的条件 xff0c 就进行交换
  • 求阶乘的几种方法

    求阶乘的几种方法 xff08 1 xff09 常规求阶乘 利用循环即可求出 include lt stdio h gt int main int m n i sum 61 1 printf 34 please input one numbe
  • C++sort函数的用法

    C 43 43 sort 函数的用法 近来看了c 43 43 标准库这本书 xff0c 学到了很多 xff0c 就把这其中的一点 C 43 43 sort 函数的用法写下来和大家分享吧 xff01 xff08 一 xff09 为什么要用c
  • Design Patterns Elements of Reusable Object-Oriented Software(一)Introduction(介绍)

    1 Introduction xff08 介绍 xff09 Designing object oriented software is hard and designing reusable object oriented software
  • 排序方法之堆排序

    堆排序的实现 xff08 xff09 创建初始堆 xff08 二 xff09 堆排序 在创建初始堆之前首先要了解一些关于堆的概念 xff0c 还需要了解一些关于平衡二叉树的内容 xff08 1 xff09 堆的节点数 61 n 2 并且是只
  • ros 运行launch文件报错:找不到所在路径——创建多个工作空间注意问题

    ros 运行launch文件报错 xff1a 找不到所在路径 创建多个工作空间注意问题 问题描述解释与解决办法 问题描述 基于UR5运行逆运动学代码时 xff0c 出了 no motion plan found 的bug xff0c 找了两
  • 手把手教你实现window图片爬虫(一)

    第一篇 xff1a 爬虫设计思路及原理 刚听说爬虫时 xff0c 估计很多人觉得很神奇 xff0c 是什么赋予了它生命力做到在网络上到处爬取的呢 xff1f 等我说完你会恍然大悟 xff0c 其实并没有多高深的技术 xff0c 人人都可以写
  • 常见的系统设计问题以及思路

    综述 系统设计分类 系统设计类问题是面试常见的题目 xff0c 也是提升个人架构思维和系统思维的好途径 xff0c 本文会持续更新 xff0c 记录一些经典的系统设计问题 常见的系统设计问题 xff0c 大概分为两个类型 xff1a 垂直场
  • docker 授权给普通用户

    目录 docker 授权给普通用户 给普通用户增加docker命令的权限给普通用户增加启动和关闭docker的权限 docker 授权给普通用户 给普通用户增加docker命令的权限 我们用命令可以看出docker下的属主属组都是root
  • APM飞控学习之路:1 无人机的分类与发展

    旧时王谢堂前燕 xff0c 飞入寻常百姓家 无人机也像那堂前燕 xff0c 从以前为军事所专属 xff0c 负责侦查和战斗 xff0c 飞入民用领域 xff0c 在航拍 植保 快递 救灾 巡检 拍摄等行业大显身手 xff0c 无人机 43
  • STM32 HAL库串口回调机制详解

    在开始学习STM32的时候 xff0c 会发现 xff0c 怎么有个串口中断回调和串口中断不一样的概念啊 xff0c 感觉很头晕 xff0c 找了很久也没发现到底区别在哪儿 xff0c 回调机制是怎么实现的 下面就详解一下 xff1a 通过