STM32串口(串口基础)

news2024/11/15 13:50:23

串口整个东西可以说但凡你要碰单片机,想做点上点档次的东西的话那你就包用它的。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.coloradmin.cn/o/1950217.html

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

相关文章

【轨物方案】开关柜在线监测物联网解决方案

随着物联网技术的发展,电力设备状态监测技术也得到了迅速发展。传统的电力成套开关柜设备状态监测方法主要采用人工巡检和定期维护的方式,这种方法不仅效率低下,而且难以保证设备的实时性和安全性。因此,基于物联网技术的成套开关…

JDBC标准实现

JDBC是什么 Java Database Connectivity:Java访问数据库的解 决方案 JDBC定义了一套标准接口,即访问数据库的通用API, 不同的数据库厂商根据各自数据库的特点去实现这些接口。 JDBC希望用相同的方式访问不同的数据库,让具体 的…

Nacos 2.x 新增 grpc 端口,Nginx 需要配置TCP端口转发的注意事项

Nacos 2.x 开始,最大的变化就是端口。在默认主端口 8848 之外又新增了三个端口,新增端口是在配置的主端口 server.port 的基础上,进行一定偏移量自动生成。 8848(主端口,默认8848)web页面端口及相关http接口…

医院等保解决方案有哪些?用哪些软件可以加强等级保护?

在医疗领域,信息系统的安全直接关系到患者的隐私保护、医院的正常运营乃至社会的稳定。医院信息系统面临着越来越多的安全挑战。 为了确保患者信息的安全与隐私保护,医院需要采取有效的等保(等级保护)措施。那么,医院…

数据恢复教程:如何从硬盘、SD存储卡、数码相机中恢复误删除数据。

您正在摆弄 Android 设备。突然,您意外删除了一张或多张图片。不用担心,您总能找到一款价格实惠的数据恢复应用。这款先进的软件可帮助 Android 用户从硬盘、安全数字 (SD) 或存储卡以及数码相机中恢复已删除的数据。 Android 上数据被删除的主要原因 在…

以FastGPT为例提升Rag知识库应用中的检索召回命中率

提升Rag知识库应用中的检索召回命中率 在构建Rag(Retrieval-Augmented Generation)知识库应用时,检索召回知识片段的命中率是至关重要的。高效、准确的检索机制是确保AI系统能够精准响应用户查询的基础。当前,FastGPT主要采用三种…

四步实现网站HTTPS访问

随着网络安全的重要性日益凸显,HTTPS(超文本传输安全协议)已成为现代网站的标准配置。HTTPS协议作为HTTP协议的安全版本,通过SSL协议加密数据传输,不仅能保护用户数据的安全,还能提升搜索引擎排名&#xff…

一文带你搞懂C++友元和类型转换

6. C友元 在C中,一个类中可以有 public、protected、private 三种属性的成员,通过对象可以访问 public 成员,只有本类中的函数可以访问本类的 private 成员。现在,我们来介绍一种例外情况——友元(friend)。…

【ai】Easy-RAG 6:安装bge-reranker-large、 成功部署并通过frpc访问

作者用到了funasrwhisper还有RAG的rerank模型这里用的是bge-reranker-large , 要从 https://huggingface.co/BAAI/bge-reranker-large 下载。AttributeError: module ‘numba’ has no attribute ‘jit’ 【ai】Easy-RAG 4: 修复依赖项:numpy numba omegaconf 等作者的地址是…

英特尔宣布针对对Llama 3.1进行优化 以提升所有产品的性能

日前Meta正式发布了Llama 3.1开源大模型,以其庞大的参数量和卓越性能,首次在多项基准测试中击败了GPT-4o等业界领先的闭源模型。允许开发者自由地进行微调、蒸馏,甚至在任何地方部署,这种开放性为AI技术的普及和创新提供了无限可能…

关于promise的一些例题(运行步骤详细说明)

关于promise的一些例题(详细说明) 基本例题 // 直接运行 输出 1 2 const promise new Promise((resolve, reject) > {console.log(1);resolve();console.log(2); });// then后面放入微队列 promise.then(() > {console.log(3); });// 输出4 之后没有代码了所以运行为队…

秋招突击——7/23——百度提前批面试准备和正式面试

文章目录 引言一面准备面试预演一1、讲一下hashcode()和equals()关系2、equals()和有什么区别3、讲一下重载和重写的区别4、讲一下深拷贝、浅拷贝的区别5、讲一下Java异常的基类,运行时异常举几个例子,什么情况下会出现?6、讲一下Java中线程的…

【管控业财一体化】

1. 引言 大型集团在现代企业管理中扮演着举足轻重的角色,其管控业财一体化解决方案是实现企业高效运营的关键。随着数字化转型的加速,业财一体化不再局限于财务与业务流程的简单融合,而是向着更深层次的数据驱动、智能化决策和价值创造方向发…

光猫设置桥接 路由器pppoe拨号 设置正常访问光猫 (openwrt)

网络信息展示 光猫桥接很简单吧,就不说了。先来列出修改前的网络接口和网络信息。 光猫192.168.1.1,openwrt 10.0.0.0/8 初始配置 需要记录的信息:WAN的网络设备(eth1),光猫的IP(192.168.1.1&am…

RV1126 Linux 系统,接外设,时好时坏(一)应该从哪些方面排查问题

在 Linux 系统中接外设时,遇到“时好时坏”的问题,可能是由多种因素引起的。以下是一些排查问题的建议。 1. 硬件方面的排查 1.1 连接检查 物理连接: 确保外设与主板之间的连接良好,检查插头、插座及线缆是否牢固。引脚配置: 确认设备树中引脚的配置是否正确,尤其是引脚…

linux modetest常用命令

1 通过help有哪些参数 130|:/ # modetest -h usage: modetest [-acDdefMPpsCvrw]Query options:-c list connectors-e list encoders-f list framebuffers-p list CRTCs and planes (pipes)Test options:-P <plane_id><crtc_id>:<w>x&l…

Web开发:ASP.NET CORE中前端使用Ajax定时获取后端数据

一、低难度&#xff08;刷新a标签&#xff09; 1、需求 给a标签每15s刷新一次&#xff0c;显示最新的时间&#xff08;时间必须由后端获取&#xff09; 应该如何操作呢 2、代码 后端 using Microsoft.AspNetCore.Mvc; using Microsoft.AspNetCore.Mvc.RazorPages; using Mi…

go语言开发Prometheus Exporter(DM数据库)

一、介绍 源码步骤基于dameng_exporter源码讲解&#xff0c;看完本篇文章可以直接进行二次开发。 dameng exporter的开源地址&#xff1a;https://github.com/gy297879328/dameng_exporter&#xff08;可直接对接prometheusgrafana 提供表盘&#xff09; 开发一个exporter 其…

智谱OpenDay“大有可玩”:30秒将任意文字生成视频

Sora毫无疑问带来AI大模型的全新玩法&#xff0c;大模型可基于任意文字生成视频&#xff0c;这也是这个“大家庭”若干努力&#xff08;包括Runway的Gen系列、微软的Nuwa、Meta的Emu、谷歌的Phenaki/VideoPoet、CogVideo等&#xff09;的一个全新高度。 7月26日&#xff0c;这…

数据结构(5.3_4)——线索二叉树的概念

普通二叉树找某结点前驱和后继的方法 中序线索二叉树 n个结点的二叉树&#xff0c;有n1个空链域!可用来记录前驱&#xff0c;后继的信息 中序线索二叉树的存储结构 //线索二叉树结点 typedef struct ThreadNode {ElemType data;struct BiTNode* lchild, * rchild;int ltag,…