蓝桥杯STM32G431RBT6学习——USART

news2025/1/13 5:53:36

蓝桥杯STM32G431RBT6学习——USART

前言

串口在蓝桥杯近几届中考频也相对较高(十三、十二届均考),因此必然也要学习一下。
在这里插入图片描述

作为后来之秀的开源项目DAP Link不仅支持SWD调试下载,同时还支持串口调试功能,国信长天开发板上使用的是一块STM32F103C8T6烧写的固件(奢侈),其串口连接的是STM32G431的PA9、PA10。

STM32CubeMX配置

在这里插入图片描述
将PA9、PA10设置为USART1使用引脚后,将USART1配置为异步通信即可,通信细节(波特率、停止位等)视情况自行调节,最后打勾NVIC中断

Keil代码编写

重新了解了一下HAL库的中断流程,以下做复习使用:
HAL库的初始化代码,都会由CubeMX自动生成于一组文件中,例如usart.c、usart.h等,在CubeMX中配置的外设参数,例如波特率、停止位等均在.c文件中以一个初始化函数进行实现。
对于其中断配置,HAL库提供一个中断函数(如:USART1_IRQHandler)对相关中断进行注册使能,此步骤由CubMX配置自动生成,我们需要做的只是将其回调函数进行重写即可。(HAL_xxx_Callback)回调函数由中断注册函数间接调用,以上中断配置于stm32g4xx_it.c中完成。

USART相关API:
常用中断回调函数
对于HAL_UART_IRQHandler存在一个问题,该函数每次执行结束以后,都会清除中断标志,并取消中断的使能

//串口中断注册函数,注册以后中断才会使能,CubeMX配置自动调用
void HAL_UART_IRQHandler(UART_HandleTypeDef *huart);
//数据发送中断触发的回调函数
void HAL_UART_TxCpltCallback(UART_HandleTypeDef *huart);
//数据接收中断触发的回调函数
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart);

参数:串口类型句柄,有CubeMX生成定义

串口发送、接收函数
这两个函数并不会触发中断,同时具备超时参数Timeout

HAL_StatusTypeDef HAL_UART_Transmit(UART_HandleTypeDef *huart, const uint8_t *pData, uint16_t Size, uint32_t Timeout);
HAL_StatusTypeDef HAL_UART_Receive(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size, uint32_t Timeout);

参数1:串口类型句柄,有CubeMX生成定义;
参数2:发送/接收的数据;
参数3:发送/接收的数据长度,通常使用string.h中的strlen获取;
参数4:超时时间,当发送/接收时间到仍未发送/接收到指定字符长度,则会取消此次发送/接收
串口发送、接收函数(中断式)
这两个函数会触发中断,
对于发送函数:该函数每发送一次数据就会触发一次中断,且无法连续调用,只有上次发送结束后才能进行下一次发送;
对于接收函数:该函数只有接收数据长度达到Size以后才会触发中断

HAL_StatusTypeDef HAL_UART_Transmit_IT(UART_HandleTypeDef *huart, const uint8_t *pData, uint16_t Size);
HAL_StatusTypeDef HAL_UART_Receive_IT(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size);

参数1:串口类型句柄,有CubeMX生成定义;
参数2:发送/接收的数据;
参数3:发送/接收的数据长度,接收时常设为1用于接收不定长度的数据

串口发送示例
因为我们一般在串口发送的时候并不需要做中断处理,因此其实使用哪个发送函数均可。

  char txt[20];
  int num = 0;
  /* USER CODE END 2 */

  /* Infinite loop */
  /* USER CODE BEGIN WHILE */
  while (1)
  {
    /* USER CODE END WHILE */
	sprintf(txt,"hello -%d\r\n",num);
	HAL_UART_Transmit_IT(&huart1,(uint8_t *)txt,strlen(txt));
	num++;
	HAL_Delay(500);
    /* USER CODE BEGIN 3 */
  }

串口接收示例
为了不占用系统时间,我们在串口接收的时候一般使用中断进行处理接收到的数据,因此流程如下:
1、使用HAL_UART_Receive_IT函数开启中断;
2、重写接收回调函数HAL_UART_RxCpltCallback;
3、执行完回调函数后重新使用HAL_UART_Receive_IT函数开启中断

void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{
	//将接收的数据写入数组
	buf[no] = data;
	//接收一个字节数据
	HAL_UART_Receive_IT(huart,&data,1);
	//数组元素移位
	no++;
	//接收到回车时候将接收的数据发送出去并重新接收
	if(data == '\n')
	{
		HAL_UART_Transmit(huart,(uint8_t *)buf,strlen(buf),50);
		no = 0;
	}
}

注意:由于系统初始并未开启中断,因此需要在死循环前使用HAL_UART_Receive_IT函数进行中断第一次开启,后续的中断开启在回调函数中完成。

后记

至此,终于捋清楚了所谓的阻塞式和非阻塞式,所谓阻塞式就是当前函数占用系统CPU完成当前任务,在当前任务完成之前都会卡在该函数,所谓非阻塞式就是使用中断来完成当前任务。此外,HAL库的中断注册函数会取消中断使能需要格外注意。

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

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

相关文章

软件课设(Ⅲ)——padavan-ng编译以及内核模块修改

我记得今年的很多笔试面试都遇到了linux相关的操作,答题状况都挺……昂。算是补课吧,正好大四的毕业实习、软3还有研0的项目都需要linux的环境进行推进,记录一下,聊作纪念。 实验要求 编译系统,下载并提交,…

大数据技术之Hadoop(Yarn)

第1章 Yarn资源调度器 我们先来思考下面几个问题: 1)如何管理集群资源? 2)如何给任务合理分配资源? Yarn是一个资源调度平台,负责为运算程序提供服务器运算资源,相当于一个分布式的操作系统平…

图形编辑器:修改图形 x、y、width、height、rotation

大家好,我是前端西瓜哥。图形编辑器的一个需求,就是可以通过属性面板的输入框设置选中元素的属性值。 项目地址,欢迎 star: https://github.com/F-star/suika 线上体验: https://blog.fstars.wang/app/suika/ 最终效果…

Express框架连接MongoDB数据库操作

在上一篇中已经在Node.js中引入使用了mongoose进行MongoDB数据库的基本操作,在本篇当中在Express框架中来连接数据库以及操作数据库; Express 项目环境 这里是通过全局安装Express框架生产的项目环境,也可以通过局部安装的方式,安…

【MySQL】第十一部分 SELECT的执行过程

【MySQL】第十一部分 SELECT的执行过程 文章目录【MySQL】第十一部分 SELECT的执行过程11. SELECT的执行过程11.1 SQL92语法的结构11.2 SQL92语法的结构11.3 语句执行顺序11.4 解释之前遗留问题总结11. SELECT的执行过程 11.1 SQL92语法的结构 SELECT ... FROM TABLE WHERE 多…

STM32G431—ADC+E2PROM读写实验

目录 1.ADC介绍 配置cubemx 代码 2.IIC 通信 原理图 AT24C02 代码 i2C.c 主函数 1.ADC介绍 ADC 有多达 18 个转换通道,其中通道 0~通道 15 是外部通道,使用的 GPIO 引脚如表 所示。 ADC引脚GPIO引脚GPIO配置ADC引脚GPIO引脚GPIO配置IN0PA0模拟输…

Aspose.PDF for .NET提取矢量图像的支持

Aspose.PDF for .NET提取矢量图像的支持 增加了对提取矢量图像的支持。 改进了PDF到Microsoft Excel的转换。 添加了对创建“PrinterMark”批注的支持。 增加了检测PDF文件是否包含矢量图形的功能。 Aspose.PDF for.NET是一个高级PDF处理和解析API,用于在跨平台应用…

Linux常用命令——setsid命令

在线Linux命令查询工具(http://www.lzltool.com/LinuxCommand) setsid 在新的会话中运行程序。 补充说明 setsid命令子进程从父进程继承了:SessionID、进程组ID和打开的终端。子进程如果要脱离这些,代码中可通过调用setsid来实现。,而命令…

C#中的基本概念(类_对象_属性_方法)

C#中的基本概念(类_对象_属性_方法) 对象的概念: 任何存在的实体都是对象,对象是真实存在的, 它包括“静态特征”和“动态特征” 对象包含2个方面: 静态特征:表示对象的属性,用来存储对象本身的数据 动态特征(行为):表示对象的方法,用来说明对象能做什么 例如: 一…

云服务器部署Node.js前后端分离项目

云服务器部署Node.js 前后端分离项目 准备工作 1.拥有一台服务器 自行选择阿里云,腾讯云… 2.重装系统 以腾讯云为例,安装centos 7.6系统 重置一下密码 3.使用远程管理工具 以宝塔工具为例,添加连接 4.安装宝塔面板 宝塔面板 - 简单好用的Linux…

基于ImageAI的图像识别

博主简介 博主是一名大二学生,主攻人工智能研究。感谢让我们在CSDN相遇,博主致力于在这里分享关于人工智能,c,Python,爬虫等方面知识的分享。 如果有需要的小伙伴可以关注博主,博主会继续更新的&#xff0c…

每日学术速递1.25

CV - 计算机视觉 今天带来的是北航IRIP实验室被国际计算机视觉与模式识别会议CVPR 2022接收的6篇论文。 CVPR是由IEEE主办的计算机视觉、模式识别及人工智能等领域最具影响力和最重要的国际顶级会议。CVPR官网显示,此次会议有超过8161篇的大会论文投稿,…

测试篇(三):测试用例的万能公式、对水杯和登录页面设计测试用例、测试用例的设计方法

目录一、测试用例的万能公式二、对登录页面设计测试用例三、测试用例的设计方法3.1 基于需求的设计方法3.2 等价类3.3 边界值3.4 判定表3.5 正交排列3.6 场景设计法3.7 错误猜测法四、面试真题一、测试用例的万能公式 首先,为"水杯"设计一个测试用例&…

计算机网络基础(二)

文章目录1. 应用层1.1 定制应用层协议1.2 网络版计算器实现1.3 应用层细分1.4 HTTP协议1.4.1 认识网址(URL)1.4.2 HTTP协议简易了解1.4.3 简易版HTTP服务器1.4.4 HTTP请求报文详解1.4.5 响应报文1.4.6 HTTP的一些安全问题1.5 HTTPS协议1.5.1 HTTPS和SSL/TLS1.5.2 短链接和长链接…

【Java|golang】1802. 有界数组中指定下标处的最大值---双指针

给你三个正整数 n、index 和 maxSum 。你需要构造一个同时满足下述所有条件的数组 nums&#xff08;下标 从 0 开始 计数&#xff09;&#xff1a; nums.length n nums[i] 是 正整数 &#xff0c;其中 0 < i < n abs(nums[i] - nums[i1]) < 1 &#xff0c;其中 0 &l…

2023年最新Python常见编程面试题(1)精选30个题目附答案

2023年最新Python面试题&#xff08;1&#xff09;之基础篇精选1.统计字符串中字符出现的次数2.获取字典key值键中小写字母对应键值对3.将字典中key变小写4.更改字典value值5.将cookies变成字典形式6.有如下字符串username把它转换成为UserName7.分别求出奇数和偶数把奇数偶数存…

NLP | 打造一个‘OpenAI智能’机器人,只需要五分钟

借用openai api,做一个聊天机器人&#xff0c;别去openai主页啦~Step 1.登录OpenAI账号网站&#xff1a;Overview - OpenAI APIStep 2.生成API key点击右上角的个人个人账户-> 点击 View API keys点击生成一个秘钥&#xff08;Create new secret key&#xff09;,并且复制St…

GameFrameWork框架(Unity3D)使用笔记(九) AssetBundle和游戏打包

目录 前言&#xff1a; 整个流程&#xff1a; 一、配置路径 二、打包 三、初始化资源 四、测试打包 前言&#xff1a; 如果使用了GameFrameWork框架的话&#xff0c;你会发现你点击Build And Run按钮打包运行大概是运行不起来的。本篇就讲了怎么打包游戏运行。 我觉得我对…

什么是YOLOR?

简述YOLOR 是一种用于对象检测的最先进的机器学习算法&#xff0c;与 YOLOv1-YOLOv5 不同&#xff0c;原因在于作者身份、架构和模型基础设施的差异。YOLOR 代表“你只学习一种表示”&#xff0c;不要与 YOLO 版本 1 到 4 混淆&#xff0c;其中 YOLO 代表“你只看一次”。 YOLO…

Docker的常用命令

文章目录 目录 文章目录 前言 一、帮助命令 二、镜像命令 1.查看镜像 2.搜索镜像 3.下载镜像 4.删除镜像 三、容器命令 1.启动容器 2.查看容器 3.退出容器 4.删除容器 5.启动和停止容器 四、常用的其它命令 后台运行 查看日志 查看容器中进程的信息 查看镜像的元数据…