STM32串口通信

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

STM32串口通信

一、串口

1.串口概述

串口是单片机中最常用也是最简单的一种通信方式通信:两个或两个以上的设备进行数据交换
串口是用于两个设备之间的异步全双工通信
异步——》两个设备不需要共时钟
全双工——》两个设备之间服务于数据交换的“线”有两根
Tx:数据发送端,用于发送数据
Rx:数据接收端,用于接收数据
在这里插入图片描述
在使用串口进行通信时,要求通信双方必须在“同频道” “同频道” =》 相同的通信协议,同时双方需要共地,也就是GND相连
串口(USART)约定:通信时数据必须以“帧”的形式传递串口的一帧数据包括:起始位 + 数据位 + 校验位 + 停止位
其中:
1)起始位:固定是1个周期的低电平信号
2)数据位:可由通信双方自行约定是 5 ~ 9 bits
3)校验位:串口采用的是奇偶校验,可由通信双方自行约定
4)停止位:可选的 0.5 ~ 2 个周期的高电平
同时,为了同步通信双发的收发速度,还需要约定每秒钟传输的数据帧的数量,称为 波特率,典型波特率有9600 115200 57600 ……

2.STM32F4xx 串口控制器

单片机中通常会集成有串口的控制器,用户通常只需要通过软件配置串口控制器就可以利用串口进行通信了!!
在这里插入图片描述

SR:状态寄存器,每个比特位标志了串口控制器中不同的状态变化
RXNE:接收数据寄存器非空标志 1表示RDR寄存器中有数据,可以读取,0表示RDR寄存器中没有数据
TXE:发送数据寄存器为空标志 1表示TDR寄存器中没有数据,可以发送,0表示TDR寄存器中有数据不能发送(覆盖上一次发送的数据)

3.STM32F4xx 中的串口实现

以STM32F4xx USART1(串口1) 与 PC通信为例
串口转USB原理图
在这里插入图片描述
串口原理图
在这里插入图片描述
也就是说,当UART1的跳线帽接 1-3 和 2-4时,STM32的USART1 与 PC机就可以通过USB线通信(必须 烧写或 做调试串口)配置USART1作为调试串口与PC通信

1)配置Rx和Tx引脚

STM32中串口的Tx和Rx是由GPIO复用功能而来
在这里插入图片描述
PA9 –>USART1_Tx
PA10 –> USART1_RX

GPIO_InitTypeDef GPIO_InitStruct; /* 配置GPIO引脚复用为 Rx Tx */ RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GP IOA,ENABLE); //使能GPIOA组时钟 GPIO_InitStruct.GPIO_Pin = GPIO_Pin_9 | GPIO_Pin_10; GPIO_InitStruct.GPIO_Mode = GPIO_Mode_AF;//复用功能模式 GPIO_InitStruct.GPIO_OType = GPIO_OType_PP; GPIO_InitStruct.GPIO_PuPd = GPIO_PuPd_NOPULL; GPIO_InitStruct.GPIO_Speed = GPIO_Speed_100MHz; GPIO_Init(GPIOA,&GPIO_InitStruct);
GPIO_PinAFConfig(GPIOA,GPIO_PinSource9,G PIO_AF_USART1); //PA9 -> USART1_Tx 
GPIO_PinAFConfig(GPIOA,GPIO_PinSource10, GPIO_AF_USART1);//PA10-> USART1_Rx
2) 配置串口初始化
/* 配置USART1 */
RCC_APB2PeriphClockCmd(RCC_APB2Periph_US ART1,ENABLE); //使能USART1的时钟(USART1 在APB2总线上)USART_InitStruct.USART_BaudRate = 9600; //指定波特率
USART_InitStruct.USART_WordLength= USART_WordLength_8b; //指定数据位长度(通 常是8bits)
USART_InitStruct.USART_Parity = USART_Parity_No; //指定校验方式(通常不校验)
USART_InitStruct.USART_StopBits = USART_StopBits_1; //指定停止位(通常是1个停止)
USART_InitStruct.USART_Mode = USART_Mode_Tx|USART_Mode_Rx; //指定收发模式
USART_InitStruct.USART_HardwareFlowContr ol = USART_HardwareFlowControl_None;//指定硬件控制流(通常不要)
USART_Init(USART1,&USART_InitStruct);/* 开启串口,就可以开始通信 */
USART_Cmd(USART1,ENABLE);
3) 串口收发函数
//通过USART1发送1个字节 
void usart1_send_byte(char data) 
{ //USART_GetFlagStatus 用来获取串口SR寄 存器中的指定标志位 //获取TXE标志,判断其是否被设置(SET)   while(USART_GetFlagStatus(USART1,USART_F LAG_TXE) != SET); //USART_SendData 用来通过指定串口发送数 据   USART_SendData(USART1,data); 
}
char usart1_recv_byte(void) 
{ char ch = 0; while(USART_GetFlagStatus(USART1,USART_F LAG_RXNE) != SET); ch = USART_ReceiveData(USART1); return ch; 
}

测试代码:

    char str[] = "HELLO";int i = 0;led_init();uart1_init();/* Infinite loop */while(1){GPIO_ResetBits(GPIOF,GPIO_Pin_9);Delay(1000);GPIO_SetBits(GPIOF,GPIO_Pin_9);Delay(1000);for(i=0;i<7;i++){usart1_send_byte(str[i]);}}

由于USART1的跳线帽接 1-3和2-4,也就是通过USART1发送的数据经由USB线发送给了PC机此时,在PC上运行串口调试助手,则可以接收这些数据

4)串口接收中断

中断是指:当某件紧急的事件产生后,会打断CPU的正常执行顺序,转去执行中断处理程序,当中断处理程序执行完后,又回到原来被打断的位置继续执行的过程,
被称为中断在串口应用中,我们不知道对方什么时候会发数据过来所以接收函数,并不适用 =》可能导致程序一直阻塞在while因此,我们需要借助中断 来实现串口的数据接收
串口中断配置:

/* 配置串口1的接收中断 */  USART_ITConfig(USART1,USART_IT_RXNE,ENABL E); 
//USART_IT_RXNE接收数据寄存器不为空时产生 中断

配置了中断后,必须要配置 NVIC(中断控制器)

/* 配置NVIC中断控制器 */
NVIC_InitTypeDef NVIC_InitStruct;
NVIC_InitStruct.NVIC_IRQChannel = USART1_IRQn; //指定中断通道 xxx_IRQn
NVIC_InitStruct.NVIC_IRQChannelPreemption Priority = 2;//抢占优先级
NVIC_InitStruct.NVIC_IRQChannelSubPriorit y = 2;//子优先级
NVIC_InitStruct.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStruct);

上述配置完成后,一旦对法发送数据到STM32就会触发串口1的中断
此时还需要一个串口1的中断处理函数

char ch = 0; 
void USART1_IRQHandler(void) 
{//判断是由 RXNE接收数据寄存器非空 产生的中断  if(USART_GetITStatus(USART1,USART_IT_RXN E) == SET) { ch = USART_ReceiveData(USART1); //接收1个字节的数据   USART_ClearITPendingBit(USART1,USART_IT_ RXNE);//清除中断标志    } 
}

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

相关文章

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

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

STM32串口通信详解

✅作者简介&#xff1a;嵌入式入坑者&#xff0c;与大家一起加油&#xff0c;希望文章能够帮助各位&#xff01;&#xff01;&#xff01;&#xff01; &#x1f4c3;个人主页&#xff1a;rivencode的个人主页 &#x1f525;系列专栏&#xff1a;玩转STM32 &#x1f4ac;保持学…

MacOS 安装 Matlab R2021b 手记

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

linux安装matlabRuntime

1.找到自己需要的文件夹&#xff0c;下载压缩包&#xff0c;版本自己发挥 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 工具包的文件夹。&#xff08;其实哪里都行&#xff0c;防止误删&#xff09; 我的是matlab安装目录下面 打开Matlab --“主页” --“设置路径” 3. 添加文件夹-选择工具包文件夹 4. 点击切换路径按钮到工具包目录&am…

安装Matlab R2022a/64位

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

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

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

【首发】 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 选安装文件夹&#xff08;权限够&#xff09;2.6 选需要的包2.7 选link…

服务器远程安装Matlab2015

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

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

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

Ubuntu18.04安装Matlab2019b

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

Ubuntu安装matlab2018a

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

如何安装matlab2016b

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

Ubuntu20.04安装matlab详细教程

这里安装的是MATLAB2015b版本&#xff0c;其他版本也可参照这个安装步骤&#xff01; 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文件夹&#xff1a;mkdir dvd 二. 挂载镜像文件并安装Matlab 原文链接&#xff1a;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.并行 卸载 安装包 安装包上传服务器或者外置光驱安装。 我是把安装包上传到服务器&#xff0c;解压后安装到个人目录下&#xff0c;不需要root权限。 安装包下载链…

Linux安装Matlab

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

MATLAB安装教程

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

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

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