STM32串口(串口基础)

串口整个东西可以说但凡你要碰单片机,想做点上点档次的东西的话那你就包用它的。32的串口配置并不难,哪怕是比起51其实也难不到哪去。

目录

一.通信基础

1.通信方式

2.通信速率

二.串口基础

1.串口的数据帧结构(协议)

2.STM32中的USART

三.串口程序配置

1.接收的同时发送一位数据

2.非常经典的不等长数据配置

好了就这些,祝你看完就会。


一.通信基础

1.通信方式

1.你要知道什么叫:半双工通信;全双工通信;单工通信;这些的定义是什么就可以了。因为再配置中其实串口是可以配置成其中的某一种的。当然了,全双工是最常用的一种。由于都比较简单,这里就不多赘述。

2.同步通信与异步通信:
定义是这样的:
同步通信:发送和接收双方按照预定的时钟节拍进行数据的发送和接收,双方的操作严格同步。 异步通信:双方不需要严格的时钟同步,每一帧数据通过起始位和停止位分割,接收方可以 独立地识别每个数据块。

让我来暴力的给你总结一句话:同步的有时钟线,异步的咩有时钟线。

2.通信速率

比特率:比特率是指在单位时间内可以发送的二进制数量,也就是信息发送速率。
波特率:波特率本质上是单位时间内信号调制的次数,决定了单位时间内能发送出多少码元。

二.串口基础

1.串口的数据帧结构(协议)

启动位:它是一个逻辑0(低电平)的信号。告诉接收方数据传输即将开始。

停止位:停止位是一个逻辑高电平1,用于指示数据传输的结束。

有效数据位:就是二进制数据,由一堆高低电平组成。这里有个重点是:串口是按位发送的,而这里是低位先发送

校验位:校验数据完整性的,主要看数据包中的1的数量和对用的是否一致。但是不咋用因为不准确,不准确了自然用的就少了。

2.STM32中的USART

1.可以是异步也可以是同步
2.拥有一个硬件流控制器,其实就是用硬件来强行匹配接--收的速率匹配来降低丢包率的。
3.拥有一个波特率发生器,一般最高可以4.5MB/s
4.USART的框图:

5.USART的常用寄存器的位:
 

其中:
TXE                           发送空中断
TC                             发送完成中断                                                      
RXNE                        接收空中断
IDLE                          空闲中断
TE&RE                      发送/接收使能

其中空闲中断由软件复位。

三.串口程序配置

1.接收的同时发送一位数据

串口的配置方式和GPIO,TIM等外设配置一致的相似:

void uart_init(uint32_t bundrate){
	
	uart_handle.Instance = USART1;
	uart_handle.Init.BaudRate = bundrate;
	uart_handle.Init.HwFlowCtl = UART_HWCONTROL_NONE;
	uart_handle.Init.Mode = UART_MODE_TX_RX;
	uart_handle.Init.Parity = UART_PARITY_NONE;
	uart_handle.Init.StopBits = UART_STOPBITS_1;
	uart_handle.Init.WordLength = UART_WORDLENGTH_8B;
	HAL_UART_Init(&uart_handle);
}

随后是非常经典的MSP配置:

void HAL_UART_MspInit(UART_HandleTypeDef *huart){
	__HAL_RCC_USART1_CLK_ENABLE();
	__HAL_RCC_GPIOA_CLK_ENABLE();
	//TX初始化为复用推挽输出
	GPIO_InitTypeDef gpio_init;	
	gpio_init.Mode = GPIO_MODE_AF_PP;
	gpio_init.Pin = GPIO_PIN_9;
	gpio_init.Pull = GPIO_PULLUP;
	gpio_init.Speed = GPIO_SPEED_FREQ_HIGH;
	HAL_GPIO_Init(GPIOA,&gpio_init);
	//RX初始化为浮空输入
	gpio_init.Mode = GPIO_MODE_AF_INPUT;
	gpio_init.Pin = GPIO_PIN_10;
	HAL_GPIO_Init(GPIOA,&gpio_init);
	
	HAL_NVIC_SetPriority(USART1_IRQn,2,2);
	HAL_NVIC_EnableIRQ(USART1_IRQn);
	
	__HAL_UART_ENABLE_IT(huart,UART_IT_RXNE);
	__HAL_UART_ENABLE_IT(huart,UART_IT_IDLE);
}

这里有个重点是GPIO的两个口一个是推挽输出一个是浮空输入,如果你基础就知道使用推挽输出是为了保证数据逻辑电平不被GPIO内设的电压影响,使用浮空输入也是如此,把控制电压的控制权交出去。如果你不知道原因,也可以直接用以下推荐:

中断部分:

void USART1_IRQHandler(){
	uint8_t data;
	if(__HAL_UART_GET_FLAG(&uart_handle,UART_FLAG_RXNE) != RESET){
		HAL_UART_Receive(&uart_handle,&data,1,500);    //接收
		HAL_UART_Transmit(&uart_handle,&data,1,500);   //发送
	}

}

2.非常经典的不等长数据配置

配置方面一样,唯一不同的就是这里使用了空闲中断,该中断在被使能后会在接收完所有数据后空闲时发起一个中断,检测该中断是否触发就可以完整的收取数据:

void USART1_IRQHandler(){
	uint8_t rev_data;
	if(__HAL_UART_GET_FLAG(&uart_handle,UART_FLAG_RXNE) != RESET){
		HAL_UART_Receive(&uart_handle,&data,1,1000);
		rev_buf[len++] = rev_data;	
	}
	
	if(__HAL_UART_GET_FLAG(&uart_handle,UART_FLAG_IDLE) != RESET){
		HAL_UART_Transmit(&uart_handle,&rev_data,sizeof(rev_buf),500);
		memset(rev_buf,0,sizeof(rev_buf));
		len = 0;
		__HAL_UART_CLEAR_IDLEFLAG(&uart_handle);	//软件清零
	}
	
}

注意sizeof对数组使用时返回的是整个数组的字节数,这里可以使用sizeof直接测量数组的长度是因为串口的数据为设置位8位,所以在定义时使用了uint8_t。故而只是数值上相等。

好了就这些,祝你看完就会。

点个关注8

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【Godot4.2】GodotXML插件 - 解析和生成XML

概述 近期在研究Godot的XML和SVG解析,Godot提供了XMLParser类型,但本身只提供了低级的XML解析接口和功能,想要完成完整的XML文档解析和存储可能还需要在其基础上编写类或功能,就像我在昨天(2024年7月20日)…

Web开发:图片九宫格与非九宫格动态切换效果(HTML、CSS、JavaScript)

目录 一、业务需求 二、实现思路 三、实现过程 1、基础页面 2、图片大小调整 3、图片位置调整 4、鼠标控制切换 5、添加过渡 四、完整代码 一、业务需求 默认显示基础图片; 当鼠标移入,使用九宫格效果展示图片; 当鼠标离开&#…

基于Cobbler实现多版本系统批量部署

一、实验题目 基于Cobbler实现多版本系统批量部署 二、实验目的 通过Cobbler,实验旨在实现无需人工干预即可自动安装多个版本的操作系统。这可以大大提高机房设备或服务器集群的部署效率,减少人力成本和操作错误。 三、实验环境 centos7.9并安装Cob…

机器学习 | 回归算法原理——多重回归

Hi,大家好,我是半亩花海。接着上次的多项式回归继续更新《白话机器学习的数学》这本书的学习笔记,在此分享多重回归这一回归算法原理。本章的回归算法原理基于《基于广告费预测点击量》项目,欢迎大家交流学习! 目录 一…

【Django】anaconda环境变量配置及配置python虚拟环境

文章目录 配置环境变量配置python虚拟环境查看conda源并配置国内源在虚拟环境中安装django 配置环境变量 control sysdm.cpl,,3笔者anaconda安装目录为C:\ProgramData\anaconda3 那么需要加入path中的有如下三个 C:\ProgramData\anaconda3 C:\ProgramData\anaconda3\Scripts C:…

【数据结构】搜索二叉树

二叉搜索树 二叉树的博客 在之前的数据结构的文章中已经基本对二叉树有一定的了解,二叉搜索树也是一种数据结构,下面将对二叉搜索树进行讲解。 二叉搜索树的概念 二叉搜索树又称为二叉排序树,它或者是一棵空树,或者是具有下面性…

【微软蓝屏】微软Windows蓝屏问题汇总与应对解决策略

✨✨ 欢迎大家来到景天科技苑✨✨ 🎈🎈 养成好习惯,先赞后看哦~🎈🎈 🏆 作者简介:景天科技苑 🏆《头衔》:大厂架构师,华为云开发者社区专家博主,…

HTML常见标签——超链接a标签

一、a标签简介 二、a标签属性 href属性 target属性 三、a标签的作用 利用a标签进行页面跳转 利用a标签返回页面顶部以及跳转页面指定区域 利用a标签实现文件下载 一、a标签简介 <a>标签用于做跳转、导航&#xff0c;是双标签&#xff0c;记作<a></a>&#…

【北京迅为】《i.MX8MM嵌入式Linux开发指南》-第三篇 嵌入式Linux驱动开发篇-第三十九章 Linux MISC驱动

i.MX8MM处理器采用了先进的14LPCFinFET工艺&#xff0c;提供更快的速度和更高的电源效率;四核Cortex-A53&#xff0c;单核Cortex-M4&#xff0c;多达五个内核 &#xff0c;主频高达1.8GHz&#xff0c;2G DDR4内存、8G EMMC存储。千兆工业级以太网、MIPI-DSI、USB HOST、WIFI/BT…

MongoDB教程(十八):MongoDB MapReduce

&#x1f49d;&#x1f49d;&#x1f49d;首先&#xff0c;欢迎各位来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里不仅可以有所收获&#xff0c;同时也能感受到一份轻松欢乐的氛围&#xff0c;祝你生活愉快&#xff01; 文章目录 引言一、MapRed…

上传项目到GitHub

上传项目到GitHub 前期工作&#xff1a;创建GitHub仓库 1.使用git命令初始化文件夹 git init2.将文件夹里面所有的文件添加到本地仓库&#xff0c;如果想添加单个文件&#xff0c;将.换成文件名就好。 git add .3.给文件备注&#xff0c;双引号里面是文件备注的内容 git c…

8月开始|《660》+《880》45天带刷计划!

660880题目加起来挺多了&#xff01; 如果是一刷加上二刷错题的话&#xff0c;总共需要做2000道题左右。 如果全都吃透的话&#xff0c;按照传统的刷题方法&#xff0c;慢的话需要2个多月&#xff0c;差不多就是每天30多道题的量 快的话&#xff0c;大概就是一个月就能刷完&…

低代码如何加速数字化转型

数字化转型&#xff0c;正日益决定企业成功的关键。这里的一个关键因素是它可以以更快的速度和质量来实施技术计划。在当今瞬息万变的商业环境中&#xff0c;战略性地采用低代码平台对于旨在加快上市时间、增强业务敏捷性和促进跨团队无缝协作的首席技术官来说至关重要。日益增…

【教程】vscode添加powershell7终端

win10自带的 powershell 是1.0版本的&#xff0c;太老了&#xff0c;更换为powershell7后&#xff0c;在 vscode 的集成终端中没有显示本篇教程记录在vscode添加powershell7终端的过程 打开vscode终端配置 然后来到这个页面进行设置 查看 powershell7 的安装位置&#xff…

Linux开启coredump

在Linux系统中&#xff0c;C/C程序崩溃是常见的问题之一。Coredump是指当一个程序崩溃时&#xff0c;系统把程序运行时的内存数据以二进制文件的形式保存下来&#xff0c;以便程序开发者进行崩溃分析。本文将介绍如何开启并配置Coredump 1、查看并配置coredump 在Linux系统中…

Git仓库拆分和Merge

1. 问题背景 我们原先有一个项目叫open-api&#xff0c;后来想要做租户独立发展&#xff0c;每个租户独立成一个项目&#xff0c;比如租户akc独立部署一个akc-open-api&#xff0c;租户yhd独立部署一个yhd-open-api&#xff0c;其中大部分代码是相同的&#xff0c;少量租户定制…

昇思25天学习打卡营第20天|CV-ResNet50图像分类

打卡 目录 打卡 图像分类 ResNet网络介绍 数据集准备与加载 可视化部分数据集 残差网络构建 Building Block 结构 代码实现 Bottleneck结构 代码实现 构建ResNet50网络 代码定义 模型训练与评估 可视化模型预测 重点&#xff1a;通过网络层数加深&#xff0c;感知…

Docker-Compose配置zookeeper+KaFka+CMAK简单集群

1. 本地DNS解析管理 # 编辑hosts文件 sudo nano /etc/hosts # 添加以下三个主机IP 192.168.186.77 zoo1 k1 192.168.186.18 zoo2 k2 192.168.186.216 zoo3 k3注&#xff1a;zoo1是192.168.186.77的别名&#xff0c;zoo2是192.168.186.18的别名&#xff0c;zoo3是192.168.186.1…

【HarmonyOS】应用推送使用个推SDK如何实现?

【HarmonyOS】应用推送使用个推SDK如何实现&#xff1f; 前言 个推和极光都是市面上很成熟的推送第三方SDK了。今天讲讲个推SDK在鸿蒙中如何集成使用。 存在即合理&#xff0c;三方SDK推送给我们带来了极大的好处&#xff0c;首先在服务器后台处理一套API就可搞定&#xff0…

敏捷CSM认证:精通敏捷Scum估算方法,高效完成项目!

咱们做项目的时候可能都遇到过这种情况&#xff1a;项目一开始信心满满&#xff0c;觉得 deadline 稳了。结果呢&#xff1f;各种意外状况频出&#xff0c;时间好像怎么都不够用了&#xff0c;最后项目只能无奈延期&#xff0c;整个团队都像霜打的茄子。 说到底&#xff0c;还…