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;…

重拾C++之菜鸟刷算法第16篇 --- 动态规划(总结篇)

动态规划 五部曲 确定dp数组的含义递推公式正确进行初始化遍历顺序举例推到dp数组 01 背包问题 第一种&#xff1a;填满背包所需的最大价值 有n件物品和一个最多可以背重量为w的背包。第i件物品的重量是weight[i]&#xff0c;得到的价值是value[i]&#xff0c;所有物品只能…

每日OJ题_子序列dp⑤_力扣1218. 最长定差子序列

目录 力扣1218. 最长定差子序列 解析代码 力扣1218. 最长定差子序列 1218. 最长定差子序列 难度 中等 给你一个整数数组 arr 和一个整数 difference&#xff0c;请你找出并返回 arr 中最长等差子序列的长度&#xff0c;该子序列中相邻元素之间的差等于 difference 。 子序…

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

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

math模块篇(七)

文章目录 math.dist(p, q)math.hypot(*coordinates)math.sin(x)math.tan(x)math.degrees(x)math.radians(x)math.acosh(x)math.asinh(x)math.atanh(x) math.dist(p, q) 在Python的math模块中&#xff0c;并没有一个名为math.dist(p, q)的函数。可能你是想要计算两点p和q之间的…

LeetCode题练习与总结:字母异位词分组

一、题目描述 给你一个字符串数组&#xff0c;请你将 字母异位词 组合在一起。可以按任意顺序返回结果列表。 字母异位词 是由重新排列源单词的所有字母得到的一个新单词。 示例 1: 输入: strs ["eat", "tea", "tan", "ate", &quo…

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

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

2024.3.30每日一题

LeetCode 需要添加的硬币的最小数量 题目链接&#xff1a;2952. 需要添加的硬币的最小数量 - 力扣&#xff08;LeetCode&#xff09; 题目描述 给你一个下标从 0 开始的整数数组 coins&#xff0c;表示可用的硬币的面值&#xff0c;以及一个整数 target 。 如果存在某个 c…

在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…

flutter 自定义弹窗封装弹窗----在弹窗内实现部分窗体生命周期

小部件组件 可以在里面加装其他事件如HTTP接口访问 import package:flutter/material.dart;///执行弹窗动画封装 class ExecutionDialog extends StatefulWidget {// final String? title;// final String? message;// final Function? onExecute;//// const ExecutionDial…

暴力枚举--选数

题目描述 已知 n 个整数 x1​,x2​,⋯,xn​&#xff0c;以及 1 个整数 k&#xff08;k<n&#xff09;。从 n 个整数中任选 k 个整数相加&#xff0c;可分别得到一系列的和。例如当 n4&#xff0c;k3&#xff0c;4 个整数分别为 3,7,12,19 时&#xff0c;可得全部的组合与它…

关于Docker守护程序未运行导致的错误

01 在启动Docker之前&#xff0c;确保你已经安装了Docker并且Docker服务是运行的。以下是一些步骤可以帮助你解决这个问题&#xff1a; 首先&#xff0c;确保Docker已经正确安装在你的系统上。你可以通过运行以下命令来检查Docker是否已安装&#xff1a; docker --version如果…

【免费获取】【下片神器】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希尔排序知识点(含面试大厂题和源码)

希尔排序&#xff08;Shell Sort&#xff09;是插入排序的一种改进版本&#xff0c;也被称为“缩小增量排序”。它是由IBM的研究员Donald Shell于1959年提出的。希尔排序的核心思想是将原始数据集分割成若干个子序列&#xff0c;每个子序列由相隔一定增量的元素组成&#xff0c…