USART串口(发送和接收)

目录

一. USART串口协议

二. USART串口外设

三. 串口发送+接收

四. 效果展示


一. USART串口协议

        USART(Universal Synchronous/Asynchronous Receiver/Transmitter)通用同步/异步收发器。

        通信的目的:将一个设备的数据传送到另一个设备,扩展硬件系统。

        通信的协议:制定通信的规则,通信双方按照协议规则进行数据收发。

单片机有了通信功能,就能与众多别的模块互联。总的来说,通信的目的就是进行信息传递,双方约定的规则就是通信协议。通信协议不止一种,在STM32中,就有诸如USART,I2C,SPI,CAN,USB等通信。今天我们主要介绍USART串口通信。

        单片机的串口可以使单片机与单片机,单片机与电脑,单片机与各种各样的模块互相通信,极大地扩展了单片机的应用范围,增强了单片机系统的硬件实力。

其中,单片机和电脑通信,是串口的一大优势,可以接电脑屏幕,非常适合调试程序,打印信息。

        串口的硬件电路,需要其中一个设备的发送端TX连接另外一个设备的接收端RX,接收端RX连接另一个设备的发送端TX。当只需单向的数据传输时,可以只接一根通信线。

TX和RX都是单端信号,它们的高低电平都是相对于GND的。所以串口通信的TX,RX,GND都是必须要连接的。

        串口的参数及时序:

1)波特率:串口通信的速率。由于串口一般使用异步通信,所以需要双方约定一个通信速率。它决定了每隔多久发送一位。

2)起始位:它是标志一个数据帧的开始,固定为低电平。首先串口的空闲状态是高电平,也就是没有数据传输的时候,引脚必须要置高电平,作为空闲状态。然后需要传输的时候,就必须要先发送一个起始位,这个起始位必须是低电平,来打破空闲状态的高电平,产生一个下降沿。这个下降沿就告诉接收设备,这一帧数据要开始了。

3)停止位:在一个字节数据发送完成后,必须要有一个停止位。这个停止位的作用就是用于数据帧间隔,固定为高电平。同时,这个停止位,也是为下一个起始位做准备的。

4)数据位:表示数据帧的有效载荷,1为高电平,0为低电平,低位先行。低位先行的意思就是数据先从低位发送。

5)校验位:用于数据验证,根据数据位计算得来。校验可以选择3种方式。无校验,奇校验和偶校验。

二. USART串口外设

        一般我们串口很少使用同步功能,所以USART和UART使用起来,并没有太大的区别。所以我们学习串口,主要还是异步通信。

        USART是STM32内部集成的硬件外设,可根据数据寄存器的一个字节数据自动生成数据帧时序,从TX引脚发送出去,也可自动接收RX引脚的数据帧时序,拼接为一个字节数据,存放在数据寄存器里。

        USART外设就是串口通信的硬件支持电路。当我们配置好了USART电路,直接读写数据寄存器,就能自动发送和接收数据了。

        举个案例,我们STM32F103C8T6的USART资源就有如下:USART1,USART2,USART3.总共3个独立的USART外设,可以挂载很多串口设备。其中,USART1是APB2总线上的设备,剩下的两个都是APB1总线的设备。

下面我们来了解一下整个USART的框图和结构:

如上所示, 串口的数据寄存器就包括上面的右边部分,发送或接收的字节数据就存在这里。一个是发送数据寄存器TDR(Transmit DR)和接收数据寄存器RDR(Receive DR)。

但其实,这两个数据寄存器都占用一个地址,在程序上只表现为一个寄存器,那就是数据寄存器DR(Data Register)。

当数据从TDR移动到移位寄存器时,会置一个标志位,叫TXE(TX Empty),发送寄存器空。我们检查这个标志位,如果置1了,我们就可以在TDR写入下一个数据了。然后发送移位器就会在下面的发送器控制的驱动下,向右移位,然后一位一位地,把数据输出到TX引脚。向右移位,正好和串口协议规定的低位先行,是一致的。

同样的,接收数据的时候,也会置一个标志位,叫RXNE(RX Not Empty),接收数据寄存器非空。当我们检测到RXNE置1之后,就可以把数据读走了。当数据从移位寄存器转移到RDR时,就可以直接移位接收下一帧数据了。

如上所示的中间位置,有一个唤醒单元,而这个唤醒单元的作用就是用来实现多设备的功能。

串口一般是点对点模式。

 

上面的时钟输入一般是fPCLKx(x=1或2)。

USART1挂载在APB2,所以就是PCLK2的时钟,一般是72M.其他的USART都挂载在APB1,所以是PCLK1的时钟,一般是32M.

之后这个时钟进行一个分频,除以一个USARTDIV的分频系数。之后分频完后,还要再除个16,得到发送器时钟和接收器时钟,通向控制部分。

然后右边这里,如果TE(TX Enable)为1,就是发送器使能了,发送部分的波特率就有效。

如果RE(RX Enable)为1,就是接收器使能了,接收部分的波特率就有效。

到这里USART的框图就看完了,剩下的就是一些寄存器的指示,比如各个CR控制寄存器的哪一位控制那一部分电路。这些都可以自己看看手册里的寄存器描述。

最后我们看下USART基本结构:

上图中的最左边这里就是波特率发生器,用于产生约定的通信速率。

时钟来源是PCLK2或1.

三. 串口发送+接收

        通过观察引脚定义表,我们可以发现USART1的TX是PA9,RX是PA10.

如下所示:

 所以根据产品手册和上文中所介绍的USART串口结构,我们可以总结除如下串口的相关代码配置流程:

1)开启时钟,把需要用到的USART和GPIO的时钟打开

    RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE);	//开启USART1的时钟RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);	//开启对应的GPIO口

2)GPIO初始化,把TX配置成复用功能(因为只有复用功能才能让片上外设模块的复用功能生效),RX配置成输入模式。

    /*GPIO初始化*/GPIO_InitTypeDef GPIO_InitStructure;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_Init(GPIOA, &GPIO_InitStructure);					//将PA9引脚初始化为复用推挽输出GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;           //将PA10引脚初始化为上拉输入模式GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_Init(GPIOA, &GPIO_InitStructure);					

3)配置USART,可以直接使用一个结构体,就可以把相关的所有参数配置好了。

    /*USART初始化*/USART_InitTypeDef USART_InitStructure;					//定义结构体变量USART_InitStructure.USART_BaudRate = 9600;				//波特率USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;	//硬件流控制,不需要USART_InitStructure.USART_Mode = USART_Mode_Tx | USART_Mode_Rx;	//模式,发送模式和接收模式均选择USART_InitStructure.USART_Parity = USART_Parity_No;		//奇偶校验,不需要USART_InitStructure.USART_StopBits = USART_StopBits_1;	//停止位,选择1位USART_InitStructure.USART_WordLength = USART_WordLength_8b;		//字长,选择8位USART_Init(USART1, &USART_InitStructure);		

4)如果你只需要发送的功能,就直接开启USART,初始化就完成了。如下所示:

USART_Cmd(USART1, ENABLE);

如果你需要接收的功能,可能还需要配置中断,那就在开启USART之前,再加上ITConfig和NVIC的代码就行了。如下所示:

    /*NVIC中断分组*/NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);			//配置NVIC为分组2/*NVIC配置*/NVIC_InitTypeDef NVIC_InitStructure;					//定义结构体变量NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn;		//选择配置NVIC的USART1线NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;			//指定NVIC线路使能NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;		//指定NVIC线路的抢占优先级为1NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;		//指定NVIC线路的响应优先级为1NVIC_Init(&NVIC_InitStructure);						

在上面进行好了USART相关初始化后,就需要编写串口函数了,在启动文件startup_stm32f10x_md.s中找到串口的名称,如下所示:

void USART1_IRQHandler(void)
{if (USART_GetITStatus(USART1, USART_IT_RXNE) == SET)		//判断是否是USART1的接收事件触发的中断{Serial_RxData = USART_ReceiveData(USART1);				//读取数据寄存器,存放在接收的数据变量Serial_RxFlag = 1;										//置接收标志位变量为1USART_ClearITPendingBit(USART1, USART_IT_RXNE);			//清除USART1的RXNE标志位//读取数据寄存器会自动清除此标志位//如果已经读取了数据寄存器,也可以不执行此代码}
}

我们就可以编写程序来测试下了。这里例举两个测试案例:

#include "Serial.h"uint8_t RxData;			//定义用于接收串口数据的变量int main(void)
{/*模块初始化*/OLED_Init();		//OLED初始化/*显示静态字符串*/OLED_ShowString(1, 1, "RxData:");/*串口初始化*/Serial_Init();		//串口初始化while (1){if (Serial_GetRxFlag() == 1)			//检查串口接收数据的标志位{RxData = Serial_GetRxData();		//获取串口接收的数据Serial_SendByte(RxData);			//串口将收到的数据回传回去,用于测试OLED_ShowHexNum(1, 8, RxData, 2);	//显示串口接收的数据}}
}

四. 效果展示

        在这里我们使用某一位b站博主自己做的串口助手,并对它设置好波特率为9600,数据位为8,停止位为1等参数,然后我们发送一个数23,如下所示:

 然后我们再来看下我们的OLED调试屏幕:

如上所示,屏幕上也显示出了所接收到数据23.

好了,到这里所有的内容差不多已经全部讲完,如果有任何疑问或者问题都可以在下面进行留言或者私信。 

         

 

 

 

        

        

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

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

相关文章

端点物联网学习资源合集

端点物联网 学习资源合集 导航 1. 物联网实战--入门篇 文章链接 简介:物联网是一个包罗万象的行业和方向,知识碎片严重,本系列文章通过 边学边用 的思想,逐步建立学习者的信心和兴趣,从而进行更深入透彻的学习和探索…

kaptcha依赖maven无法拉取的问题

老依赖了,就是无法拉取,也不知道为什么,就是用maven一直拉去不成功,还以为是魔法的原因,试了好久发现不是,只好在百度寻求帮助了,好在寻找到了这位大佬的文章Maven - 解决无法安装 Kaptcha 依赖…

信息安全工程师(57)网络安全漏洞扫描技术与应用

一、网络安全漏洞扫描技术概述 网络安全漏洞扫描技术是一种可以自动检测计算机系统和网络设备中存在的漏洞和弱点的技术。它通过使用特定的方法和工具,模拟攻击者的攻击方式,从而检测存在的漏洞和弱点。这种技术可以帮助组织及时发现并修补漏洞&#xff…

衡石分析平台系统分析人员手册-可视化报表仪表盘

仪表盘​ 仪表盘是数据分析最终展现形式,是数据分析的终极展现。 应用由一个或多个仪表盘展示,多个仪表盘之间有业务关联。 仪表盘编辑​ 图表列表​ 打开仪表盘后,就会看到该仪表盘中所有的图表。 调整图表布局​ 将鼠标移动到图表上拖动…

到底是微服务,还是SOA?

引言:大概正式工作有5年了,换了三个大厂【也是真特么世道艰难,中国互联网人才饱和了】。基本上每个公司有的架构都不太相同,干过TOC和TOB的业务,但是大家用的架构都不太相同。有坚持ALL in one的SB,最后服务…

2024项目管理软件,不融入敏捷开发怎么行?

一、项目管理软件的重要性 在当今快节奏的商业环境中,项目管理软件的重要性愈发凸显。随着市场竞争的不断加剧,企业面临着越来越多的挑战,项目的复杂性和不确定性也在不断增加。在这样的背景下,项目管理软件成为了团队高效规划、…

大模型涌现判定

什么是大模型? 大模型:是“规模足够大,训练足够充分,出现了涌现”的深度学习系统; 大模型技术的革命性:延申了人的器官的功能,带来了生产效率量级提升,展现了AGI的可行路径&#x…

◇【论文_20151120_20160405v3】Dueling Network 决斗〔Google DeepMind〕

整理代码:Dueling_DQN__Pendulum_v1.ipynb https://arxiv.org/abs/1511.06581 Dueling Network Architectures for Deep Reinforcement Learning 文章目录 摘要1. 引言1.1. 相关工作 2. 背景2.1. Deep Q-networks 【DQN】2.2. Double Deep Q-networks 【DDQN】2.3…

Linux基础项目开发day05:量产工具——页面系统

文章目录 一、数据结构抽象page_manager.h 二、页面管理器page_manager.c 三、单元测试1、main.page.c2、page_test.c3、Makefile修改3.1、unittest中的Makefile3.2、page中的Makefile 四、上机实验 前言 前面实现了显示、输入、文字、UI系统,现在我们就来实现页面的…

HCIP--1实验DNS,VLAN,静态路由,浮动静态,动态路由协议,Telnet

学习目标: 静态路由,浮动静态 VLAN,vlan间路由TelnetACL NAT OSPF/RIP 学习内容: 实验拓扑实验需求实验需求分析实验配置内容 (每一个设备的每一步操作)实验结果验证 1.实验拓扑 2.实验需求 1,学校内部…

Qt键盘按下事件和定时器事件及事件的接收和忽略

定时器事件 //设置多少毫秒调用一次 1s1000timerId this->startTimer(1000);timerId2 this->startTimer(500);void MyWidget::timerEvent(QTimerEvent* t) {static int sec 0;//通过判断当前ID来实现不同定时器的调用时间if(t->timerId() this->timerId){//隔一…

IDEA中的快捷键大全--超详细

目录 一、通用类型 1.1 图示 1.2 表格化 二、编写速度提升 2.1 图示 2.1.1 表格化 2.2 图示 2.2.1 表格化: 三、类结构,查找和查看源码 3.1 图示 3.2 表格化 四、查找,替换和关闭 4.1图示 4.2 表格化 五、调整格式 5.1 图示 5.2 表格化 六、快捷键的自主定义…

【C】数组(array)

数组(array) 数组的概念 数组是一组相同类型元素的集合 数组中存放的是1个或者多个数据,但是数组元素个数不能为0数组中存放的多个数据,类型是相同的 数组分为一维数组和多维数组,多维数组一般比较多见的是二维数组 一维数组的创建和初始…

递归神经网络解释(RNN)

Recurrent Neural Network (RNN) 如今,不同的机器学习技术用于处理不同类型的数据。最难处理和预测的数据类型之一是顺序数据。顺序数据与其他类型的数据不同,因为虽然可以假设典型数据集的所有特征都是与顺序无关的,但不能假设顺序数据集是无关的。为了处理这种类型的数据…

Kibana可视化Dashboard如何基于字段是否包含某关键词进行过滤

kinana是一个功能强大、可对Elasticsearch数据进行可视化的开源工具。 我们在dashboard创建可视化时,有时需要将某个index里数据的某个字段根据是否包含某些特定关键词进行过滤,这个时候就可以用到lens里的filter功能很方便地进行操作。 如上图所示&…

【笔记】【YOLOv10图像识别】自动识别图片、视频、摄像头、电脑桌面中的花朵学习踩坑

(一)启动 创建环境python3.9 打开此环境终端 (后面的语句操作几乎都在这个终端执行) 输入up主提供的语句:pip install -r requirements.txt 1.下载pytorch网络连接超时 pytorch网址: Start Locally | P…

centos系列图形化 VNC server配置,及VNC viewer连接,2024年亲测有效

centos系列图形化 VNC server配置,及VNC viewer连接 0.VNC服务介绍 VNC英文全称为Virtual Network Computing,可以位操作系统提供图形接口连接方式,简单的来说就是一款桌面共享应用,类似于qq的远程连接。该服务是基于C/S模型的。…

【STM32-HAL库】STM32F系列新建工程并点灯教程(小白向)

本帖是STM32HAL库系列新建工程系列合集 stm32-HAL库cubeMX新建工程教程(以F103C8T6为例)https://blog.csdn.net/qq_39150957/article/details/136637881?fromshareblogdetail&sharetypeblogdetail&sharerId136637881&sharereferPC&sha…

uniapp使用html2canvas时,页面内的image元素模糊

不废话很简单只需要将image改成img就行 改之前 改之后 原因可能是因为uniapp里面的image标签做了某种处理

[已解决]DockerTarBuilder永久解决镜像docker拉取异常问题

前阵子发现阿里云的docker加速镜像失效了(甚至连nginx都拉取不了),重新换了并且加多了网络上比较常用的dokcer加速源,可以解决一部分问题,但仍然有一些镜像的某个版本或一些比较冷的镜像就是拉取不了,原因未…