STM32CubeIDE基础学习-USART串口通信实验(中断方式)

news2024/11/27 10:43:17

STM32CubeIDE基础学习-USART串口通信实验(中断方式)


文章目录

  • STM32CubeIDE基础学习-USART串口通信实验(中断方式)
  • 前言
  • 第1章 硬件介绍
  • 第2章 工程配置
    • 2.1 工程外设配置部分
    • 2.2 生成工程代码部分
  • 第3章 代码编写
  • 第4章 实验现象
  • 总结


前言

前面学习了串口使用轮询的方式实现数据收发,本文章将介绍使用中断的方式实现数据的收发。

使用中断的方式可以避免程序一直在死等,当中断触发之后就立即执行内容,大大减少了CPU的负担。


第1章 硬件介绍

本实验使用的开发板主控芯片是STM32F103C8T6,其核心原理图如下:

在这里插入图片描述

时钟来源使用的是外部高速8M晶振作为高速时钟。

开发板的TTL串口电路比较简单,采用CH340C的串口芯片,省去了外部外接晶振电路。该芯片的串口接到了主芯片的串口1上,即PA9、PA10引脚。注意它们的连接关系是需要交叉接的,不然直连是无法正常串口通信的。

在这里插入图片描述

第2章 工程配置

本实验直接采用串口轮询实验的工程作为基础模板,直接拷贝粘贴即可,然后在上面添加串口中断相关功能配置即可,其它不用修改,就不用再新建工程了。

2.1 工程外设配置部分

第一步:前面的LED、BEEP、KEY、RCC和SWD的相关配置都不用修改,保持默认的配置即可。

第二步:配置串口引脚功能。
按照下图标号步骤进行设置就可以。

在这里插入图片描述

打开串口配置界面,点击NVIC Setting界面,勾选里面的串口中断使能即可。然后在NVIC处设置中断分组和优先级,如下图所示:

在这里插入图片描述

到此,串口中断的功能就配置完成了,只添加这里串口的配置,其它的都不用修改。

2.2 生成工程代码部分

外设功能配置完成后,点击生成代码按钮就可以生成工程代码了。

前面部分代码和串口轮询的方式的是一样的,会在HAL_UART_MspInit函数多了NVIC相关配置,如下图所示:

在这里插入图片描述

在stm32f1xx_it.h文件里面,多了一个串口中断服务程序,当触发串口中断后,就会调用HAL库提供的HAL_UART_IRQHandler公共中断处理函数,进去该函数执行相关串口发送中断和串口接收中断处理。如下图所示:

在这里插入图片描述

到此,这些基础初始化代码没有问题之后就可以在工程上添加串口的相关工程代码了。

第3章 代码编写

串口中断的名字比轮询的名字多了一个IT,具体使用的函数介绍如下:

串口发送中断函数原型:
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)
这个是串口中断接收函数,其中第一个参数是串口句柄,第二个是数据,第三个是数据长度。

串口发送和接收中断函数是没有阻塞超时时间参数的,因为中断发送和接收是触发了中断才会执行,所以不需要死等操作。

前面学习了串口轮询方式实现数据收发,接下来简单介绍一下这个串口中断发送和接收函数的使用,收发指定长度的数据。

串口要接收内容,那么首先定义一个数据接收缓冲区,用来存放接收的数据,如下图所示:

在这里插入图片描述

代码片示例如下:

/* USER CODE BEGIN PV */
uint8_t rx_buf[5];
/* USER CODE END PV */

把数组接收缓冲区定义为全局变量,方便后面在其它文件使用,不用赋初值。

在main文件调用串口中断接收函数,传入相关参数如下图所示:

在这里插入图片描述

编译下载代码后,可可以在串口调试助手数据发送区输入发送5字节数据内容,可以看到S处的数值是5则说明发送了5字节数据。

注意不要勾选⑤处的发送新行按钮,否则数据会多一个回车换行符占,它们占2字节数据长度。如下图所示:

在这里插入图片描述

由于代码只写了数据接收函数,并没有写数据发送函数,所以串口助手接收区是看不了显示内容的,为了要看到内容,则需要在代码添加串口发送函数才行,如下图所示:

在这里插入图片描述

在中断文件里面编写回调函数,添加LED翻转代码,用来指示串口中断是否被触发。在下面添加串口中断发送函数,把接收到的5字节内容转发出去。

这里需要注意一下,为了书写严谨,我用了串口基地址的判断,这个一般在工程用到多个串口时才需要这样写的,用于区分具体是哪个串口,如果工程只有一个串口,不这样写也可以的。无论多少,都建议写上,这样就不会容易出错了。

代码片示例如下:

/* USER CODE BEGIN 1 */
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{
	if(huart->Instance == USART1)
	{
		HAL_GPIO_TogglePin(LED_GPIO_Port, LED_Pin);   /* 提示中断被触发 */
		HAL_UART_Transmit_IT(&huart1, rx_buf, sizeof(rx_buf));
	}
}
/* USER CODE END 1 */

外部声明一下该数组,不然会报错的。

在这里插入图片描述

写完后再次编译下载程序到开发板,发送5字节内容,可用发现开发板的LED亮了,串口助手也可用成功显示5字节的内容,如下图所示:

在这里插入图片描述

此时可以发现,只能发送一次,第二次发送没有现象了,就像程序被卡死一样。只能复位了才能发送第二次。

如果需要循环的收发的话,则需要在回调函数添加一个串口中断接收函数才行,默认只写了串口发送函数,添加如下图所示:

在这里插入图片描述

代码片示例如下:

/* USER CODE BEGIN 1 */
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{
	if(huart->Instance == USART1)
	{
		HAL_GPIO_TogglePin(LED_GPIO_Port, LED_Pin);   /* 提示中断被触发 */
		HAL_UART_Transmit_IT(&huart1, rx_buf, sizeof(rx_buf));
		HAL_UART_Receive_IT(&huart1, rx_buf, sizeof(rx_buf));	
	}
}
/* USER CODE END 1 */

编写完再次下载到开发板,可以发现可以循环发送和接收数据了,串口发送和接收到5个字节内容都会让LED状态翻转。

到此,使用串口中断的方式实现数据的发送和接收的简单使用就完成了,不过这个操作只是实现指定长度的串口数据收发,如果需要接收不定长的数据,那么可以考虑使用空闲中断的方式实现,这里就不展开描述。

注意
如果串口助手发送和接收的内容不足5字节,则不会触发中断,需要等待发送和接收够5个字节的数据内容才会触发。

这个问题的使用和前面串口轮询方式的文章的第4章的超时时间参数说明章节的示例举例说明即可,问题处理方法是一样的,这里就不再描述。

第4章 实验现象

具体查看代码编写章节的现象即可。


总结

使用中断的方式实现数据的收发主要是在回调函数里面处理,还要注意要先在main文件里面使能开启接收中断才行,不然无法正常接收数据。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1556920.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

python--os和os.path模块

>>> import os >>> #curdir #获取当前脚本的绝对路径 >>> os.curdir . >>> import os.path >>> #获取绝对路径 >>> os.path.abspath(os.curdir) C:\\Users\\GUOGUO>>> #chdir #修改当前目录 >&g…

【Python使用】python高级进阶知识md总结第6篇:线程执行带有参数的任务,1. 线程执行带有参数的任务的介绍【附代码文档】

python高级进阶全知识知识笔记总结完整教程(附代码资料)主要内容讲述:操作系统,虚拟机软件。ls命令选项,mkdir和rm命令选项。压缩和解压缩命令,文件权限命令。编辑器 vim,软件安装。获取进程编号…

MATLAB 自定义均值滤波 (53)

MATLAB 自定义均值滤波 (53) 一、算法介绍二、算法实现1.原理2.代码一、算法介绍 均值滤波,是一种常见的点云平滑算法,改善原始点云的数据质量问题,MATLAB自带的工具似乎不太友好,这里提供自定义实现的点云均值滤波算法,具体效果如下所示: 均值滤波前: 均值滤波后:…

[OAuth2]authorization_request_not_found

最近在写一套OAuth2s授权认证,当在oauth2-client调用oauth2-server,并且在点击授权以后,oauth2-client却显示【authorization_request_not_found】,并跳到了登陆页面。 经过调试发现,【authorization_request_not_fou…

Linux:TCP协议的三次握手和四次挥手

文章目录 三次握手四次挥手为什么要进行三次握手?三次握手也不安全 本篇解析的主要是TCP的三次握手和四次挥手的过程 三次握手 如图所示,在TCP要进行链接的时候,其实是要进行三次握手的 第一次握手是指,此时客户端要给服务器发送…

启信宝商业大数据助力全国经济普查

近日,合合信息旗下启信宝收到中国青年创业就业基金会感谢信,对启信宝协同助力全国经济普查和服务青年创业就业研究表达感谢。 第五次全国经济普查是新时代新征程上一次重大国情国力调查,是对国民经济“全面体检”和“集中盘点”,…

Solo 开发者周刊 (第9期):Dawwin首位人工智能编程师或将改变未来?

这里会整合 Solo 社区每周推广内容、产品模块或活动投稿,每周五发布。在这期周刊中,我们将深入探讨开源软件产品的开发旅程,分享来自一线独立开发者的经验和见解。本杂志开源,欢迎投稿。 好文推荐 Dawwin首位人工智能编程师&#…

综合实验配置

1,配置IP地址 R1: [R1]dis ip interface brief Interface IP Address/Mask Physical Protocol GigabitEthernet0/0/0 192.168.1.254/24 up up Serial4/0/0 15.1.1…

OpenHarmony OpenCV应用样例开发

背景 OpenCV 介绍 OpenCV(Open Source Computer Vision Library)是一个开源的计算机视觉和机器学习软件库。它由一系列的 C 函数和少量 C 类构成,同时提供 Python、Java 和 MATLAB 等语言的接口,实现了图像处理和计算机视觉方面…

四轴飞行器玩具软件技术服务

广东四轴飞行器玩具软件技术服务。 东莞市酷得智能科技有限公司成立于广东省东莞市松山湖高新产业园区,我们专注于电子类方案开发设计,提供多类型的IC采购服务。 酷得的益智玩具软件方案定制服务旨在为客户提供一站式的解决方案,帮助其在竞争…

【AcWing】蓝桥杯集训每日一题Day9|区间合并|1343.挤牛奶(C++)

1343.挤牛奶 1343. 挤牛奶 - AcWing题库难度:简单时/空限制:1s / 64MB总通过数:4627总尝试数:13242来源:usaco training 1.3算法标签区间合并差分 题目内容 每天早上 5 点,三名农夫去牛场给奶牛们挤奶。 …

ROS 2边学边练(6)-- 何为参数(parameters)

概念 这一知识点,应该很好理解,参数就是节点的属性,比如猫科动物,它所拥有的属性(参数)有胡子、能伸缩的爪子、随光线缩放自如的瞳孔、夜视能力、优秀的弹跳力、萌等等。ROS节点中参数支持的数据类型有整型…

分治实现快速排序和归并排序

本文用于记录个人算法竞赛学习,仅供参考 一.快速排序(升序为例) 思想:确定分界点x,将小于分界点的值放在分界点的左边,将大于分界定的值放在分界点的右边,再递归处理两边的左右区间。 步骤&am…

1、Cocos Creator 基础入门

目录 Cocos Creator 是什么? 语言支持 功能特性 工作流程 功能模块 相关游戏 参考 Cocos Creator 是什么? Cocos Creator 既是一款高效、轻量、免费开源的跨平台 2D&3D 图形引擎,也是一个实时 2D&3D 数字内容创作平台。拥有…

Java研学-SpringBoot(四)

六 SpringBoot 项目搭建 1 创建项目 spring2.X版本在2023年11月24日停止维护&#xff0c;而Spring3.X版本不支持JDK8&#xff0c;JDK11&#xff0c;最低支持JDK17&#xff0c;目前阿里云还是支持创建Spring2.X版本的项目 2 修改所需依赖版本 – pom <?xml version&quo…

从0开始打架基于VUE的前端项目

准备与版本 安装nodejs(v20.11.1)安装vue脚手架(@vue/cli 5.0.8) ,参考(https://cli.vuejs.org/zh/)vue版本(2.7.16),vue2的最后一个版本初始化项目 创建一个git项目(可以去gitee/github上创建),注意创建一个空项目创建项目vue create mvp-admin-vue-ui删除自己创建的gi…

如何制作Word模板并用Java导出自定义的内容

1前言 在做项目时会按照指定模板导出word文档,本文讲解分析需求后,制作word模板、修改模板内容,最终通过Java代码实现按照模板自定义内容的导出。 2制作word模板 2.1 新建word文档 新建word文档,根据需求进行编写模板内容,调整行间距和段落格式后将指定替换位置留空。…

50 基于 provide/inject 属性的模型视图不同步问题

前言 这是一个之前 2023年12月月底碰到的一个问题 这个问题还是 比较复杂, 呵呵 这个在当时 看来 我甚至觉得 我可能搞不定这个问题 但是 当时出现了一些 其他的可以临时解决这个问题的方式, 因此 当时就没有深究 然后 过了两天 重新复现了一下 问题, 重新看了一下 这个问题…

2023年第十四届蓝桥杯大赛软件类省赛C/C++研究生组真题(代码完整题解)

C题-翻转⭐ 标签:贪心 简述:如果 S 中存在子串 101 或者 010,就可以将其分别变为 111 和 000,操作可以无限重复。最少翻转多少次可以把 S 变成和 T 一样。 链接: 翻转 思路:要求步骤最少->S每个位置最多修改一次->从头开始遍历不匹配就翻转->翻转不了就-1 …

CVE-2023-38408漏洞修复 - 升级openssl和openssh

CVE-2023-38408 OpenSSH 代码问题漏洞修复 - 升级openssl和openssh ※ 重要说明&#xff1a; 1、升级后会导致无法用ssh远程登录&#xff0c;提示“Permission denied, please try again.” 2、解决方案请查看本章节【三、解决升级后无法用ssh远程登录】 目录 CVE-2023-38408 O…