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

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.mzph.cn/news/781707.shtml

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

相关文章

vue3封装Element分页

配置当前页 配置每页条数 页面改变、每页条数改变都触发回调 封装分页 Pagination.vue <template><el-paginationbackgroundv-bind"$attrs":page-sizes"pageSizes"v-model:current-page"page"v-model:page-size"pageSize":t…

AP5199S LED平均电流型恒流驱动IC 0.01调光 景观舞台汽车灯驱动照明

说明 AP5199S 是一款外围电路简单的多功能平均电流型 LED 恒流驱动器&#xff0c;适用于宽电压范围的非隔离式大功率恒流 LED 驱动领域。芯片 PWM 端口支持超小占空比的 PWM 调光&#xff0c;可响应 60ns 脉宽。为客户提供解决方案&#xff0c;限度地发挥灯具优势&#xff0c;…

商品说明书的制作工具来啦,用这几个就够了!

商品说明书是用户了解产品特性、性能、使用方法的重要途径。一个明确、易懂的商品说明书&#xff0c;可以显著提升用户体验&#xff0c;进而提升产品的销量。但我们都知道&#xff0c;制作一份高质量的说明书并不容易&#xff0c;需要仔细设计、计划和撰写。幸运的是&#xff0…

rabbitMQ的基础操作与可视化界面

当你安装好RabbitMq时&#xff0c;可以 尝试一下&#xff0c;这些命令 启动rabbitMQ服务 #启动服务 systemctl start rabbitmq-server #查看服务状态 systemctl status rabbitmq-server #停止服务 systemctl stop rabbitmq-server #开机启动服务 systemctl enable rabbitmq-…

在Arduino IDE中使用文件夹组织源文件和头文件

在Arduino IDE中使用文件夹组织源文件和头文件 如果你是一名Arduino爱好者&#xff0c;你可能会发现随着项目的复杂度增加&#xff0c;代码的管理变得越来越困难。在Arduino IDE中&#xff0c;你可以通过使用文件夹来更好地组织你的源文件和头文件&#xff0c;使得代码更加清晰…

深度学习导论

具有非常详尽的数学推导过程 概述 定位 比较传统机器学习深度学习特征人工定义机器生成模型决策树、SVM、贝叶斯等&#xff08;具有不同数学原理&#xff09;神经网络 概率论 联合概率 P ( X , Y ) P ( X ∣ Y ) P ( Y ) P ( Y ∣ X ) P ( X ) P(X,Y)P(X|Y)P(Y)P(Y|X)P(X…

【免费获取】【下片神器】IDM非主流网站视频免费下载神器IDM+m3u8并解决idm下载失败问题 idm下载器超长免费试用

当你浏览一个网站&#xff0c;看到一个喜欢的视频&#xff0c;不知道如何下载的时候&#xff0c;本教程或许可以帮你点小忙。大部分的主流网站都有专门的下载工具&#xff0c;本篇教程主要针对的是一些非主流的小网站。 我们的下载方法就是利用IDM&#xff08;Internet Downlo…

web练习仿小米页面

效果图&#xff1a; HTML代码&#xff1a; <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>Document…

江苏开放大学2024年春《液压与气压传动060246》第2形考作业占形考成绩的25%参考答案

​答案&#xff1a;更多答案&#xff0c;请关注【电大搜题】微信公众号 答案&#xff1a;更多答案&#xff0c;请关注【电大搜题】微信公众号 答案&#xff1a;更多答案&#xff0c;请关注【电大搜题】微信公众号 电大搜题 多的用不完的题库&#xff0c;支持文字、图片搜题&…

python--冒泡排序和main函数

1.判断是不是回文数&#xff1a; x int(input("请输入一个正整数&#xff1a;")) x str(x) if x x[::-1]:print("是回文数。") else:print("不是回文数。") 2.冒泡排序 # 冒泡排序: # [30&#xff0c;8&#xff0c;-10&#xff0c; 50&am…

[OAuth2]authorization_request_not_found

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

java算法汇总(蓝桥常用-->自总版)(更新中...)

这里写目录标题 1.递归求n的阶乘2.互质3.例题:奇妙的数字两个数字拼接String.toCharArray()方法String.valueOf()方法 4.例题:美丽的2String.contains()方法 5.ASCII码---a,A,0的转换6.String[] a---->求sum(a[p].charAt(q))-0;7.复数BigInteger 大整数类型本题用到的方法--…

Sora是否能颠覆视频制作行业?一文带你了解

一个月前OpenAI宣布了一款名为Sora的新生成式人工智能系统&#xff0c;该系统可以根据文本提示生成短视频。虽然Sora尚未向公众开放&#xff0c;但迄今为止发布的高质量样本已经引起了兴奋和担忧的反应。 OpenAI发布的样本视频&#xff08;该公司称这些视频是由Sora直接制作&am…

Python学习笔记-简单案例实现多进程与多线程

Python 的多进程与多线程是并发编程的两种重要方式&#xff0c;用于提高程序的执行效率。它们各自有不同的特点和适用场景。 多进程&#xff08;Multiprocessing&#xff09; 概念&#xff1a; 多进程是指操作系统中同时运行多个程序实例&#xff0c;每个实例称为一个进程。…

表单元素使用

表单元素使用 要完成的效果:代码实现: 要完成的效果: 代码实现: <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0">…

完整部署一套k8s-v.1.28.0版本的集群

一、系统情况 虚拟机版本&#xff1a;esxi 6.7 系统版本&#xff1a;centos7.9_2009_x86 配置&#xff1a;4核8G&#xff08;官网最低要求2核2G&#xff09; 192.168.0.137 master节点 192.168.0.139 node2节点 192.168.0.138 node1节点&#xff08;节点扩容练习&#xf…

Linux:详解TCP报头类型

文章目录 温习序号的意义序号和确认序号报文的类型 TCP报头类型详解ACK: 确认号是否有效SYN: 请求建立连接; 我们把携带SYN标识的称为同步报文段FIN: 通知对方, 本端要关闭了PSH: 提示接收端应用程序立刻从TCP缓冲区把数据读走RST: 对方要求重新建立连接; 我们把携带RST标识的称…

python--os和os.path模块

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

创建一个vue3 + ts + vite 项目

vite 官网&#xff1a; https://cn.vitejs.dev/guide/ 兼容性注意 Vite 需要 Node.js 版本 18&#xff0c;20。然而&#xff0c;有些模板需要依赖更高的 Node 版本才能正常运行&#xff0c;当你的包管理器发出警告时&#xff0c;请注意升级你的 Node 版本。 安装项目 1. 使用n…