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

article/2025/10/14 11:10:41

目录

学习目标

内容

通信方法

并行通信

串行通信

通信方向

通信方式

 UART

特点

串口参数

通信流程

寄存器

USART_SR

USART_DR 

USART_BRR

过程

代码

运行结果

运行结果

遇到的问题

总结 


学习目标

        本节我们要学习的的是STM32的通信部分,主要介绍UART(通用异步收发器),是一种异步、全双工的通信方式。

内容

        首先,我们先来介绍一下通信的基本知识,之前在51单片机的学习中我们也接触过UART,在此就不做详细介绍,感兴趣的同学请看51单片机基础——串口通信 。

通信方法

并行通信

  •    传输原理:数据各个位同时传输。
  •    优点:速度快
  •    缺点:占用引脚资源多

串行通信

  •    传输原理:数据按位顺序传输。
  •    优点:占用引脚资源少
  •    缺点:速度相对较慢

通信方向

  • 单工: 数据传输只支持数据在一个方向上传输
  • 半双工:允许数据在两个方向上传输,但是,在某一时刻,只允许数据在一个方向上传输,它实际上是一种切换方向的单工通信;
  • 全双工:允许数据同时在两个方向上传输,因此,全双工通信是两个单工通信方式的结合,它要求发送设备和接收设备都有独立的接收和发送能力。
     

通信方式

  • 同步通信:带时钟同步信号传输。如SPI,IIC通信接口
  • 异步通信:不带时钟同步信号。如UART(通用异步收发器),单总线

        这是一些常见的串行通信接口,熟悉51单片机的同学应该都接触过,在此不做详细介绍,感兴趣可以去我的51单片机笔记一一了解。我们需要知道的是同步就需要时钟,半双工一般是需要一个输入输出端口,而全双工一般有两个。

 UART

        与51不同的是,STM32F407支持6个UART。但其他都是基本一样的,所以理解起来还是比较简单的。

特点

  • 简单双向串口通信有两根通信线(发送端TXD和接收端RXD)
  • TXD与RXD要交叉连接
  • 当只需单向的数据传输时,可以直接一根通信线
  • 当电平标准不一致时,需要加电平转换芯片
  • 支持小数波特率发生器系统,提供精确的波特率。(通信双方事先约定好一种速度即波特率)
  • 可配置的16倍过采样或8倍过采样,为速度容差与时钟容差的灵活配置提供了可能。
  • 可配置的停止位(支持1或者2位停止位)
  • 可编程的数据字长度(8位或者9位)
  • 可配置的使用DMA多缓冲器通信
  • 单独的发送器和接收器使能位
  • 检测标志:
    • 接收缓冲器;
    • 发送缓冲器空;
    • 传输结束标志;
  • 多个带标志的中断源,触发中断(串行通信可以发送接收数据,接收到一个数据可以触发一个中断)
  • 其他:校验控制、四个错误检测标志

串口参数

        我们在使用通信之前,需要设置好串口通信所需的参数,如下所示。

  1. 起始位
  2. 数据位(8位或9位)
  3. 奇偶校验位(第9位)
  4. 停止位(1、15、2位)
  5. 波特率设置

通信流程

        红色代表发送,蓝色代表接收,其实核心部分就是下面的设置波特率 ,而这一部分,我们会在后面的代码中呈现出来,在此不做介绍。

 

寄存器

USART_SR

        SR寄存器叫做状态寄存器(Status register),具体每个位对应是什么就不一一介绍,手册上都有详细的介绍。到时候再到代码进行介绍。

USART_DR 

        DR寄存器叫做数据寄存器(Data register),主要用来接收和发送数据。

USART_BRR

        BRR寄存器叫波特率寄存器(Baud rate register),用来配置波特率。

过程

  1. 串口时钟使能,GPIO 时钟使能。
  2. 设置引脚复用器映射:调用 GPIO_PinAFConfig 函数。
  3. GPIO 初始化设置:要设置模式为复用功能。
  4. 串口参数初始化:设置波特率,字长,奇偶校验等参数。
  5. 开启中断并且初始化 NVIC,使能中断(如果需要开启中断才需要这个步骤)。
  6. 使能串口。
  7. 编写中断处理函数:函数名格式为 USARTxIRQHandler(x 对应串口号)。 

代码

        这一段代码,就是简单的一个串口通信,我们使用单片机与电脑通信,将数据发送给单片机,再由单片机发送给电脑。

#include "stm32f4xx.h"
#include "usart.h"
#include "delay.h"void My_USART1_Init(void)
{// 串口1是接在APB2上的GPIO_InitTypeDef  GPIO_InitStructure;// GPIOUSART_InitTypeDef USART_InitStructure;// 串口NVIC_InitTypeDef NVIC_InitStructure;// 中断RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1,ENABLE);// 使能串口1RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA,ENABLE);// 使能GPIOGPIO_PinAFConfig(GPIOA,GPIO_PinSource9,GPIO_AF_USART1);// PA9,PA10初始化GPIO_PinAFConfig(GPIOA,GPIO_PinSource10,GPIO_AF_USART1);GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9 | GPIO_Pin_10;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;GPIO_Init(GPIOA, &GPIO_InitStructure);// 设置串口USART_InitStructure.USART_BaudRate = 115200;// 波特率USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None; // 硬件流控USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;// 发送接收USART_InitStructure.USART_Parity = USART_Parity_No;// 奇偶校验USART_InitStructure.USART_StopBits = USART_StopBits_1;// 停止位USART_InitStructure.USART_WordLength = USART_WordLength_8b;// 发送位数USART_Init(USART1, &USART_InitStructure);USART_Cmd(USART1,ENABLE);USART_ITConfig(USART1,USART_IT_RXNE,ENABLE);// 设置中断NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;// 响应优先级NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;// 抢占优先级NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn;NVIC_Init( &NVIC_InitStructure);
}// 中断函数
void USART1_IRQHandler(void)
{u8 res;if(USART_GetITStatus(USART1,USART_IT_RXNE)){res = USART_ReceiveData(USART1);USART_SendData(USART1,res);}
}int main(void)
{// 中断分组NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);My_USART1_Init();while(1);
}

运行结果

32串口通信

        上面的代码是一个简单的例子,接下来我们看一个复杂一点的例子,只给出主函数,其他头文件有需要的可以找我或者去正点原子官方进行下载。

#include "sys.h"
#include "delay.h"
#include "usart.h"
#include "led.h"
#include "beep.h"
#include "key.h"int main(void)
{ u8 t,key,len;u16 times=0;  NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);// 设置中断优先级分组2delay_init(168);		//延时函数初始化uart_init(115200);	//波特率115200LED_Init();		  		//初始化LEDKEY_Init();// 按键初始化printf("您好,请问有什么能帮助到你的吗?\r\n");while(1){key = KEY_Scan(0);if(USART_RX_STA&0x8000)// 判断接收完成位{					   len=USART_RX_STA&0x3fff;// 数据长度printf("\r\n您发送的问题我们已经收到:\r\n");for(t=0;t<len;t++){USART_SendData(USART1, USART_RX_BUF[t]);         // 向串口1发送数据while(USART_GetFlagStatus(USART1,USART_FLAG_TC)!=SET);// 等待发送结束}printf("\r\n\r\n");//换行USART_RX_STA=0;}else{times++;if(times%30==0)LED0=!LED0;//LED闪烁,提示正常delay_ms(10);   }if(key == 1){printf("\r\n您好,我是人工客服小陈,很高兴为您服务!\r\n");}}
}

运行结果

32串口通信1

遇到的问题

        在此过程中,遇到了一些问题,比如代码补全功能调不出来,还有XCOM的乱码问题,代码补全的问题,用MDK的exe替换就好了,因为可能是之前安装的是51的安装包。关于乱码的问题,我单独写一篇文章,希望能帮助遇到相同问题的同学,关于使用XCOM进行串口通信时乱码的解决方案。

总结 

        好了,关于串口通信我们先讲这么多,希望能对大家有所帮助,谢谢大家了! 


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

相关文章

STM32—串口通讯详解

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

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

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

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

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

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

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

EXT iconCls说明

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

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

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

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

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

UniGui中使用IconCls

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

UniGui iconCls字符图标的引用

游览unigui官方论坛&#xff0c;发现了iconCls字符图标的引用功能&#xff0c;测试了一下&#xff0c;很好用。 引用格式&#xff1a;iconCls: {fontCls} {iconPrefix}-{iconName} 例子&#xff1a;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、效果图 左侧菜单树&#xff0c;和选项卡tabs显示自定义图标。 先推荐一个icon图标下载的网站&#xff1a;https://www.easyicon.net/ 2、iconCls属性 3、准备图标icon 可以从上面推荐的网址下载&#xff0c;基本上各种类型都有 将下载好的图标放入easyui图标文件夹内web…

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

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

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

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

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

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

特征选择算法分类

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

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

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

特征选择算法总结

1 综述 (1) 什么是特征选择 特征选择 ( Feature Selection )也称特征子集选择( Feature Subset Selection , FSS ) &#xff0c;或属性选择( Attribute Selection ) &#xff0c;是指从全部特征中选取一个特征子集&#xff0c;使构造出来的模型更好。 (2) 为什么要做特征选择 …