STM32 HAL库里 串口中断回调函数是在怎么被调用的?
跟着正点原子学习的HAL库写串口接收程序的时候一直有困惑,使用HAL_UART_Receive_IT开启接收中断后,为啥处理函数要写在HAL_UART_RxCpltCallback里,中断发生的时候是怎么到这个回调函数里去的?
void MX_USART1_UART_Init(void)
{huart1.Instance = USART1;huart1.Init.BaudRate = 115200;huart1.Init.WordLength = UART_WORDLENGTH_8B;huart1.Init.StopBits = UART_STOPBITS_1;huart1.Init.Parity = UART_PARITY_NONE;huart1.Init.Mode = UART_MODE_TX_RX;huart1.Init.HwFlowCtl = UART_HWCONTROL_NONE;huart1.Init.OverSampling = UART_OVERSAMPLING_16;if (HAL_UART_Init(&huart1) != HAL_OK){Error_Handler();}/* USER CODE BEGIN USART1_Init 2 */uint8_t byte;HAL_UART_Receive_IT(&huart1, &byte, 1); /* 这里开启接收中断!!!!!*//* USER CODE END USART1_Init 2 */
}
接下来我们代码里面一步步看,HAL_UART_Receive_IT检查了下串口是不是在等待状态,是的话就执行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;}/* 设置接收类型为标准类型 */huart->ReceptionType = HAL_UART_RECEPTION_STANDARD;return (UART_Start_Receive_IT(huart, pData, Size));}else{return HAL_BUSY;}
}
UART_Start_Receive_IT主要设置了中断寄存器。
HAL_StatusTypeDef UART_Start_Receive_IT(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size)
{huart->pRxBuffPtr = pData;huart->RxXferSize = Size;huart->RxXferCount = Size;huart->ErrorCode = HAL_UART_ERROR_NONE;huart->RxState = HAL_UART_STATE_BUSY_RX;if (huart->Init.Parity != UART_PARITY_NONE){/* 启用奇偶校验错误中断 */__HAL_UART_ENABLE_IT(huart, UART_IT_PE);}/* 启用UART错误中断:(帧错误、噪声错误、溢出错误) */__HAL_UART_ENABLE_IT(huart, UART_IT_ERR);/* 启用 UART 数据寄存器非空中断 */__HAL_UART_ENABLE_IT(huart, UART_IT_RXNE);return HAL_OK;
}
其中这个非空中断就是触发HAL_UART_RxCpltCallback回调函数的伏笔。
开启中断后,串口收到数据,就会触发外部中断,代码在启动时的那个汇编文件里。

然后就跳转到了stm32f4xx_it.c里,如果文件里找不到出现这个函数看看是不是Cube配置的时候没打开中断。
__weak void USART1_IRQHandler(void)
{HAL_UART_IRQHandler(&huart1);
}

HAL_UART_IRQHandler有将近200行,主要做了如下事情:
1.读取中断标志和控制寄存器;
2.没有错误中断的情况下是否设置了非空中断,如果是调用UART_Receive_IT;
3.如果有错误中断则处理错误中断;
4.处理空闲线路检测(上面设置接收模式为标准);
5.处理发送中断,在接收完直接处理发送流程;
然后UART_Receive_IT又调用了HAL_UART_RxCpltCallback。所以在这个回调函数里写操作过程。

那能不能在USART1_IRQHandler里写呢?也是可以的,但是回调函数结构上更清晰,以前STM32最早的标准库就写在USART1_IRQHandler里。
相关文章:
STM32 HAL库里 串口中断回调函数是在怎么被调用的?
跟着正点原子学习的HAL库写串口接收程序的时候一直有困惑,使用HAL_UART_Receive_IT开启接收中断后,为啥处理函数要写在HAL_UART_RxCpltCallback里,中断发生的时候是怎么到这个回调函数里去的? void MX_USART1_UART_Init(void) {h…...
音视频入门基础:H.264专题(5)——FFmpeg源码中 解析NALU Header的函数分析
音视频入门基础:H.264专题系列文章: 音视频入门基础:H.264专题(1)——H.264官方文档下载 音视频入门基础:H.264专题(2)——使用FFmpeg命令生成H.264裸流文件 音视频入门基础&…...
RT-Thread ENV-Windows v2.0.0安装教程
前言 前几天RT-Thread官方更新了env工具,开源仓库的Kconfig的写法都不大一样了;如果继续用原来的env工具,拉新代码之后很多示例都编译不了 在最新的env工具中menuconfig全面采用kconfiglib,升级env脚本和python版本,改…...
[HBM] HBM TSV (Through Silicon Via) 结构与工艺
依公知及经验整理,原创保护,禁止转载。 专栏 《深入理解DDR》 全文 3300 字。 1 概念 1.1 什么是HBM TSV 使用 TSV 堆叠多个DDR DRAM成为一块HBM, 成倍提高了存储器位宽, 一条位宽相当于高速公路的一条车道, 车道越多ÿ…...
基于STM32的温湿度检测TFT屏幕proteus恒温控制仿真系统
一、引言 本文介绍了一个基于STM32的恒温控制箱检测系统,该系统通过DHT11温湿度传感器采集环境中的温湿度数据,并利用TFT LCD屏幕进行实时显示。通过按键切换页面显示,通过按键切换实现恒温控制箱的恒温控制。为了验证系统的可靠性和稳定性&…...
【Qt+opencv】编译、配置opencv
文章目录 前言下载opencv编译opencvmingw版本 总结 前言 OpenCV(Open Source Computer Vision Library)是一个开源的计算机视觉和机器学习软件库,它包含了超过2500个优化的算法。这些算法可以用来检测和识别面部,识别对象&#x…...
RDMA建链的3次握手和断链的4次挥手流程?
文章目录 基础信息建链 3次握手断链4次挥手建联状态active端passive端 报文结构函数关系其他后记 基础信息 CM: Communication Management 通信管理 连接管理SIDR: Service ID Resolution Protocol. 作用: enables users of Unreliable Datagram service to locate …...
实验4 图像空间滤波
1. 实验目的 ①掌握图像空间滤波的主要原理与方法; ②掌握图像边缘提取的主要原理和方法; ③了解空间滤波在图像处理和机器学习中的应用。 2. 实验内容 ①调用 Matlab / Python OpenCV中的函数,实现均值滤波、高斯滤波、中值滤波等。 ②调…...
独辟蹊径:我是如何用Java自创一套工作流引擎的(下)
作者:后端小肥肠 创作不易,未经允许严禁转载。 姊妹篇:独辟蹊径:我是如何用Java自创一套工作流引擎的(上)_java工作流引擎-CSDN博客 1. 前言 在上一篇博客中,我们详细介绍了如何利用Java语言从…...
【Python】pycharm常用快捷键操作
目录 一.pycharm自定义修改快捷键 二.pycharm默认常用快捷键 一.pycharm自定义修改快捷键 在file-setting-keymap中可以修改快捷键,建议刚开始没特殊需求就不用修改,先熟悉系统默认的常用快捷键,但是以下情况可以考虑修改: 之前使用其他I…...
es6语法复习一
es6语法 1.var 变量提升 2.let 不存在变量提升,只能定义一次 3.const 先定义再使用,定义好来不能修改 4.解构赋值 [a,b,c][1,2,3],{a,b,c}{a:1,b:2,c:3} 5.模版字符串 let aaa; ${a} is ok 6.对象简化写法 const school{ name, change, improve(){ cons…...
【python入门】自定义函数
文章目录 定义自定义函数的基本语法参数类型示例代码函数作用域匿名函数(Lambda)闭包装饰器 Python中的自定义函数允许你编写一段可重用的代码块,这段代码可以带参数(输入),并可能返回一个值(输…...
ONLYOFFICE 桌面编辑器 8.1 版发布:全面提升文档处理效率的新体验
文章目录 什么是ONLYOFFICE ?ONLYOFFICE 桌面编辑器 8.1 发布:新功能和改进功能强大的 PDF 编辑器幻灯片版式功能从右至左语言支持多媒体功能增强无缝切换工作模式其他改进和优化总结 什么是ONLYOFFICE ? https://www.onlyoffice.com/zh/off…...
ESP32实现UDP连接——micropython版本
代码: import network import socket import timedef wifiInit(name, port):ap network.WLAN(network.AP_IF) # 创建一个热点ap.config(essidname, authmodenetwork.AUTH_OPEN) # 无需密码ap.active(True) # 激活热点ip ap.ifconfig()[0] # 获取ip地址print(…...
Windows Ternimal
Windows Ternimal 安装 Windows 终端概述 | Microsoft Learn wt --help在当前目录打开 lextm/windowsterminal-shell: Install/uninstall scripts for Windows Terminal context menu items 打开指定目录 wt -d %USERPROFILE% ohmyposh 美化 1 安装 2 添加 ohmyposh bin…...
Unity扩展编辑器功能的特性
1.添加分组标题 用于在Unity的Inspector视图中为属性或变量组创建一个自定义的标题或头部,有助于在Inspector中组织和分类不同的属性,使其更易于阅读和管理。 [Header("Common Properties")] public float MouseSensitivity 5; public float…...
API类别 - UI核心
API类别 - UI核心 引言 在当今的数字时代,用户界面(UI)是任何软件或应用成功的关键因素之一。UI核心API作为构建用户界面的基础,提供了丰富的功能和工具,使得开发者能够创建出既美观又实用的用户界面。本文将深入探讨UI核心API的不同类别,以及它们如何影响现代软件开发…...
Redis-主从复制-配置主从关系
文章目录 1、修改配置文件中的 bind ,注释该配置,取消绑定仅主机登录2、修改protected-mode 为no,取消保护模式3、查看redis的进程状态4、配置6380是6379的从机5、配置6381是6379的从机6、查看主机 6379 的主从信息 1、修改配置文件中的 bind ,注释该配置,取消绑定仅主机登录 …...
DigiRL:让 AI 自己学会控制手机
类似于苹果此前发布的Ferret-UI 的安卓开源平替。主要用于在 Android 设备上识别 UI 和执行指令,不同的是它利用了离线到在线强化学习(Offline-to-Online RL),能够快速适应应用更新或 UI 变化。...
04.Ambari自定义服务开发-自定义服务配置文件在Ambari中的设置方法
文章目录 设置方法配置文件设置Custom xxx配置文件详细的配置方法.xml文件的整体格式基础参数格式value-attributes配置介绍设置属性在服务安装后不可修改设置允许字段为空是否显示配置名称参数类型设置字符串类型PasswordBooleanIntFloatDirectoryDirectoriesContent-多行文本…...
ESP32S3上电重启问题终极排查指南:从电源纹波到SPI电阻的实战经验
ESP32S3上电重启问题终极排查指南:从电源纹波到SPI电阻的实战经验 当ESP32S3开发板在批量生产中出现上电重启问题时,硬件工程师往往会面临一场与时间赛跑的挑战。最近在调试某款智能家居网关时,我们遇到了典型的RTC_SW_SYS_RST错误ÿ…...
DNS区域传送漏洞详解:从原理到防御(以Bind9为例)
DNS区域传送漏洞深度解析与BIND9安全加固实战指南 当你在浏览器输入一个网址时,背后发生的DNS查询过程就像一场精密的交响乐演出。而区域传送(Zone Transfer)作为DNS系统中的关键机制,本应是乐谱中协调各声部的指挥棒,…...
Qwen2.5-72B-Instruct实战:vLLM + FastAPI 构建标准化OpenAI兼容接口
Qwen2.5-72B-Instruct实战:vLLM FastAPI 构建标准化OpenAI兼容接口 1. 模型介绍 Qwen2.5-72B-Instruct-GPTQ-Int4是Qwen大语言模型系列的最新版本,代表了当前开源大模型领域的顶尖水平。这个72B参数的指令调优模型经过GPTQ 4-bit量化处理,…...
Mac视频预览增强工具:解决MKV文件无法预览问题的全方位方案
Mac视频预览增强工具:解决MKV文件无法预览问题的全方位方案 【免费下载链接】QuickLookVideo This package allows macOS Finder to display thumbnails, static QuickLook previews, cover art and metadata for most types of video files. 项目地址: https://g…...
3步解锁VR视频自由:让3D内容在任何设备重生
3步解锁VR视频自由:让3D内容在任何设备重生 【免费下载链接】VR-reversal VR-Reversal - Player for conversion of 3D video to 2D with optional saving of head tracking data and rendering out of 2D copies. 项目地址: https://gitcode.com/gh_mirrors/vr/V…...
工业通信系统安装:从网络架构到现场落地的完整技术指南
一、什么是工业通信系统安装?为什么它比普通弱电施工要求更高?工业通信系统安装,指的是围绕工业生产场景,对控制层、监控层、管理层之间的数据传输链路进行规划、布线、接线、组网、调试、联动和验收的全过程。它不是单纯的网络工…...
WaveTools鸣潮工具箱:3大核心功能解锁60帧流畅游戏体验
WaveTools鸣潮工具箱:3大核心功能解锁60帧流畅游戏体验 【免费下载链接】WaveTools 🧰鸣潮工具箱 项目地址: https://gitcode.com/gh_mirrors/wa/WaveTools 为什么《鸣潮》玩家需要一款专业工具箱?当你在开放世界中探索时,…...
FPGA设计优化:如何用Vivado的opt_directive提升性能(附真实案例)
FPGA设计优化:Vivado的opt_directive实战指南与性能提升策略 在FPGA设计流程中,逻辑优化是提升性能的关键环节。Xilinx Vivado Design Suite提供的opt_design命令及其directive参数,为工程师提供了精细控制优化策略的能力。本文将深入探讨如何…...
MCMC可视化指南:用动画理解马尔可夫链的收敛过程
MCMC可视化指南:用动画理解马尔可夫链的收敛过程 在数据科学和统计建模领域,马尔可夫链蒙特卡洛(MCMC)方法已经成为解决复杂概率分布采样问题的利器。但对于初学者而言,理解马尔可夫链如何通过随机游走最终收敛到目标分布,往往是…...
webMAN-MOD实战指南:构建PS3主机扩展服务系统
webMAN-MOD实战指南:构建PS3主机扩展服务系统 【免费下载链接】webMAN-MOD Extended services for PS3 console (web server, ftp server, netiso, ntfs, ps3mapi, etc.) 项目地址: https://gitcode.com/gh_mirrors/we/webMAN-MOD 当你在PS3主机上尝试加载网…...
