当前位置: 首页 > news >正文

STM32CubeMX串口USART中断发送接收数据

本文代码使用 HAL 库。

文章目录

  • 前言
  • 一、中断控制
  • 二、USART中断使用
      • 1. 中断优先级设置 :
      • 2. 使能中断
      • 3. 使能UART的发送、接收中断
      • 4. 中断收发函数
      • 5. 中断处理函数
      • 6. 中断收发回调函数
  • 三、串口中断实验
      • 串口中断发送数据点亮 led:
      • 实验现象:
  • 总结

前言

上一篇文章 详细介绍了 USART 串口 不使用中断 发送接收数据 ,这篇文章 将介绍如何 使用中断控制 USART 串口 发送接收数据。

对于如何根据 CubeMX 生成 USART 的工程,可以参考我的上篇文章,也介绍了 关于生成 usart.c 代码的解析 : STM32Cube串口USART发送接收数据


一、中断控制

在这里插入图片描述

  1. 中断: 是一种特殊的处理程序,能够 临时中断 正在运行的程序,以 处理紧急 的事件,然后 恢复 正在运行的程序。当 外部事件发生 时,中断程序 会被 调用,以 处理这些事件。

USART 收发数据时,可以 在数据接收之后立即触发中断,以此提高数据传输效率。

  1. 中断优先级
  • 抢占优先级 :抢占优先级可以实现中断嵌套,抢占 优先级级数低的可抢占级数高的

  • 子优先级 :子优先级无法实现中断嵌套,同一时刻 两个子 优先级不同 的 中断 来临,则 先处理优先级高的 即优先级级数低的中断。若 先后发生 则先处理 上一个中断,再 处理后面的中断。

一旦确定了优先级组别,抢占优先级和子优先级的范围就确定下来了且除非复位否则无法更改

二、USART中断使用

1. 中断优先级设置 :

①使用 CubeMX 设置优先级。
在这里插入图片描述

②也可以使用 HAL_NVIC_SetPriority() 设置优先级:

HAL_NVIC_SetPriority(IRQn_Type IRQn, uint32_t PreemptPriority, uint32_t SubPriority)

比如将 USART1 的中断设置为次高级优先级: HAL_NVIC_SetPriority(USART1_IRQn, 0, 1);

2. 使能中断

①使用 CubeMX 使能中断:
在这里插入图片描述
②使用 HAL_NVIC_EnableIRQ() 使能中断。

HAL_NVIC_EnableIRQ(IRQn_Type IRQn)

3. 使能UART的发送、接收中断

__HAL_UART_ENABLE_IT(__HANDLE__, __INTERRUPT__)

例如:设置 USART1 为 传输完成中断,接收数据寄存器不为空中断。
在这里插入图片描述

__HAL_UART_ENABLE_IT(&huart1, UART_IT_RXNE | UART_IT_RXNE);

4. 中断收发函数

//中断发送
HAL_UART_Transmit_IT(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size);//中断接收
HAL_UART_Receive_IT(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size)

5. 中断处理函数

在中断回调函数 USART1_IRQHandler ( ) 中进行中断处理,可以调用 HAL_UART_IRQHandler ( )

/*中断处理函数*/
void USART1_IRQHandler(void)
{HAL_UART_IRQHandler(&huart1);
}

6. 中断收发回调函数

重定向 HAL_UART_RxCpltCallback( )HAL_UART_TxCpltCallback( ) 函数进行进一步任务处理。

/* 中断接收回调函数 */
__weak void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)/* 中断发送回调函数 */
__weak void HAL_UART_TxCpltCallback(UART_HandleTypeDef *huart)

三、串口中断实验

串口中断发送数据点亮 led:

对 LED 代码不理解的可以参考我之前的文章,详细介绍了 LED:STM32f103 CubeMX封装 led程序

void Enable(void)  /*使能*/
{HAL_NVIC_SetPriority(USART1_IRQn, 0, 1); //中断优先级设置HAL_NVIC_EnableIRQ(USART1_IRQn);  //使能中断__HAL_UART_ENABLE_IT(&huart1, UART_IT_RXNE | UART_IT_RXNE);
}
void Disable(void)  /*失能*/
{__HAL_UART_DISABLE_IT(&huart1, UART_IT_RXNE | UART_IT_RXNE);HAL_NVIC_DisableIRQ(USART1_IRQn);
}
void USART1_IRQHandler(void)  /*中断处理函数*/
{HAL_UART_IRQHandler(&huart1);
}
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)  //中断接收
{if(huart->Instance == USART1){re_data = 1;}
}
void HAL_UART_TxCpltCallback(UART_HandleTypeDef *huart)  //中断发送
{if(huart->Instance == USART1){tr_data = 1;}
}

这里我就不介绍 printf 的重定向问题了,我之前的文章 已详细介绍了 printf 的内容:STM32Cube串口USART发送接收数据

  a = getchar(); //获得一个字符switch(a){case 'B':{GREEN_ON();  //点亮LEDprintf("Led is on!\r\n");  }break;case 'b':{GREEN_OFF();  //熄灭LEDprintf("Led is off!\r\n");  }break;default:break;}

实验现象:

实验现象 我放在了 B占,有兴趣的可以看看:

STM32 串口USART 发送数据控制led亮灭


总结

如果有不理解的可以 评论留言 也可以 私信我 ,大家一起讨论。

相关文章:

STM32CubeMX串口USART中断发送接收数据

本文代码使用 HAL 库。 文章目录前言一、中断控制二、USART中断使用1. 中断优先级设置 :2. 使能中断3. 使能UART的发送、接收中断4. 中断收发函数5. 中断处理函数6. 中断收发回调函数三、串口中断实验串口中断发送数据点亮 led:实验现象:总结…...

JavaScript Web Workers使用流程

背景 Web Workers是一个API,允许在浏览器中运行后台处理任务,而不影响用户界面(UI)线程的稳定性。 Web Workers 可用于消除阻止 UI 的耗时任务,如图表生成,物理模拟或数据分析等: 使用 Web W…...

数据结构与算法(五):优先队列

这节总结一下优先队列的常用实现方法。 一、基本概念 普通的队列是一种先进先出的数据结构,元素在队列尾追加,而从队列头删除。在优先队列中,元素被赋予优先级。当访问元素时,具有最高优先级的元素最先删除。优先队列具有最高级…...

二叉树的前序遍历-java两种方式-力扣144

一、题目描述给你二叉树的根节点 root ,返回它节点值的 前序 遍历。示例 1:输入:root [1,null,2,3]输出:[1,2,3]示例 2:输入:root []输出:[]示例 3:输入:root [1]输出…...

浅析 Redis 主从同步与故障转移原理

我们在生产中使用 Redis,如果只部署一个 Redis 实例,当该实例宕机,到恢复之前都不可用;虽说 Redis 一般都用来做缓存,但不可用给业务系统带来的影响也是不小的,流量大时甚至会导致整个服务宕机。所以 Redis…...

MyBatis学习笔记(七) —— 特殊SQL的执行

7、特殊SQL的执行 7.1、模糊查询 模糊查询的三种方式: 方式1:select * from t_user where username like ‘%${mohu}%’ 方式2:select * from t_user where username like concat(‘%’,#{mohu},‘%’) 方式3:select * from t_u…...

计算机组成原理(1)--计算机系统概论

一、计算机系统简介1.计算机系统软硬件概念计算机系统由“硬件”和“软件”两大部分组成。所谓“硬件”,是指计算机的实体部分,它由看得见摸得着的各种电子元器件,各类光、电、机设备的实物组成,如主机、外部设备等。所谓“软件”…...

jdbc模板的基本使用

1.JdbcTemplate的开发步骤 <1>导入spring-jdbc和spring-tx坐标 <2>创建数据库表和实体 <3>创建JdbcTemplate对象 <4>执行数据库 2.JdbcTemplate快速入门 <1>导入坐标 <dependency><groupId>org.springframework</groupId><…...

JPA 注解及主键生成策略使用指南

JPA 注解 Entity 常用注解 参考&#xff1a;JPA & Spring Data JPA学习与使用小记 指定对象与数据库字段映射时注解的位置&#xff1a;如Id、Column等注解指定Entity的字段与数据库字段对应关系时&#xff0c;注解的位置可以在Field&#xff08;属性&#xff09;或Prope…...

【C语言刷题】找单身狗、模拟实现atoi

目录 一、找单身狗 1.暴力循环法 2.分组异或法 二、模拟实现atoi 1.atoi函数的功能 2.模拟实现atoi 一、找单身狗 题目描述&#xff1a;给定一个数组中只有两个数字是出现一次&#xff0c;其他所有数字都出现了两次。 编写一个函数找出这两个只出现一次的数字。 比如&…...

前端必会面试题指南

计算属性和watch有什么区别?以及它们的运用场景? // 区别computed 计算属性&#xff1a;依赖其它属性值&#xff0c;并且computed的值有缓存&#xff0c;只有它依赖的属性值发生改变&#xff0c;下一次获取computed的值时才会重新计算computed的值。watch 侦听器&#xff1a…...

C 语言—— 数组

【C 语言】数组1. 概念2. 声明3. 分类4. 初始化5. 赋值6. 附加语法7. VLA 的一些补充1. 概念 数组是存放一组 相同类型 的 有序 数据的一段 连续 空间。 2. 声明 TYPE identifier[static(optional) qualifiers(optional) expression(optional)] TYPE identifier[qualifiers(o…...

Oracle-RAC集群主机重启问题分析

问题背景: 在对一套两节点Oracle RAC19.18集群进行部署时&#xff0c;出现启动数据库实例就会出现主机出现重启的情况&#xff0c;检查发现主机重启是由于节点集群被驱逐导致​。 问题: 两节点Oracle RAC19.18集群,启动数据库实例会导致主机出现重启。 问题分析: 主机多次出现…...

Python每日一练(20230227)

目录 1. 路径交叉 ★★★ 2. 缺失的第一个正数 ★★★ 3. 寻找两个正序数组的中位数 ★★★ 附录 散列表 基本概念 常用方法 1. 路径交叉 给你一个整数数组 distance 。 从 X-Y 平面上的点 (0,0) 开始&#xff0c;先向北移动 distance[0] 米&#xff0c;然后向西移…...

Scratch少儿编程案例-算法练习-存款收益计算

专栏分享 点击跳转=>Unity3D特效百例点击跳转=>案例项目实战源码点击跳转=>游戏脚本-辅助自动化点击跳转=>Android控件全解手册点击跳转=>Scratch编程案例👉关于作者...

【Linux驱动开发100问】Linux驱动开发工程师在面试中常被问到的问题汇总

&#x1f947;今日学习目标&#xff1a;什么是Kconfig&#xff1f;如何使用Kconfig&#xff1f; &#x1f935;‍♂️ 创作者&#xff1a;JamesBin ⏰预计时间&#xff1a;10分钟 &#x1f389;个人主页&#xff1a;嵌入式悦翔园个人主页 &#x1f341;专栏介绍&#xff1a;Lin…...

每日学术速递2.27

CV - 计算机视觉 | ML - 机器学习 | RL - 强化学习 | NLP 自然语言处理 Subjects: cs.CL 1.FiTs: Fine-grained Two-stage Training for Knowledge-aware Question Answering 标题&#xff1a;FiTs&#xff1a;用于知识感知问答的细粒度两阶段训练 作者&#xff1a;Qichen…...

【数据库系统概论】基础知识总结

&#x1f339;作者:云小逸 &#x1f4dd;个人主页:云小逸的主页 &#x1f4dd;Github:云小逸的Github &#x1f91f;motto:要敢于一个人默默的面对自己&#xff0c;强大自己才是核心。不要等到什么都没有了&#xff0c;才下定决心去做。种一颗树&#xff0c;最好的时间是十年前…...

简单移动平均在量化中的应用(附Python实战代码)

在大多数金融产品的投资过程中,均线系统都是很重要的投资参考。一般来说,均线可以近似理解为某段时间内成交筹码的均价,它往往能帮助我们找到合适的支撑位和压力位。随着各种技术流派以及统计学的发展,从简单移动平均中逐渐衍生出了更多的均线计算方式,比如指数移动平均、…...

ChatGPT提高你日常工作的五个特点,以及如何使用它来提高代码质量

ChatGPT已经完全改变了代码开发模式。然而&#xff0c;大多数软件开发者和数据专家们仍然不使用ChatGPT来完善——并简化他们的工作。 这就是我们在这里列出提升日常工作效率和质量的5个不同的特点的原因。 让我们一起来看看在日常工作中如何使用他们。 警告&#xff1a;不要…...

Python爬虫实战:研究MechanicalSoup库相关技术

一、MechanicalSoup 库概述 1.1 库简介 MechanicalSoup 是一个 Python 库,专为自动化交互网站而设计。它结合了 requests 的 HTTP 请求能力和 BeautifulSoup 的 HTML 解析能力,提供了直观的 API,让我们可以像人类用户一样浏览网页、填写表单和提交请求。 1.2 主要功能特点…...

超短脉冲激光自聚焦效应

前言与目录 强激光引起自聚焦效应机理 超短脉冲激光在脆性材料内部加工时引起的自聚焦效应&#xff0c;这是一种非线性光学现象&#xff0c;主要涉及光学克尔效应和材料的非线性光学特性。 自聚焦效应可以产生局部的强光场&#xff0c;对材料产生非线性响应&#xff0c;可能…...

线程与协程

1. 线程与协程 1.1. “函数调用级别”的切换、上下文切换 1. 函数调用级别的切换 “函数调用级别的切换”是指&#xff1a;像函数调用/返回一样轻量地完成任务切换。 举例说明&#xff1a; 当你在程序中写一个函数调用&#xff1a; funcA() 然后 funcA 执行完后返回&…...

如何在看板中有效管理突发紧急任务

在看板中有效管理突发紧急任务需要&#xff1a;设立专门的紧急任务通道、重新调整任务优先级、保持适度的WIP&#xff08;Work-in-Progress&#xff09;弹性、优化任务处理流程、提高团队应对突发情况的敏捷性。其中&#xff0c;设立专门的紧急任务通道尤为重要&#xff0c;这能…...

2025盘古石杯决赛【手机取证】

前言 第三届盘古石杯国际电子数据取证大赛决赛 最后一题没有解出来&#xff0c;实在找不到&#xff0c;希望有大佬教一下我。 还有就会议时间&#xff0c;我感觉不是图片时间&#xff0c;因为在电脑看到是其他时间用老会议系统开的会。 手机取证 1、分析鸿蒙手机检材&#x…...

解决本地部署 SmolVLM2 大语言模型运行 flash-attn 报错

出现的问题 安装 flash-attn 会一直卡在 build 那一步或者运行报错 解决办法 是因为你安装的 flash-attn 版本没有对应上&#xff0c;所以报错&#xff0c;到 https://github.com/Dao-AILab/flash-attention/releases 下载对应版本&#xff0c;cu、torch、cp 的版本一定要对…...

[Java恶补day16] 238.除自身以外数组的乘积

给你一个整数数组 nums&#xff0c;返回 数组 answer &#xff0c;其中 answer[i] 等于 nums 中除 nums[i] 之外其余各元素的乘积 。 题目数据 保证 数组 nums之中任意元素的全部前缀元素和后缀的乘积都在 32 位 整数范围内。 请 不要使用除法&#xff0c;且在 O(n) 时间复杂度…...

【C++从零实现Json-Rpc框架】第六弹 —— 服务端模块划分

一、项目背景回顾 前五弹完成了Json-Rpc协议解析、请求处理、客户端调用等基础模块搭建。 本弹重点聚焦于服务端的模块划分与架构设计&#xff0c;提升代码结构的可维护性与扩展性。 二、服务端模块设计目标 高内聚低耦合&#xff1a;各模块职责清晰&#xff0c;便于独立开发…...

JVM暂停(Stop-The-World,STW)的原因分类及对应排查方案

JVM暂停(Stop-The-World,STW)的完整原因分类及对应排查方案,结合JVM运行机制和常见故障场景整理而成: 一、GC相关暂停​​ 1. ​​安全点(Safepoint)阻塞​​ ​​现象​​:JVM暂停但无GC日志,日志显示No GCs detected。​​原因​​:JVM等待所有线程进入安全点(如…...

Linux --进程控制

本文从以下五个方面来初步认识进程控制&#xff1a; 目录 进程创建 进程终止 进程等待 进程替换 模拟实现一个微型shell 进程创建 在Linux系统中我们可以在一个进程使用系统调用fork()来创建子进程&#xff0c;创建出来的进程就是子进程&#xff0c;原来的进程为父进程。…...