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

news2024/11/17 8:53:38

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.coloradmin.cn/o/972599.html

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

相关文章

应用可视化流程设计,实现提质增效流程化办公!

如果想要实现提高办公效率的目的,显然采用传统的办公方式是无法实现的。如今,在低代码技术平台深入无纸化办公的当下,应用可视化流程设计软件,可以借助其灵活、易操作、可视化、轻量级等优势特点,助力广大用户实现流程…

图解SQL查询之去重技巧:如何使用DISTINCT对数据进行去重

使用 SQL 的 DISTINCT 关键字,可以去除重复的数据记录,只保留不同的记录。 以下是用到的表。 例如,要获取所有学生所在班级的唯一班级ID。

工业4G路由器的户外组网与无人值守场景应用

工业4G路由器是专为不便电缆布线的工业或日晒雨淋网络不畅的户外环境所设计的网络设备。它能够在没有光纤宽带的情况下使用插卡的方式提供4G或无线WiFi的网络支持。具备工业级防水功能,能够在户外环境下进行网络部署,并实现无人值守运行。工业4G路由器还…

使用Xshell串口通过Ymodem协议发送文件

一. 虚拟串口 首先使用虚拟串口软件Free Virtual Serial Ports(下载链接)创建一对虚拟串口,如图COM1和COM2,然后COM1用Xshell连接,COM2用串口助手连接,二者连接的波特率需一致;Xshell创建串口连…

css中的z-index是什么

css中的z-index是什么 在 CSS 中&#xff0c;有一个属性可以显式控制 HTML 元素的堆叠顺序&#xff1a;z-index。具有较高值的​​元素就会出现在顶部&#xff1a; <style>.box {position: relative;width: 50px;height: 50px;border: 3px solid;background: silver;}.…

【HAL库】STM32F407----内部Flash的读写

【HAL库】STM32CubeMX开发----STM32F407----目录 一、STM32存储器介绍 STM32存储器分为以下两种&#xff1a; 1. 随机存储器—RAM RAM是与CPU直接交换数据的内部存储器&#xff0c;也叫主存&#xff08;内存&#xff09;。它可以随时读写&#xff0c;而且速度很快&#xff0…

记录--移动端的双击事件好不好用?

这里给大家分享我在网上总结出来的一些知识&#xff0c;希望对大家有所帮助 前言 2023年了&#xff0c;我不允许还有人不会自己实现移动端的双击事件。 过来&#xff0c;看这里&#xff0c;不足 50 行的代码实现的双击事件。 听笔者娓娓道来。 dblclick js原生有个dblclick双击…

大文件上传demo,前端基于Uppy,后端基于koa

前言 文件上传基本上所有的管理系统之类的项目都有这么一个功能。因为使用了Element&#xff0c;可以方便的使用 其提供的Upload组件&#xff0c;对于普通上传来说基本上就够用了。但是有时候会涉及到大文件上传的需求&#xff0c;这时就会面临一些问题&#xff1a;比如文件上…

使用QPixmap显示图片

在QT中&#xff0c;经常需要我们显示图片&#xff08;作为背景&#xff0c;游戏元素&#xff0c;菜单背景&#xff0c;等待&#xff09;。 本文将用最简洁的方法介绍如何将图片素材显示在指定控件的指定位置。 一.基础知识 QPixmap 该类可以加载&#xff08;load&#xff0…

算法:合并两个有序数组---双指针[1]

1、题目&#xff1a; 给你两个按 非递减顺序 排列的整数数组 nums1 和 nums2&#xff0c;另有两个整数 m 和 n &#xff0c;分别表示 nums1 和 nums2 中的元素数目。 请你 合并 nums2 到 nums1 中&#xff0c;使合并后的数组同样按 非递减顺序 排列。 注意&#xff1a;最终&a…

什么是websockret连接

什么是WebSocket WebSocket&#xff0c;是一种网络传输协议&#xff0c;位于 OSI 模型的应用层。可在单个 TCP 连接上进行全双工通信&#xff0c;能更好的节省服务器资源和带宽并达到实时通迅 客户端和服务器只需要完成一次握手&#xff0c;两者之间就可以创建持久性的连接&am…

一种结合白平衡统计信息和曝光信息的软光敏算法专利学习(专利三)

基础理论&#xff1a; 亮度计算&#xff1a; 对于白天模式而言&#xff0c;IR滤光片处于过滤红外光的状态&#xff0c;也就是说&#xff0c;摄像机的感光芯片所感受到的环境光中的红外光几乎为零&#xff1b;而对于夜晚模式而言&#xff0c;IR滤光片处于不过滤红外光的状态&am…

ABB 3BHB002916R0001 UFC721AE模拟输入卡

通道数目&#xff1a; UFC721AE 模拟输入卡通常具有多个输入通道&#xff0c;可以同时监测多个模拟信号。 输入类型&#xff1a; 这种卡片通常支持不同类型的模拟输入&#xff0c;例如电压信号、电流信号或其他传感器信号。 精度&#xff1a; UFC721AE 模拟输入卡通常具有高精…

树莓 LUMA-OLED.EXAMPLE使用

详细介绍在文件目录下的README.rst中 第一步 $ sudo usermod -a -G i2c,spi,gpio pi //好像没什么用 $ sudo apt install python3-dev python3-pip python3-numpy libfreetype6-dev libjpeg-dev build-essential //安装依赖包&#xff0c;树莓派中好像已经有了 $ sudo a…

Seata 笔记

Seata 笔记 分布式事务理论基础 CAP 定理 Consistency 一致性&#xff1a;用户访问分布式系统中的任意节点得到的结果都是一致的Availability 可用性&#xff1a;用户和访问任意健康节点都必须得到响应而不是超时拒绝Partition tolernance 分区容错性&#xff1a;出现独立分…

解决本地jar包导入maven

1、确定是否安装maven 2、输入导入命令 命令说明 <path-to-file>为你jar包所在的路径&#xff08;尽量简单并且不要含中文&#xff09; <group-id>为grouId号&#xff0c;与<artifact-id>组成唯一识别你jar包的坐标&#xff0c;当不在公共资源jar包中&#…

libbpf-bootstrap安卓aarch64适配交叉编译

1.为什么移植 疑惑 起初我也认为&#xff0c;像libbpf-bootstrap这样在ebpf程序开发中很常用的框架&#xff0c;理应支持不同架构的交叉编译。尤其是向内核态的ebpf程序本身就是直接通过clang的-target btf直接生成字节码&#xff0c;各个内核上的ebpf虚拟机大同小异&#xf…

万字解读 Android 车机核心 :CarService 的构成和链路~

前言 关于 Android 车机&#xff0c;之前分析过方控上自定义按键的输入机制和中控上旋钮输入的原理&#xff0c;但都局限于 Car Service 内 Input 相关模块。 一文了解 Android 车机如何处理中控的旋钮输入从实体按键看 Android 车载的自定义事件机制 本文将结合 Android 系…

LabVIEW开发感应电机在线匝间短路故障诊断系统

LabVIEW开发感应电机在线匝间短路故障诊断系统 工业中使用的超过85%的电动机是三相感应电动机。它们因其可靠性、设计便利性、高性能和过载能力而被广泛用于不同的应用&#xff0c;例如制造、加工、电力系统、运输等。无论它们的能力如何&#xff0c;它们都被认为是现代工业学…

Consider defining a bean of type问题解决

Consider defining a bean of type问题解决 Consider defining a bean of type问题解决 包之后&#xff0c;发现项目直接报错Consider defining a bean of type。 会有一些包你明明Autowired 但是还是找不到什么bean 导致你项目启动不了 解决方法一: 这个问题主要是因为项目拆包…