STM32 USART—串口通信

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

目录

一、串口通信协议物理层电平标准:

1.RS232标准:

2.USB转串口通讯(常用)

3.原生的串口到串口

二、串口通信协议软件层:

三、串口功能框图

1.引脚

2.数据寄存器USART_DR

3.字符帧组成介绍

4.发送与接收数据

5.串口的通信速率

四、代码讲解

1.USART初始化结构体:

2.同步时钟初始化结构体:

3.编程时常用到的固件库函数:

五、程序实验

一、串口通信协议物理层电平标准:

1.RS232标准:

RS-232 标准主要规定了信号的用途、通讯接口以及信号的电平标准。

设备A、B两者的电平不同,要把两者的TTL电平都转换为RS-232标准的电平。

1、RS232标准串口主要用于工业设备直接通信

2、电平转换芯片一般有MAX3232, SP3232

2.USB转串口通讯(常用)

结构图:

1、USB转串口主要用于设备跟电脑通信

2、电平转换芯片一般有CH340、PL2303,CP2102,FT232

3、使用的时候电脑端需要安装电平转换芯片的驱动

3.原生的串口到串口

1、原生的串口通信主要是控制器跟串口的设备或者传感器通信,不需要经过电平转换芯片来转换电平,直接就用TTL电平通信。

2、GPS模块、GSM模块、串口转WIFI模块、HC04蓝牙模块。

二、串口通信协议软件层:

 

起始位:由1个逻辑0的数据位表示。

结束位:由0.5、1、1.5或2个逻辑1的数据位表示。

有效数据:在起始位后紧接着的就是有效数据,有效数据的长度常被约定为5、6、7或8位长。

 校验位:可选,为的是数据的抗干扰性。

校验方法分为:奇校验(odd)、偶校验(even)、0校验(space)、1校验(mark)、无校验(noparity)。

奇校验要求有效数据和校验位中“1”的个数为奇数,比如一个8位长的有效数据为:01101001,此时总共有4个“1”,为达到奇校验效果,校验位为“1”,最后传输的数据将是8位的有效数据加上1位的校验位总共9位。偶校验与奇校验要求刚好相反,要求帧数据和校验位中“1”的个数为偶数,比如数据帧:11001010,此时数据帧“1”的个数为4个,所以偶校验位为“0”。0校验是不管有效数据中的内容是什么,校验位总为“0”,1校验是校验位总为“1”。

通常配置无校验位,数据位8,停止位1.

三、串口功能框图

1:引脚 2:数据寄存器 3:控制器 4:波特率

1.引脚

功能引脚 TX:发送数据输出引脚。 RX:接收数据输入引脚。

nRTS:请求以发送 (Request To Send),n 表示低电平有效。如果使能 RTS 流控制,当 USART 接 收器准备好接收新数据时就会将 nRTS 变成低电平;当接收寄存器已满时,nRTS 将被设置为高 电平。该引脚只适用于硬件流控制。

nCTS:清除以发送 (Clear To Send),n 表示低电平有效。如果使能 CTS 流控制,发送器在发送下 一帧数据之前会检测 nCTS 引脚,如果为低电平,表示可以发送数据,如果为高电平则在发送完 当前数据帧之后停止发送。该引脚只适用于硬件流控制。

SCLK:发送器时钟输出引脚。这个引脚仅适用于同步模式。

后面3个都不常用

  

2.数据寄存器USART_DR

9-31位:保留为0,0-8位:包含了发送或接收的数据。由于它是由两个寄存器组成的,一个给发送用(TDR),一个给接收用(RDR),该寄存器兼具读和写的功能

当使能校验位(USART_CR1中PCE位被置位)进行发送时,写到MSB(最高有效位)的值(根据数据的长度不同,MSB是第7位或者第8位)会被后来的校验位取代。当使能校验位进行接收时,读到的MSB位是接收到的校验位。

3.字符帧组成介绍

 

一个字符帧发送需要三个部分:起始位+数据帧+停止位。起始位是一个位周期的低电平,位周期就是每一位占用的时间;数据帧就是我们要发送的8位或9位数据,数据是从最低位开始传输的;停止位是一定时间周期的高电平。

第9位数据是否有效要取决于USART控制寄存器1(USART_CR1) 的M位设置,当M位为0时表示8位数据字长,当M位为1表示9位数据字长,我们一般使用8数据字长。

停止位时间长短是可以通过USART控制寄存器2(USART_CR2)的 STOP[1:0]位控制,可选0.5个、1个、1.5个和2个停止位。默认使用 1停止位。2个停止位适用于正常USART模式、单线模式和调制解调器模式。0.5个和1.5个停止位用于智能卡模式。

将USART_CR1寄存器的PCE位置1就可以启动奇偶校验控制,PS位进行校验选择。接收数据时如果出现奇偶校验位验证失败,会见 USART_SR寄存器的PE位置1,并可以产生奇偶校验中断。

4.发送与接收数据

发送:将USART_CR1寄存器的UE、TE、RE位都要置1(3个使能)。

USART_SR : TXE置1,表示要发送的数据已经全部从发送数据寄存器(TDR)转移到了发送移位寄存器。

USART_CR1 : USART_SR的TXE位置1后,CR1的TXEIE位置1,产生USART中断。

USART_SR : TC置1,表示数据已经通过TX引脚成功发送。

USART_CR1: 当USART_SR中的TC为’1’时,CR1的TCIE位置1,产生USART中断。

接受:USART_SR RXNE置1,数据已接受完成

USART CR1:RXNEIE

5.串口的通信速率

串口通信里面,波特率是等于比特率的。USART_BRR:波特率寄存器

Tx / Rx 波特率 = Fck/16* ( USARTDIV )

这里的Fck是给外设的时钟(PCLK1用于USART2、3、4、5 36M,PCLK2用于USART1 72M)

USARTDIV是一个无符号的定点数。这12位的值设置在USART_BRR寄存器。

四、代码讲解

1.USART初始化结构体:

波特率:115200/9600

字长:0(8位)

模式选择:接收还是发送

2.同步时钟初始化结构体:

同步模式,我们经常用不到。

3.编程时常用到的固件库函数:

1-串口初始化函数

Void USART_Init (USART_TypeDef* USARTx, USART_InitTypeDef* USART_InitStruct)

2-中断配置函数

Void USART_ITConfig(USART_TypeDef* USARTx, uint16_t USART_IT,FunctionalState NewState)

3-串口使能函数

void USART_Cmd(USART_TypeDef* USARTx, FunctionalState NewState)

4-数据发送函数

void USART_SendData (USART_TypeDef*USARTx,uint16_t Data)

5-数据接收函数

uint16_t USART_ReceiveData(USART_TypeDef*USARTx)

6-中断状态位获取函数     

ITStatus USART GetITStatus (USART_TypeDef*USARTx,uint16_t USART_IT)

五、程序实验

【1】单片机给电脑发送数据,电脑上位机把数据打印出来;电脑上位机给单片机发数据,单片机接收到数据之后立马发回给电脑,并打印出来(注意这是两个要求)。

 编程要点:

  单片机接收数据选择中断接收

1-初始化串口需要用到的GPIO(跟之前讲的一样)

2-初始化串口,配置串口的初始化结构体USART_InitTypeDef

3-中断配置(接收中断,中断优先级)

  接收数据我们采用中断的形式,首先配置串口中断优先级,注意这个函数也要复制到该c文件下;然后使能串口接收中断;

	//串口中断优先级配置NVIC_Configuration();//使能串口接收中断USART_ITConfig(DEBUG_USARTx, USART_IT_RXNE, ENABLE);	

最后别忘了写中断服务函数:接收数据

// 串口中断服务函数
void DEBUG_USART_IRQHandler(void)
{uint8_t ucTemp;if(USART_GetITStatus(DEBUG_USARTx,USART_IT_RXNE)!=RESET){		ucTemp = USART_ReceiveData(DEBUG_USARTx);USART_SendData(DEBUG_USARTx,ucTemp);    }	 
}

这样就可以向单片机发送数据并返回到接收区。但是,如果我们发送的数据较多(比如发送“好好学习天天向上”,8个字符就要产生8次中断,这对于单片机CPU负荷很大,所以我们可以先把发送的数据放在一个缓冲区,等电脑端不发送了,全部缓存好了一起给单片机发送过去。这就是“队列机制”,这个应用十分广泛)。

4-使能串口 USART_Cmd()函数

5-编写发送和接收函数(应用官网写好的发送字符、字符串函数,除此之外,还可以用printf函数来发送数据)

对 printf函数发送数据的解释(较为重要):

我们不能直接调用printf函数来对串口进行发送数据,printf 函数里面会调用 fputc 这个函数(这个函数是真正发送数据的函数);而通过串口把数据发送到电脑的上位机是用 USART_SendData这个函数,所以需要在fputc这个函数里面调用USART_SendData这个函数。因此,我们都写了两个函数放在 bsp_uart.c 文件下:重定向c库函数printf到串口,重定向后可使用printf函数(发送数据);重定向c库函数scanf到串口,重写向后可使用scanf、getchar等函数(接收数据)

///重定向c库函数printf到串口,重定向后可使用printf函数
int fputc(int ch, FILE *f)//发送数据
{/* 发送一个字节数据到串口 */USART_SendData(DEBUG_USARTx, (uint8_t) ch);/* 等待发送完毕 */while (USART_GetFlagStatus(DEBUG_USARTx, USART_FLAG_TXE) == RESET);		return (ch);
}///重定向c库函数scanf到串口,重写向后可使用scanf、getchar等函数
int fgetc(FILE *f)//接收数据
{/* 等待串口输入数据 */while (USART_GetFlagStatus(DEBUG_USARTx, USART_FLAG_RXNE) == RESET);return (int)USART_ReceiveData(DEBUG_USARTx);
}

6-编写中断服务函数

拓展:如果换成串口2的话,软件部分只更改.h文件里的宏定义即可;硬件注意接线连接正确。

【2】电脑给单片机发命令,用于控制开发板上的灯。

int main(void)
{/*在程序来到main函数这里的时候,系统时钟已经配置成72M*/uint8_t temp;DEBUG_UART_Config();LED_GPIO_Config();//初始化相关的GPIO//USART_SendData(DEBUG_USARTx,'a');//Usart_SendString(DEBUG_USARTx,"你好");printf("你好\n");/*对 printf函数发送数据的解释我们不能直接调用printf函数来对串口进行发送数据,printf 函数里面会调用 fputc 这个函数(这个函数是真正发送数据的函数),而通过串口把数据发送到电脑的上位机是用 USART_SendData这个函数,所以需要在 fputc 这个函数里面调用 USART_SendData 这个函数。因此,我们都写了两个函数放在 bsp_uart.c 文件下:重定向c库函数printf到串口,重定向后可使用printf函数(发送数据)重定向c库函数scanf到串口,重写向后可使用scanf、getchar等函数(接收数据)
*/while(1){temp = getchar();//gatchar()函数只能接收一个字符
/*      getchar 会调用int fgetc(FILE *f)函数,那个函数里面在一直循环判断时候接收完毕这与中断产生冲突,所以我们取消用中断来接收数据,在while循环里面接收数据
*/printf("接收到的字符为:%c",temp);switch(temp){case '1': LED1_ON;LED2_OFF; break;case '2': LED2_ON;LED1_OFF; break;default : LED1_OFF;LED2_OFF;break;}}
}

getchar 会调用int fgetc(FILE *f)函数,那个函数里面在一直循环判断时候接收完毕,这与中断产生冲突,所以我们取消用中断来接收数据,在while循环里面接收数据。用switch语句来判断接收到的数据,来执行对灯的指令。


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

相关文章

STM32 —— STM32 的串口通信

STM32 —— STM32 的串口通信 STM32的串口通信接口有两种,分别是:UART(通用异步收发器)、USART(通用同步异步收发器)。而对于大容量 STM32F10x 系列芯片,分别有 3 个 USART 和 2 个 UART 串口通信过程: 目前还处于入门阶段&#x…

STM32——串口通信

首先声明,本文是在查阅资料之后进行的一些内容总结,仅用于个人学习记录。 一、串口通信基本原理 按照数据传送方向分类 1、单工:数据传输只支持数据在一个方向上传输 2、半双工:允许数据在两个方向上传输。但是,在…

STM32 - 串口(USART)通信详解

STM32 - 串口(USART)通信 文章目录 STM32 - 串口(USART)通信1、STM32 串口简介2、串口的工作方式3、串口通信协议3.1: 物理层3.1.1: TTL、RS-232 标准3.1.2:USB 转串口(划重点&#…

STM32-串口通信详解总结

1. 串口通信方式 UART:universal asynchronous receiver and transmitter 通用异步收/发器,即串行异步全双工收发器。 USART: universal synchronous asynchronous receiver and transmitter 通用同步/异步收/发器,即串行异步/同步全双工收发…

(十三)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代码&…