STM32-串口通信详解总结

article/2025/10/14 11:12:18

1. 串口通信方式

UART:universal asynchronous receiver and transmitter
通用异步收/发器,即串行异步全双工收发器。
USART: universal synchronous asynchronous receiver and transmitter
通用同步/异步收/发器,即串行异步/同步全双工收发器
说明:
(1) 串行通信和并行通信区别:

串行通信每次同时只能传输 1 个二进制位
并行通信数据各个位同时传输

(2)同步和异步的区别:

同步通信发送方和接收方按照同一个时钟节拍工作,所以需要时钟信号
异步通信发送方和接收方没有统一的时钟节拍,各自按照自己的节拍工作

(3) 单工、半双工、全双工的区别:

单工数据传输只支持数据在一个方向上传输
半双工允许数据在两个方向上传输。但是,在同一时刻,只允许数据在一个方向上传输
全双工允许数据同时在两个方向上传输

2.RS232 电平和 TTL 电平(都是全双工)

电平类型电压与逻辑电平关系
TTL(单片机电平)逻辑1:2.4V ~ 5V ; 逻辑0: 0V ~ 0.5V
RS232(如电脑)逻辑1:-15V ~ -3V; 逻辑0: 3V ~ 15V

在这里插入图片描述
注意:单片机要和PC通信时,需要电平转换芯片如CH340。

3.波特率

3.1 波特率:等同比特率,表示每秒钟传送的二进制位数,单位是比特每秒(bit/s)。
3.2 常见波特率:9600 、19200、115200

如串口的波特率为9600,表示1秒中可传输9600个bit;
其中,传输1个bit需要104us(计算1000ms/9600 = 104us)。

4.通信协议

4.1 串口传输的数据包格式

每个数据包包含1个起始位,5至9个数据位,可选的奇偶校验位和1或1.5或2个停止位:

起始位数据位数据位停止位
1bit5 ~ 8bit0 ~ 1 bit1 ~ 2bit
低电平(下降沿)先发送低位,再发送高位奇偶校验或无校验高电平

注意:
空闲状态:高电平,此时无数据传输

②奇偶校验:
奇校验:如果数据位中“1”的数目是偶数,则校验位为高电平1,
如果数据位中“1”的数目是奇数,则校验位为低电平0
偶校验:如果数据位中“1”的数目是奇数,则校验位为高电平1,
如果数据位中“1”的数目是偶数,则校验位为低电平0

停止位配置:表示传输的结束,并且提供计算机校正时钟同步的机会。
1个停止位:停止位位数的默认值。
2个停止位:可用于常规USART模式、单线模式以及调制解调器模式。
0.5个停止位:在智能卡模式下接收数据时使用。
1.5个停止位:在智能卡模式下发送和接收数据时使用。

④编程可配置的数据长度:8位或者9位(包含校验位),如9位是指8bit数据+1bit奇偶校验。

传输示例:
波特率115200,无校验,1个停止位,数据长度为8,传输数据0x55 0xAA 0x03,示波器波形如下:
在这里插入图片描述

4.2 STM32串口框图

在这里插入图片描述
说明:
如上框图所示,在接收移位寄存器、发送移位寄存器还有一个进入的箭头,分别连接到接收器控制、发送器控制。而这两者连接的又是接收器时钟、发送器时钟。也就是说,异步通信尽管没有时钟同步信号,但是在串口内部,是提供了时钟信号来进行控制的。接收器时钟和发送器时钟又被连接到同一个控制单元,也就是说它们共用一个波特率发生器。
读操作:数据从RX进入到接收移位寄存器,后进入到接收数据寄存器,最终供CPU或者DMA来进行读取;
写操作:数据从CPU或者DMA传递过来,进入发送数据寄存器,后进入发送移位寄存器,最终通过TX发送出去。

STM32与外部设备串口通信过程:
在这里插入图片描述

5.STM32 串口相关寄存器

参考《STM32F10x参考手册》

6.串口操作的一般步骤

代码示例:配置串口5
6.1 GPIO时钟使能,串口时钟使能。调用函数:RCC_APB2PeriphClockCmd()(可以参阅:【STM32】 STM32端口复用和重映射(AFIO辅助功能时钟) 的部分内容);

		RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE);		//使能afio时钟RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE);		//使能GPIOC时钟RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOD, ENABLE);RCC_APB1PeriphClockCmd(RCC_APB1Periph_UART5, ENABLE);		//使能串口5时钟

6.2 串口复位(这一步不是必须的)。调用函数:USART_DeInit();

		USART_DeInit(UART5);

6.3 GPIO外设功能下的端口模式设置。调用函数:GPIO_Init();

		GPIO_InitTypeDef GPIO_InitStructure;GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2;					//串口5输入脚上拉GPIO_InitStructure.GPIO_Speed = GPIO_Speed_10MHz;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;GPIO_Init(GPIOD, &GPIO_InitStructure);GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12;					//串口5输出脚配成多功能上下拉GPIO_InitStructure.GPIO_Speed = GPIO_Speed_10MHz;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;				//多功能推挽输出GPIO_Init(GPIOC, &GPIO_InitStructure);

6.4 串口参数初始化。调用函数:USART_Init();

		USART_InitTypeDef USART_InitStructure;USART_InitStructure.USART_BaudRate = p_baudrate;			//初始化串口参数USART_InitStructure.USART_WordLength = USART_WordLength_8b; //数据位USART_InitStructure.USART_StopBits = USART_StopBits_1;      //停止位USART_InitStructure.USART_Parity = USART_Parity_No;         //校验位USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;USART_Init(UART5, &USART_InitStructure);					//初始化串口

6.5 开启中断并且初始化NVIC(如果需要开启中断才需要这个步骤)。调用函数:NVIC_Init();USART_ITConfig();

 		NVIC_InitTypeDef NVIC_InitStructure; /* 嵌套向量中断控制器组选择 */NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);/* 配置 USART 为中断源 */NVIC_InitStructure.NVIC_IRQChannel = UART5_IRQn;///* 抢断优先级为 1 */NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;/* 子优先级为 1 */NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;/* 使能中断 */NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;/* 初始化配置 NVIC */NVIC_Init(&NVIC_InitStructure);USART_ITConfig(UART5, USART_IT_RXNE, ENABLE);USART_ITConfig(UART5, USART_IT_TXE, ENABLE);

6.6 使能串口。调用函数:USART_Cmd();

		USART_Cmd(UART5, ENABLE);

6.7 编写中断处理函数。调用函数:USARTx_IRQHandler();

void UART5_IRQHandler(void)
{if(USART_GetITStatus(UART5, USART_IT_RXNE) != RESET){uart5_recv_int_handle();}if(USART_GetITStatus(UART5, USART_IT_TXE) != RESET){uart5_send_int_handle();}
}

6.8 串口数据收发。调用函数:USART_SendData();USART_ReceiveData();

void uart5_recv_int_handle(void)
{U8 m_data;m_data = USART_ReceiveData(UART5);……//处理数据
}
void uart5_send_int_handle(void)
{U8 m_data;if(需要发送数据){USART_SendData(UART5, m_data);}else{USART_ITConfig(UART5, USART_IT_TXE, DISABLE);						//关闭发送中断}……//处理数据
}

注:如有问题,欢迎大家指出,谢谢!


http://chatgpt.dhexx.cn/article/d8QN1pVP.shtml

相关文章

(十三)STM32——串口通信(UART)

目录 学习目标 内容 通信方法 并行通信 串行通信 通信方向 通信方式 UART 特点 串口参数 通信流程 寄存器 USART_SR USART_DR USART_BRR 过程 代码 运行结果 运行结果 遇到的问题 总结 学习目标 本节我们要学习的的是STM32的通信部分,主要介绍…

STM32—串口通讯详解

串口通讯目录 物理层协议层USART简介开发板与上位机的连接代码讲解:一.初始化结构体二.NVIC配置中断优先级三.USART配置函数讲解四.传输数据的函数:1.发送一个字节2.发送字符串3.重定向printf函数发送字符串4.重定向getchar函数接收字符5.通过中断接收 结…

stm32实现串口通信和LED灯点亮

stm32串口通信 串口协议和RS—232标准RS232电平与TTL电平的区别USB/TTL转RS232 CH340串口安装安装stm32cubemx并编写程序实现led灯的周期闪烁 用stm32完成USART串口通信接下来进行波形观察总结 两个工程完整代码 串口协议和RS—232标准 串口通信协议:是指规定了数据…

iconCls和el-icon属性对应的图标大全(带图)

千言万语,不如直接上图效果好 element UI el-icon 直接看官网都有,很全 https://element.eleme.io/#/zh-CN/component/icon

ext 中的iconCls配置以及使用以及路径问题

使用过Ext(http://www.extjs.com)的同志都应该知道,每一个组件(Component)在初始化的时候,都会有一个配置参数(Config){在Ext2中,基本上所有的组件的构造函数只接受一个参…

EXT iconCls说明

今天学习ext 看examples中的事例,其中有一个地方是这样写的: new ButtonPanel( Icon Only, [{ iconCls: add16 },{ iconCls: add24, scale: medium },{ …

cls extjs5_73. 解决ExtJS TreePanel 的 iconCls设置问题

转自:https://blog.csdn.net/hanchuang213/article/details/62881568 很久没有写代码了,最近在做一个在线帮助网站,于是又捡起了 ExtJS,我用 TreePanel 做为左边栏的导航树,我希望能够根据节点指向的内容来定义节点的图…

常规功能和模块自定义系统 (cfcmms)—025开发日志(创建iconCls的field)

常规功能和模块自定义系统 (cfcmms)—025开发日志(创建iconCls的field) 这一节是临时插入的工作日志。 在本系统中可以自定义某些图标,图标的样式都是手工录入的,为了能直观的选择iconCls中的图标,开发了此控件。extjs中内置了font-awesome字…

UniGui中使用IconCls

在使用UniGui的时候,我时候我们需要使用系统自己的图标,通常会如下图一样的使用方式: 选择ICON对齐方式及系统定义好的ICON对应值。但实际上UniGui中可以使用的图标远远大于他已定义的这十几个(或者应该说是EXJS原本就多&#xff…

UniGui iconCls字符图标的引用

游览unigui官方论坛,发现了iconCls字符图标的引用功能,测试了一下,很好用。 引用格式:iconCls: {fontCls} {iconPrefix}-{iconName} 例子:iconCls: x-fa fa-home

Easyui-iconCls 的队应图标

(iconCls : ‘icon-cancel’,)(iconCls : ‘icon-add,)(iconCls : ‘icon-edit,) (iconCls : ‘icon-remove,)(iconCls : ‘icon-save,)(iconCls : ‘icon-cut,) (iconCls : ‘icon-ok,)(iconCls : ‘icon-no,)(iconCls : ‘icon-reload,) (iconCls : ‘icon-search,)(iconC…

easyui iconCls属性值

easyui iconCls属性值 icon-add icon-print icon-mini-add icon-cvs icon-play icon-refresh icon-edit icon-help icon-mini-edit icon-pencil icon-remove icon-undo icon-mini-refresh icon-save icon-redo icon-cut icon-back icon-ok icon-sum icon-no icon-tip ico…

拓展07-EasyUI自定义iconCls菜单图标icon

1、效果图 左侧菜单树,和选项卡tabs显示自定义图标。 先推荐一个icon图标下载的网站:https://www.easyicon.net/ 2、iconCls属性 3、准备图标icon 可以从上面推荐的网址下载,基本上各种类型都有 将下载好的图标放入easyui图标文件夹内web…

EXTJs 中icon 与iconCls的区别及用法!

1、这俩个都是引入小图片 区别在于: (1)、icon :"直接写图片在项目上的路径" (2)、iconCls:"css样式名称" icon 显示时为下面的添加: iconCls 显示为下面的添加: 大家都看到区别了吧! 2、iconCls代码&…

分类算法之二——特征提取与特征选择

典型应用——文本分类 1)文本信息的表示,从原始的文本转化为结构化的可处理信息; 2)目前常采用向量空间模型来描述文本向量,通常文本向量维度较高,使得分类效率低下; 3)必须对特…

机器学习5种特征选择的方法!

我们知道模型的性能会随着使用特征数量的增加而增加。但是,当超过峰值时,模型性能将会下降。这就是为什么我们只需要选择能够有效预测的特征的原因。 特征选择类似于降维技术,其目的是减少特征的数量,但是从根本上说,它…

特征选择算法分类

坊间常说:“数据和特征决定了机器学习的上限,而模型和算法只是逼近这个上限而已”。由此可见,特征工程在机器学习中占有相当重要的地位。在实际应用当中,可以说特征工程是机器学习成功的关键。 首先,从特征开始说起&am…

特征选择基本思想与relieff算法

特征选择 如果特征参数不足,则很容易引发数据重叠的现象,所有分类器都将不起作用;如果特征参数太多,则可能会消耗大量时间和计算资源。特征选择可以通过消除冗余的特征来提高分类算法的准确性,并减少其计算复杂度。特…