【【STM32-29正点原子版本串口发送传输实验】

STM32-29正点原子版本串口发送传输实验

通过串口接收或发送一个字符
例程目的

开发板上我们接入的是实现异步通信的UART接口
在这里插入图片描述
USB转串口原理图
我们一步步分析
在这里插入图片描述
在这里插入图片描述
PA9是串口1 的发送引脚
PA10是串口1 的接受引脚
在这里插入图片描述
在这里插入图片描述
。因为我们现在只是用到异步收发器功能,所以我们现在只需要 stm32fxx_hal_uart.c 文件(及其头文件)的驱动代码,stm32f1xx_hal_usart.c 是通用同步异步收发器,暂时没有用到,可以暂时不看。用到一个外设第一个函数就应该是其初始化函数。
在这里插入图片描述
首先我们需要做的第一步是
无论干什么事情 第一步就是先把用到的东西初始化了

HAL_UART_Init 函数

要使用一个外设首先要对它进行初始化,所以先看串口的初始化函数,其声明如下:HAL_StatusTypeDef HAL_UART_Init(UART_HandleTypeDef *huart);
这是范式例中给出的指示
我们现在直接先看正点原子讲述的介绍
它先设定了
UART_HandleTypeDef g_uartl_handle
意思就是 我们上来UART这个句柄结构体的类型下的一个名字叫g_uartl_handle
就像是int a 懂?
这里的UART_HandleTypeDef 来自于我们一开始设定的HAL_UART_Init(UART_HandleTypeDef *huart);

这只是初步的设计和占用
然后接下来我们是第一个涉及到的
用了定义新的类型
在这里插入图片描述
这是对于串口1进行初始化 我们这时候脑子迅速过一下想不对啊 这和我们上面的这个不对啊
先暂时放下这个问题
然后我们先看内部的继续
第一个是
g_uart1_handle.Instance = USART1 ;
在这里插入图片描述
我们更加抓住的重点是结构体中的两项 Instance 和 Init

(在这里我必须吐槽一声 你写东西能不能按照规矩去写 ,说的就是你 能不能写成 USART_TypeDef* Instance 就像是 int* a 整个指针类型代表了a的地址 )
而这个Init 所指代的InitTypeDef 又是一整个结构体 所以我们在上面使用的时候会有Init.BaudRate 这种用法
在这里插入图片描述
所以我们写下来
就是第一个Instance 代表的是寄存器基地址 我们写入都是USART1 其实我们在这之前就偷偷的写好了USART1 对于 整个寄存器的define 对于HAL库的所有便捷使用其实在暗中早就define 好了寄存器的位置
接下来按照要求想法写好
1)BaudRate:波特率设置。一般设置为 2400、9600、19200、115200。
2)WordLength:数据帧字长,可选 8 位或 9 位。这里我们设置为 8 位字长数据格式。
3)StopBits:停止位设置,可选 0.5 个、1 个、1.5 个和 2 个停止位,一般我们选择 1 个停止位。
4)Parity:奇偶校验控制选择,我们设定为无奇偶校验位。
5)Mode:UART 模式选择,可以设置为只收模式,只发模式,或者收发模式。这里我们设置为全双工收发模式。
6)HwFlowCtl:硬件流控制选择,我们设置为无硬件流控制。
7)OverSampling:过采样选择,选择 8 倍过采样或者 16 过采样,一般选择 16 过采样。
然后下面是
HAL_UART_Init(&g_uart1_handle)
就是把上面的那个结构体 取地址放进来 因为是(类似int* ) 类型的摆明了就是一个地址

这就相当于把HAL全部初始化完了
我们在前面的示例中只给出了一个句柄有什么嘛,这个句柄的g_什么什么的,还是我们自己define 的 ,我们首先总命名叫usart_init 然后先define 一个句柄类型的名字 ,我们把句柄下,需要自己设置的初始化的内容填上去。 接下来在最后我们浅浅的写上HAL_UART_Init 这东西到底初始化什么,那你别管了,那是HAL库的事情了 ,我们所传递给他一个蕴含句柄信息的地址就可以了。有些人会在这里问,既然你说HAL库都定义好了,为什么我不直接写这句话,我想说 ,那你傻啊,他怎么知道你要初始化什么串口,初始化成什么状态嘛。
照这么写就好了
在这里插入图片描述
接下来第二步
串口MSP回调函数
我们现在好奇为什么会这样,不是已经初始化过了嘛,你怎么又在搞这种初始化,但是此言差矣,因为我们上面的初始化的是我们的UART串口,我们回调函数的意义有没有忘记,但是每经历一次串口的初始化,我们都会调用一次MspInit 那么我们必须明白我们串口的顺序?何时调用 ,其实这部分很明显可以写进上一个UART的初始化。但是为了层次化的带吗叙述我们分开写,并且可以在此处顺便配置完GPIO的设计。
HAL_UART_MspInit (传入的还是我们上面所提供的整个新定义句柄结构的基地址)
void HAL_UART_MspInit(地址)
因为串口初始化完成之后,我们内部会自行调用
在这里插入图片描述
因为要配置GPIO了所以先确定一个
GPIO_InitTypeDef类型下的gpio_init_struct
然后判断完所使用的确实是串口1 我们开始接下来的使用
1.使能USART1和对应IO时钟
2.初始化IO
3.使能USART1中断,设置优先级
在这里插入图片描述
我们到这里做一个小型的总结 先第一步 初始化想要用的串口,配置了一大堆。
第二步到这里 ,反正串口初始化会自动调用这个Mspinit 我们把串口选择 选择完之后并且PA9 PA10 一并的GPIO设置一下 (其实我觉得私下里可以分开,但是算了写在一起也行吧)
下面叙述的是GPIO串口的配置
PA9 PA10 推挽复用 上拉 高速
在这里插入图片描述
其实这里的写法是和之前的是一模一样的,我们观察之前GPIO的显示就能看出来了
(其实所有的初始化都是一样,无论是串口还是GPIO 都是先设定所需要的内容,然后使用HAL库最惯用的初始化操作)
在这里插入图片描述
P9 P10 一个连接的输入一个是输出 毕竟是不同的嘛
在这里插入图片描述

3.接下来是开启串口异步接收中断

因为我们的任务是通过串口接收或发送一个字符。就是因为我们整个任务会用到中断,来一个信息,我难道不应该打断我目前的所作所为,然后处理事件嘛,所以说这个中断使能,和设置是必须的。最后因为我们用到串口中断,所以还需要中断相关的配置。HAL_NVIC_EnableIRQ 函数使
能串口 1 复用通道。HAL_NVIC_SetPriority 函数配置串口中断的抢占优先级以及响应优先级。
串口初始化由上述两个函数完成。
在这里插入图片描述
HAL_Init() 函数设置的分组为2,抢占优先级和响应优先级都在0~3之间 各位都是2位所以是0到3 嘿嘿

4.配置一下串口异步接收中断

在这里插入图片描述
函数描述:用于开启以中断的方式接收指定字节。数据接收在中断处理函数里面实现。⚫ 函数形参:形参 1 是 UART_HandleTypeDef 结构体指针类型的串口句柄。形参 2 是要接收的数据地址。形参 3 是要接收的数据大小,以字节为单位。
HAL_UART_Receive_IT()
在这里插入图片描述

5.第五个步骤

编写中断服务函数
使用的是HAL_UART_IRQHandler 函数是 HAL 库中断处理公共函数
void HAL_UART_IRQHandler(UART_HandleTypeDef *huart);
形参 1 是 UART_HandleTypeDef 结构体指针类型的串口句柄。

我们来看带一般会调用HAL库内部的中断共用处理函数
HAL_UART_IRQHandler
调用了这个函数之后会清除中断标志位并开始调用callback函数
所以我们在这个部分之后重新添加一个使能中断的函数
在这里插入图片描述

6.接下来我们所需要做的是串口数据接收完成回调函数

重新定义一下callback函数
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
其实最开始先确定一下该函数整个操作用到的是串口几确认正确无误再开始后续的实现
按照实现方法需要定义两个一个是串口接收数据缓冲区 一个是数据标志

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

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

相关文章

qt中子窗口最小化后再恢复显示窗口区域显示为全白色

问题: qt中子窗口最小化后再恢复显示窗口区域显示为全白色,如下图: 原因: 恢复显示后窗口为及时刷新。 解决办法: 重写showEvent函数,如下: void MyClass::showEvent(QShowEvent *event) {se…

大模型 Dalle2 学习三部曲(二)clip学习

clip论文比较长48页,但是clip模型本身又比较简单,效果又奇好,正所谓大道至简,我们来学习一下clip论文中的一些技巧,可以让我们快速加深对clip模型的理解,以及大模型对推荐带来革命性的变化。 clip结构 首选…

Mybatis 动态SQL – 使用choose标签动态生成条件语句

之前我们介绍了if,where标签的使用;本篇我们需要在if,where标签的基础上介绍如何使用Mybatis提供的choose标签动态生成条件语句。 如果您对if,where标签动态生成条件语句不太了解,建议您先进行了解后再阅读本篇,可以参考: Mybat…

CSS中如何实现文字描边效果(Text Stroke)?

聚沙成塔每天进步一点点 ⭐ 专栏简介⭐ 文字描边效果(Text Stroke)⭐ 示例⭐ 写在最后 ⭐ 专栏简介 前端入门之旅:探索Web开发的奇妙世界 记得点击上方或者右侧链接订阅本专栏哦 几何带你启航前端之旅 欢迎来到前端入门之旅!这个…

Go实现LogCollect:海量日志收集系统【上篇——LogAgent实现】

Go实现LogCollect:海量日志收集系统【上篇——LogAgent实现】 下篇:Go实现LogCollect:海量日志收集系统【下篇——开发LogTransfer】 项目架构图: 0 项目背景与方案选择 背景 当公司发展的越来越大,业务越来越复杂…

Mysql底层数据结构为什么选择B+树

索引底层采用什么数据结构,为什么使用B树而不是其他数据结构: (1)如果采用二叉树:使用递增字段作为索引时,二叉树会退化成链表,查找效率太低 (2)如果采用红黑树&#xf…

微信小程序开发:一种新型的移动应用程序开发方式

一、引言 随着移动互联网的快速发展,微信小程序作为一种新型的移动应用开发方式,正在受到越来越多的关注。微信小程序是一种基于微信平台的轻量化应用,开发者可以通过微信提供的开发工具和接口,开发出各种具有特定功能的应用程序…

如何创建一个自己的sphinx文档网站

文章目录 前言一、操作步骤1.安装anaconda2.启动python3.8环境3.安装Sphinx4.创建文件夹5.初始化环境6. 编译7.文件夹搭查看8.搭建nginx查看8. 更换主题9.错误修复10.这里提供两个模板1.Demo_md2.Demo_rst前言 最近看到公司的文档中心,突然想起,为什么不为自己创建一个文档中…

在k8s中用label控制Pod部署到指定的node上

案例-标注k8s-node1是配置了SSD的节点 kubectl label node k8s-node1 disktypessd 查看标记 测试 将pod部署到disktypessd的节点上(这里设置了k8s-node1为ssd) 部署后查看结果-副本全都运行在了k8s-node1上—符合预期 删除标记 kubectl label node k8…

顶尖211“小清华”!强过985,不要错过它!

一、学校及专业介绍 西安电子科技大学(Xidian University),简称“西电” ,位于陕西省西安市,是中央部属高校,直属于教育部,为全国重点大学,位列国家“双一流”“211工程”&#xff…

MySQL的内置函数复合查询内外连接

文章目录 内置函数时间函数字符串函数数学函数其他函数 复合查询多表笛卡尔积自连接在where中使用子查询多列子查询在from中使用子查询 内连接外连接左外连接右外连接 内置函数 时间函数 函数描述current_date()当前日期current_time()当前时间current_timestamp()当前时间戳…

Vagrant命令

文章目录 1.介绍2.下载3. 配置3.1 配置环境变量3.2 在xshell中连接使用 4. 相关命令4.1 Box相关4.2 初始化环境4.4 虚拟机相关 1.介绍 Vagrant 是一个虚拟机管理工具 2.下载 https://www.vagrantup.com/ 3. 配置 3.1 配置环境变量 测试安装是否成功 3.2 在xshell中连接使…

码云使用记录

码云使用记录 主要步骤 1、https://gitee.com 注册 2、下载Git 3、配置SSH 4、创建远程仓库 5、切到本地项目目录下将本地项目推到远程 前两步根据提示进行即可,下面从第三步开始讲解 3、配置SSH(用于提交代码和更新代码) https://gitee.…

机器人中的数值优化(七)——修正阻尼牛顿法

本系列文章主要是我在学习《数值优化》过程中的一些笔记和相关思考,主要的学习资料是深蓝学院的课程《机器人中的数值优化》和高立编著的《数值最优化方法》等,本系列文章篇数较多,不定期更新,上半部分介绍无约束优化,…

CCKS2023:基于企业数仓和大语言模型构建面向场景的智能应用

8月24日-27日,第十七届全国知识图谱与语义计算大会(CCKS 2023)在沈阳召开。大会以“知识图谱赋能通用AI”为主题,探讨知识图谱对通用AI技术的支撑能力,探索知识图谱在跨平台、跨领域等AI任务中的作用和应用途径。 作为…

nc前端合计行

nc前端合计行 1.无表体和单表体的合计行加法 只要卡片下 如果是只有表头要合计行就只留ShowTotalLine;如果是只有表体要合计行就只留ShowTotalLineTabcodes 2.多表体的合计行加法 表头卡片下和列表下都要 3.档案的合计行加法 重写一下列表模板

Python时间序列分析苹果股票数据:分解、平稳性检验、滤波器、滑动窗口平滑、移动平均、可视化...

全文链接:https://tecdat.cn/?p33550 时间序列是一系列按时间顺序排列的观测数据。数据序列可以是等间隔的,具有特定频率,也可以是不规则间隔的,比如电话通话记录(点击文末“阅读原文”获取完整代码数据)。…

史上最全的计算机发展编年史!!!

今天分享给大家,以供参考。 1614年 苏格兰人约翰纳皮尔(John Napier)发表了一篇论文,其中提到他发明了一种可以计算四则运算和方根运算的精巧装置。 1623年 威廉契克卡德(Wilhelm Schickard)制作了一个通过…

Swift 周报 第三十六期

文章目录 前言新闻和社区消息称苹果公司和印度财政部官员磋商,扩大在印度的制造产能iPhone 15 Pro 机型新增泰坦灰iPhone 15 全系配 USB-C 苹果拒绝接口和安卓互通 提案正在审查的提案 Swift论坛推荐博文话题讨论关于我们 前言 本期是 Swift 编辑组整理周报的第三十…

mysql-1:认识mysql

文章目录 数据库概述什么是数据库什么是关系型数据库 MySQL的概述MySQL是什么MySQL发展历程 SQL的概述什么是SQLSQL发展的简要历史:SQL语言分类 数据库概述 什么是数据库 数据库就是[存储数据的仓库],其本质是一个[文件系统],数据按照特定的…