stm32串口收发总结

article/2025/10/16 15:19:52

stm32串口的使用过程:
1.使能串口时钟,同时使能串口对应的GPIO的时钟;
2.设置串口引脚的输入输出模式、速率,并初始化GPIO引脚;
3.对于需要接收数据的串口,配置其中断,并使能;
4.设置串口的波特率、数据位、停止位、奇偶校验位、流控方式、收发模式;
5.初始化串口;
6.开串口接收中断;
7.使能串口;
8.编写串口中断服务函数;
9.发送数据

补充:STM32中与串口相关的寄存器主要是状态寄存器SR和数据寄存器寄存器DR。
附图如下:
在这里插入图片描述
状态寄存器比较重要的两位是第六位RXNE和第七位TC,使用方法USARTx->SR。
TC:发送完成 (Transmission complete)
当包含有数据的一帧发送完成后,并且TXE=1时,由硬件将该位置’1’。如果USART_CR1中的
TCIE为’1’,则产生中断。由软件序列清除该位(先读USART_SR,然后写入USART_DR)
。TC
位也可以通过写入’0’来清除,只有在多缓存通讯中才推荐这种清除程序。
0:发送还未完成;
1:发送完成。

RXNE:读数据寄存器非空 (Read data register not empty)
当RDR移位寄存器中的数据被转移到USART_DR寄存器中,该位被硬件置位。如果
USART_CR1寄存器中的RXNEIE为1,则产生中断。对USART_DR的读操作可以将该位清
。RXNE位也可以通过写入0来清除,只有在多缓存通讯中才推荐这种清除程序。
0:数据没有收到;
1:收到数据,可以读出。

所以常用SR的第六位RXNE来判断是否接收到数据,若接收到数据,就将数据从DR中读取出来,以便DR接收下个数据。

在这里插入图片描述
DR[8:0]:数据值 (Data value)
包含了发送或接收的数据。由于它是由两个寄存器组成的,一个给发送用(TDR),一个给接收
用(RDR),该寄存器兼具读和写的功能。TDR寄存器提供了内部总线和输出移位寄存器之间的
并行接口(参见图248)。RDR寄存器提供了输入移位寄存器和内部总线之间的并行接口。
当使能校验位(USART_CR1中PCE位被置位)进行发送时,写到MSB的值(根据数据的长度不
同,MSB是第7位或者第8位)会被后来的校验位该取代。
当使能校验位进行接收时,读到的MSB位是接收到的校验位。

代码如下:

	//定义初始化变量GPIO_InitTypeDef GPIO_InitStructure;USART_InitTypeDef USART_InitStructure;NVIC_InitTypeDef NVIC_InitStructure;//使能串口2的时钟和GPIOA的时钟RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2, ENABLE);//PA2-TX,PA3-RXRCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);//配置串口对应引脚的收发模式//USART2_RX    GPIOA.3初始化GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3;//PA3GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;//浮空输入GPIO_Init(GPIOA, &GPIO_InitStructure);/初始化GPIOA.3	//USART2_TX	  GPIOA.2初始化GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2; //PA.2GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;	//复用推挽输出GPIO_Init(GPIOA, &GPIO_InitStructure);//初始化GPIOA.2	//注意:此处TX和RX引脚都要配置,否则可能无法通信//USART2 NVIC 配置NVIC_InitStructure.NVIC_IRQChannel = USART2_IRQn;NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=3 ;//抢占优先级3NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3;//子优先级3NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;//IRQ通道使能NVIC_Init(&NVIC_InitStructure);	//初始化NVIC寄存器//USART  初始化设置USART_InitStructure.USART_BaudRate = 115200;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;//收发模式//初始化USART2USART_Init(USART2, &USART_InitStructure);//开启USART2接收中断USART_ITConfig(USART2, USART_IT_RXNE, ENABLE);//使能串口2USART_Cmd(USART2, ENABLE); //编写USART2的中断服务函数void USART2_IRQHandler(void) {u8 Res;USART_PRINTF_FLAG=2;if(USART_GetITStatus(USART2, USART_IT_RXNE) != RESET)  //接收中断,判断读寄存器是否为空{Res =USART_ReceiveData(USART2);	//读取接收到的数据if((USART2_RX_STA&0x8000)==0)//接收未完成{if(USART2_RX_STA&0x4000)//接收到了0x0d{if(Res!=0x0a)USART2_RX_STA=0;//接收错误重新开始else 	{if(crc_check(USART2_RX_BUF,17))USART2_RX_STA|=0x8000;	//接收完成elseUSART2_RX_STA=0;//接受错误,重新开始}}else //未接收到0x0d{	if(Res==0x0d)USART2_RX_STA|=0x4000;else{USART2_RX_BUF[USART2_RX_STA&0X3FFF]=Res ;USART2_RX_STA++;if(USART2_RX_STA>(USART_REC_LEN-1))USART2_RX_STA=0;}		 }}   		 } } //注:此处参考了正点原子所提供的源码,根据自己的需要对接收完成的判断进行了修改//发送数据USART_SendData(UART4, USART2_TX_BUF[t]);//向UART4发送数据while(USART_GetFlagStatus(UART4,USART_FLAG_TC)!=SET);//等待发送结束//注while语句必须存在,否则可能出现接收字符不完整的情况,且USART_SendData一次只能发送一个数据,对于数组需要用循环的方式进行发送//补充:如何用printf进行发送//参照正点原子,重定义fputc函数int fputc(int ch, FILE *f){      if(USART_PRINTF_FLAG==2){while((USART2->SR&0X40)==0){};USART2->DR = (u8) ch; }else{while((USART3->SR&0X40)==0){};USART3->DR = (u8) ch; 		}return ch;}//注意:与正点原子不同的是补充了一个发送标志(全局变量),判断是用哪个串口进行发送,用于处理多串口收发

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

相关文章

STM32串口发送中断踩坑

今天想测试下Modbus设备,手上暂时没有串口转485的模块,就打算用手上的stm32f042的开发板做个串口转485模块。如下所示 但是软件实际开发过程中,遇到了麻烦。 现象: 在打开串口接收中断时,串口会一直产生除接收中断外的其它中断…

STM32串口下载程序

STM32串口连接及下载程序 一、认识STM321、浅谈STM322、TTL串口与STM3连接 二、下载程序1、HEX文件生成2、烧录软件使用 三、总结四、参考文献 一、认识STM32 1、浅谈STM32 1、STM32型号的说明:以STM32F103RBT6这个型号的芯片为例,该型号的组成为7个部分&#xff…

STM32串口收发处理

STM32串口收发 STM32的串口接收和发送方式都有三种情况,即轮询、中断和DMA,俩俩组合便有9种可能的组合。 下面挑出其中三种收发方式进行研究,以及优缺点比较。 一、中断接收、轮询发送,无缓存模式 1.1 原理 当串口上有字节传送…

STM32 串口通讯及实现

目录 一、串口通讯概述1、广义的串口2、狭义的串口3、串口数据定义4、串口通讯应用 二、STM32串口工程标准库实现1、串口的初始化2、串口数据发送.3、串口的数据接收 一、串口通讯概述 1、广义的串口 广义的串口是针对并口来说的。串口是指设备之间通过一根数据信号线按数据位…

STM32串口配置

目录 串口设置的一般步骤: 1) 串口时钟使能,GPIO 时钟使能 2) 串口复位 3) GPIO 端口模式设置 4) 数据发送与接收 5) 串口状态 6) 使能串口 7) 开启串口响应中断 8.获取相应中断状态 串口设置的一般步骤: 1) 串口时钟使能&#xff0…

STM32串口详解

实验一:简单的利用串口接收中断回调函数实现数据的返回 关于串口调试助手,还应知道: 发送英文字符需要用一个字符即8位,发送汉字需要两个字符即16位,如上图,发送汉字“姜”实际是发送“BD AA”而发送英文字…

stm32串口实验

目录 (一)STM32 串口简介 (二)软件设计 (三)效果:​ 1.实现功能:STM32 通过串口和上位机的对话, STM32 在收到上位机发过来的字符串后,原原本本的返回给上位机。 (一&…

STM32 串口乱码

问题描述 用正点原子STM32F4探索者开发板调试野火骄阳电机驱动程序,发现串口输出一直是乱码。问题排查: 串口调试助手编码方式?同一个串口调试助手,用正点原子、STM32CubeMX生成的程序发送数据正常。排除串口调试助手问题。串口…

STM32串口通信编程

重庆交通大学信息科学与工程学院 《嵌入式系统基础A》课程 实验报告(2) 班 级: 物联网工程2002 姓名-学号 : 徐权-632007060327 实验项目名称: STM32串口通信编程 实验项目性质: 设计性 实验所…

STM32串口驱动

首先了解串口通信的一些基本原理: ⚫ 串口通信: 串口通信是指数据通过一条数据线(或者两条差分线)一位接着一位的传输出去。串口通信的优点是占用硬件资源少,且传输距离较远,缺点是传输速度慢(…

STM32串口

使用百问网的STM32F103MINI开发板完成下面实验。 1、通过STM32CubeMX配置串口。 串口1选择Asynchronous,异步通信。 115200bps,8N1,默认即可。 2、串口发送数据。 STM32Cube生成代码后,在main.c的while(1)前面加一句。 HAL_U…

STM32 串口详解

目录 01、USART的特点 02、USART简介 2.1、数据传输模型 2.2、帧结构 2.3、波特率 03、STM32的USART 04、代码配置 01、USART的特点 USART是通用异步收发传输器(UniversalAsynchronousReceiver/Transmitter),通常称作UART,是一种异步…

STM32入门教程——串口通讯

目录 1.认识串口 2.stm32串口介绍 2.1 查询方式 2.1 中断方式 2.2 DMA方式 3.使用stm32串口实现printf 串口作为嵌入式设备最常用的外设之一,被广泛的应用。本文介绍STM32串口的如何使用。从以下几个方面介绍: 1.认识串口 常用串口的引脚主要由TX…

STM32—串口

串口介绍 串行接口简称串口,也称串行通信接口或串行通讯接口(通常指COM接口),是采用串行通信方式的扩展接口。串行接口(Serial Interface)是指数据一位一位地顺序传送。其特点是通信线路简单,只…

【stm32】串口通信

串口通信 一、串口通信协议原理二、usart功能框图三、stm32库的配置 一、串口通信协议原理 串口在嵌入式系统当中是一类重要的数据通信接口,其本质功能是作为 CPU 和串行设备间的编码转换器。当数据从 CPU 经过串行端口发送出去时,字节数据转换为串行的…

STM32-串口通信详解

目录 前言 一、通信接口背景知识 1. 并行通信和串行通信 2. 串行通信的分类 二、STM32的串口通信基础 1. 串口通信接口 2. 串口通信框图 3. 串口通信相关寄存器 4. 波特率计算方法 三、库函数配置 1. 串口配置一般步骤 总结 前言 众所周知,串口通信是MC…

STM32串口通信

STM32串口通信 一、串口 1.串口概述 串口是单片机中最常用也是最简单的一种通信方式通信:两个或两个以上的设备进行数据交换 串口是用于两个设备之间的异步全双工通信 异步——》两个设备不需要共时钟 全双工——》两个设备之间服务于数据交换的“线”有两根 Tx&…

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

文章目录 STM32的串口通信一、STM32里的串口通信二、串口的发送和接收串口发送串口接收 三、串口在STM32中的配置四、串口接收的两种实现方式1. 需要更改的地方2. 查询RXNE标志位3. 使用中断 总结 STM32的串口通信 本文在于记录自己的学习过程中遇到的问题和总结,各…

STM32串口通信详解

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

MacOS 安装 Matlab R2021b 手记

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