STM32-串口通信(串口的接收和发送)

article/2025/10/16 17:49:44

文章目录

  • STM32的串口通信
  • 一、STM32里的串口通信
  • 二、串口的发送和接收
    • 串口发送
    • 串口接收
  • 三、串口在STM32中的配置
  • 四、串口接收的两种实现方式
    • 1. 需要更改的地方
    • 2. 查询RXNE标志位
    • 3. 使用中断
  • 总结


STM32的串口通信

本文在于记录自己的学习过程中遇到的问题和总结,各种情况下串口通信在STM32的实际使用方面占有很大的比重,本文主要对串口通信做一个简要的总结。


一、STM32里的串口通信

在STM32里,串口通信是USART,STM32可以通过串口和其他设备进行传输并行数据,是全双工异步时钟控制,设备之间是点对点的传输。对应的STM32引脚分别是RX和TX端。STM32的串口资源有USART1、USART2、USART3.

串口的几个重要的参数:

  • 波特率,串口通信的速率
  • 空闲,一般为高电平
  • 起始位,标志一个数据帧的开始,固定为低电平。当数据开始发送时,产生一个下降沿。(空闲–>起始位)
  • 数据位,发送数据帧,1为高电平,0为低电平。低位先行。
    比如 发送数据帧0x0F 在数据帧里就是低位线性 即 1111 0000
  • 校验位,用于数据验证,根据数据位的计算得来。有奇校验,偶校验和无校验。
  • 停止位,用于数据的间隔,固定为高电平。数据帧发送完成后,产生一个上升沿。(数据传输–>停止位)

下方就是一个字节数据的传输过程,从图中可以看出,串口发送的数据一般都是以数据帧的形式进行传输,每个数据帧都由起始位,数据位,停止位组成, 且停止位可变。
在这里插入图片描述


二、串口的发送和接收

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

当配置好USART的电路之后,直接读取数据寄存器,就可以自动发送数据和接收数据了。在发送和接收的模块有4个重要的寄存器

  • 发送数据寄存器TDR
  • 发送移位寄存器,把一个字节的数据一位一位的移出去
  • 接收数据寄存器RDR
  • 接收移位寄存器,把一个字节的数据

下方为串口的发送和接收图解:

在这里插入图片描述


串口发送

在配置串口的各个参数时,可以选择发送数据帧的数据位的大小,可选8位或9位。

串口发送数据实际上就是对发送数据寄存器TDR进行写操作

1. 当串口发送数据时,会检测发送移位寄存器是不是有数据正在移位,如果没有移位,那么这个数据就会立刻转移到发送移位寄存器里。准备发送。

2. 当数据移动到移位寄存器时,会产生一个TXE发送寄存器空标志位,该位描述如下。当TXE被置1,那么就可以在TDR写入下一个数据了。即发送下一个数据。

在这里插入图片描述

3. 发送移位寄存器在发送器控制的控制下,向右移位,一位一位的把数据传输到TX引脚。
在这里插入图片描述

4. 数据移位完成后,新的数据就会再次从TDR转移到发送移位寄存器里来,依次重复1-3的过程。通过读取TXE标志位来判断是否发送下一个数据。


串口接收

  1. 数据从RX引脚通向接收移位寄存器,在接收控制的控制下,一位一位的读取RX的电平,把第一位放在最高位,然后右移,移位八次之后就可以接收一个字节了。
  2. 当一个字节数据移位完成之后,这一个字节的数据就会整体的移到接收数据寄存器RDR里来。
  3. 在转移时会置RXNE接收标志位,即RDR寄存器非空,下方为该位的描述。当被置1后,就说明数据可以被读出
    在这里插入图片描述
    下图即为串口接收的工作流程

在这里插入图片描述


三、串口在STM32中的配置

首先要明确几点:使用STM32串口外设中的哪一个?串口发送或者接收数据?串口相关的参数配置?发送或接收是否使用到中断?

下方为串口发送的配置。

1. RCC开启USART、串口TX/RX所对应的GPIO口

RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2,ENABLE);  //开启USART2的时钟
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);   //开启GPIOA的时钟

2. 初始化GPIO口
这里注意哈,根据自己的需求来配置GPIO口,发送和接收是都需要还是只需要其中一个。然后对应的根据引脚定义表来初始化对应的GPIO口。

USART2对应的引脚
在这里插入图片描述

USART1对应的引脚
在这里插入图片描述

这里根据手册来看,RX引脚模式配置成浮空输入或者上拉输入。TX引脚模式配置成复用推挽输出。

**比如我这里只初始化TX发送端**
//TX端GPIO_InitTypeDef GPIO_InitStructure;GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AF_PP;  //复用推挽输出GPIO_InitStructure.GPIO_Pin=GPIO_Pin_2;   //USART2对应的TX端为GPIOA2GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;  //50MhZGPIO_Init(GPIOA,&GPIO_InitStructure);

3. 串口初始化
注意哈,USART_Init()这个函数,是用来配置串口的相关参数的。

  • USART_BaudRate 串口通信使用的波特率 一般是9600或者是115200,这里我们给9600
  • USART_HardwareFlowControl 是否选择硬件流触发,一般这个我们也不选,所以选择无硬件流触发。
  • USART_Mode 这个参数要注意了哈,串口的模式,发送模式还是接收模式,还是两者都有
  • USART_Parity 校验位,可以选择奇偶校验和不校验。没有需求就直接无校验
  • USART_StopBits 停止位 有1、0.5、2位,我们这里选1位停止位
  • USART_WordLength 数据位 有8位和9位可以选择
 //串口初始化USART_InitTypeDef USART_InitStruct;USART_StructInit(&USART_InitStruct);  //初始默认值USART_InitStruct.USART_BaudRate=9600;USART_InitStruct.USART_HardwareFlowControl=USART_HardwareFlowControl_None;   //不使用硬件流触发USART_InitStruct.USART_Mode=USART_Mode_Tx;   			//TX 发送模式USART_InitStruct.USART_Parity=USART_Parity_No;   		//不选择校验USART_InitStruct.USART_StopBits=USART_StopBits_1;  		//停止位1位USART_InitStruct.USART_WordLength=USART_WordLength_8b;	//数据位8位USART_Init(USART2,&USART_InitStruct);

4. 串口使能

//串口使能USART_Cmd(USART2,ENABLE);

5. 串口发送数据
注意哈,我们要判断TXE标志位的状态。0,数据还没有被转移到移位寄存器;1,数据已经被转移到移位寄存器。当TXE标志位为1时,就说明可以发送下一个数据了。详细过程可看上面串口发送的解释。

void Serial_SendByte(uint16_t Byte)
{USART_SendData(USART2,Byte);//0 表示数据还未转移到移位寄存器 循环等待 1 数据已经被转移到了移位寄存器可以发送数据while(USART_GetFlagStatus(USART2,USART_FLAG_TXE)==RESET);  //不需要手动清零 再次写入TDR时会自动清零	
}

经过上述五步的配置,单片机就可以通过串口发送数据了。

下方为发送数据图例,STM32向串口发送0x16数据
在这里插入图片描述


四、串口接收的两种实现方式

上方是发送数据的例子,那么串口接收又该如何配置,又要在串口发送的例子上做哪些更改呢?

这里我们可以通过查询或者中断的方式来进行接收数据的两种方式。

  • 查询方式就是通过不断的查询RXNE标志位,通过判断RXNE位的状态来确定数据是否接收。
  • 中断方式就是通过配置接收输出控制通道,配置NVIC,在中断服务子函数里进行数据的接收。

1. 需要更改的地方

既然我们要实现串口的接收,那么就要配置串口RX引脚,在串口模式中添加USART_Mode_RX模式。

  • 初始化RX引脚
//RX端GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IPU;  //上拉输入GPIO_InitStructure.GPIO_Pin=GPIO_Pin_3;GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;  //50MhZGPIO_Init(GPIOA,&GPIO_InitStructure);
  • 添加串口模式
USART_InitStruct.USART_Mode=USART_Mode_Tx|USART_Mode_Rx;   			//TX 发送模式  RX 接收模式

2. 查询RXNE标志位

这里我们还是来看一看RXNE标志位的描述

在这里插入图片描述
上图描述,为0时数据没有收到,为1时收到了数据,数据可以从RDR里读出

所以在主程序里不断读取RXNE标志位,如果为1,表示数据可以读出

uint8_t RX_Data;
int main()
{ Serial_Init();Serial_SendByte(0x16);while(1){if(USART_GetFlagStatus(USART2,USART_FLAG_RXNE)==SET)   //0 循环等待 1 可以接收数据{RX_Data=USART_ReceiveData(USART2);           Serial_SendByte(RX_Data);}}
}

下图为程序现象:pc向单片机发送数据0x15,单片机接收数据0x15,并且把接收到的数据作为数据发送到pc,在pc上显示0x15。
在这里插入图片描述

3. 使用中断

  • 通过配置串口的接收作为中断源,开启中断输出控制,配置NVIC。开启中断通道。
//开启中断输出控制USART_ITConfig(USART2,USART_IT_RXNE,ENABLE);//配置NVICNVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); NVIC_InitTypeDef NVIC_InitStruct;NVIC_InitStruct.NVIC_IRQChannel=USART2_IRQn;   //选择USART2的中断通道NVIC_InitStruct.NVIC_IRQChannelCmd=ENABLE;		//中断使能NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority=1;NVIC_InitStruct.NVIC_IRQChannelSubPriority=1;NVIC_Init(&NVIC_InitStruct);
  • 中断服务子函数
    中断服务子函数写好后,就可以在中断里读取接收到的数据了。
    当接收到数据后,触发接收中断,主程序暂停执行。接收完数据后主程序回复执行。当接收到数据时,就触发中断。
void USART2_IRQHandler(void)
{if(USART_GetITStatus(USART2,USART_IT_RXNE)==SET)   //RXNE 标志位为1 表示可以接收数据{RX_Data=USART_ReceiveData(USART2);Flag=1;USART_ClearITPendingBit(USART2,USART_IT_RXNE);  //清除RXNE标志位}
}
  • 主程序测试
uint8_t RX_Data;
uint8_t Flag;int main()
{Serial_Init();Serial_SendByte(0x16);while(1){if(Flag==1){Serial_SendByte(RX_Data);}}
}void USART2_IRQHandler(void)
{if(USART_GetITStatus(USART2,USART_IT_RXNE)==SET)   //RXNE 标志位为1 表示可以接收数据{RX_Data=USART_ReceiveData(USART2);Flag=1;USART_ClearITPendingBit(USART2,USART_IT_RXNE);  //清除RXNE标志位}
}

下图为程序现象:可以看到,串口确实收到了数据,只是我把接收到的数据0xFE放在了while循环里,这说明数据接收是成功的,使用中断是可行的。
在这里插入图片描述


总结

到这里,就大致总结了串口的发送和接收。

串口的配置,使用查询或者中断来接收数据。

串口的使用会很常用到,所以在这里对串口做一个总结,也算是对之前知识的一个回顾和总结,加强印象。

如果有什么写的不对的地方,欢迎指正!

加油加油!

听不懂就多看两遍,认真听,慢慢琢磨,多看几遍,一定可以学会!


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

相关文章

STM32串口通信详解

✅作者简介:嵌入式入坑者,与大家一起加油,希望文章能够帮助各位!!!! 📃个人主页:rivencode的个人主页 🔥系列专栏:玩转STM32 💬保持学…

MacOS 安装 Matlab R2021b 手记

MacOS 安装 Matlab R2021b Maci64手记 1.下载MATLAB R2021b 安装包 2.双击MatlabR2021b_Mac64.dmg打开安装包,双击InstallForMacOSX.app开始安装程序 3.出现「install_unix想要进行更改」,出入开机密码,点击好 4.出现安装界面,点击「高级选项」,选择「我有文件安装密…

linux安装matlabRuntime

1.找到自己需要的文件夹,下载压缩包,版本自己发挥 wget https://ssd.mathworks.com/supportfiles/downloads/R2021a/Release/6/deployment_files/installer/complete/glnxa64/MATLAB_Runtime_R2021a_Update_6_glnxa64.zip 2.解压 unzip MATLAB_Runtim…

四步离线安装matlab工具包

四步离线安装matlab工具包 把刚才的压缩包解压在matlab 工具包的文件夹。(其实哪里都行,防止误删) 我的是matlab安装目录下面 打开Matlab --“主页” --“设置路径” 3. 添加文件夹-选择工具包文件夹 4. 点击切换路径按钮到工具包目录&am…

安装Matlab R2022a/64位

Matlab R2022a/64位下载地址: 链接:https://pan.baidu.com/s/1pb_523QrMvu–nOcmV1bqQ 提取码:lbcc 上面失效的看看这个 链接:https://pan.baidu.com/s/14cVeXQOLBqGfq3aKT45vPw 提取码:piq7 怎么快速下可以私信我。…

如何安装matlab?官网下载详细教程

MATLAB下载和安装教程(官网下载) 很多人在遇到专业数据处理时都得用到专业的数学软件,matlab就是这样一款对于数据处理非常有帮助的支持数据分析、算法开发和建模的专业工科数学软件。那么,怎么可以快速的正确安装?下…

【首发】 ubuntu20.04安装matlab2021b/matlab2020b

文章目录 一、下载地址1.1 2021b下载链接(BT)1.2 2021a下载链接1.3 2020b CSDN下载链接 二、MATLAB2021b安装方法2.1 Mount .iso文件2.2 通过./install 启动安装程序2.3 输入正版Key安装2.4 直接下一步2.5 选安装文件夹(权限够)2.6 选需要的包2.7 选link…

服务器远程安装Matlab2015

因为在windows上跑matlab实验,出现内存不足的情况,因此,希望能在服务器上安装一个matlab。然后出现各种问题,花了一天时间才装好,特此记录下。因为对于没装过的童靴来说,每一个步骤都很关键,因此…

从零开始在linux服务器设置matlab-1.安装matlab

目录 0.安装matlab (1)安装x11客户端 1.下载ssh工具 MobaXterm 2.创建ssh连接 3.配置服务器x11转发 (1)安装matlab 1.上传安装包 2.挂载iso 3.安装 4.弹出gui,按照gui的指引操作 到此安装完成 0.安装matlab 安装matlab时因为需要gui 而linux服务器默认没有所以…

Ubuntu18.04安装Matlab2019b

1.下载Matalab2019b 链接: https://pan.baidu.com/s/1yEOnDnm0XqqyY2-jkPOQZQ 提取码: qwer 2.创建挂载文件目录 // 在任意目录下创建挂载文件目录(我是在temp目录) sudo mkdir matlab3.挂载镜像 sudo mount -o loop [镜像文件的路径] [指定的…

Ubuntu安装matlab2018a

一. 安装文件 链接: https://pan.baidu.com/s/1H2JWXVZjoNOkLhhpVj8gzg 提取码: rb21 文件目录: 二. 安装步骤 1. 解压Matlab2018aLinux64Crack.tar.gz文件: $ tar -xzvf Matlab2018aLinux64Crack.tar.gz 解压后的文件目录: 2. 建立挂…

如何安装matlab2016b

如何安装matlab2016b,详细步骤教程 首先下载软件R2016b_win64.iso,然后解压,或者挂载到光驱中,点击setup.exe运行。如果出现错误,cannot find appropriate setup file表示解压或者挂载出错了。重新解压或者挂载一下。 license选择…

Ubuntu20.04安装matlab详细教程

这里安装的是MATLAB2015b版本,其他版本也可参照这个安装步骤! 1. matlab2015b版本安装文件下载链接 链接: https://pan.baidu.com/s/1Xr1TFSrqDZAbhvyEff28rQ 密码: ojj0 2. MATLAB2015安装过程详解 下载的文件夹应该包含如下东西 第一步&#xff0c…

ubuntu18.04安装matlab2018

1. 一. 安装前的准备工作 将下载好的文件R2018a_glnxa64_dvd1.iso, R2018a_glnxa64_dvd2.iso, Crack放到目录/home/zzw/Downloads下 在该目录下新建dvd文件夹:mkdir dvd 二. 挂载镜像文件并安装Matlab 原文链接:https://blog.csdn.net/qq_37643960/a…

Ubuntu18.04 安装Matlab2021b

Ubuntu18.04/Linux下 安装Matlab2021b 1、软件下载2、安装3、安装matlab-support4、安装Troubleshotting5、安装成功开始使用6、更改系统默认快捷键7、可能出现的错误 1、软件下载 链接: https://pan.baidu.com/s/1e2w_ZXIoibMG6PfqVbf-6Q 提取码: dmfu解压后共有俩文件 2、…

Linux下安装Matlab

Linux下安装Matlab 安装包安装流程1.解压缩2.安装3.安装界面4.激活 使用1.环境变量配置2.计算分区选择3.运行4.并行 卸载 安装包 安装包上传服务器或者外置光驱安装。 我是把安装包上传到服务器,解压后安装到个人目录下,不需要root权限。 安装包下载链…

Linux安装Matlab

系统环境:Ubuntu 20.04Matlab版本:R2019b 首先下载Matlab的ios文件(这个版本有18G,再传到服务器上,真是漫长的修行。。) 在服务器上把ios文件单独放到一个目录里,比如叫Matlab/,然后…

MATLAB安装教程

比较适合学生党使用的是Matlab2016中文版 下载之后会有镜像文件,补丁文件和密钥 1.点击镜像文件 R2016a_win64.iso 2.点击setup.exe 3.选择使用文件密钥安装 5.填入密钥 6.更改默认路径之后,记住这个路径,待会打补丁时要用 7. 8. 解压补丁…

最新MATLAB超详细安装教程(附完整文件)

前言 MATLAB(矩阵实验室)是MATrix LABoratory的缩写,是一款由美国The MathWorks公司出品的商业数学软件。MATLAB是一种用于算法开发、数据可视化、数据分析以及数值计算的高级技术计算语言和交互式环境。除了矩阵运算、绘制函数/数据图像等常…

【matlab安装】手把手图文并茂安装matlab2021(win10版)

中国史之【祖甲改制】: 祖甲,商朝第25位国王。祖甲即位后,建立了完备的周祭制度,在王位继承问题上,改变兄终弟及制,开始完全采用父死子继制。 -来源:全历史APP (心急的同学可以直接跳…