八、Stm32学习-USART-中断与接收数据包

1.通信接口

全双工就是数据的收和发可以同时进行;半双工就是数据的收和发不能同时进行。

异步时钟是设备双方需要约定对应的波特率;同步时钟是设备双方有一根时钟线,发送或接收数据是根据这根时钟线来的。

单端电平是需要共GND;差分电平不需要共GND,它的数据传输是依靠电压差来传递的。

2.电平标准

有些时候设备两端的电压是不同的,所以高低电平的表示电压也是不同的电压表示的。这个时候就需要添加电平转换电路。以上是常见的几种串口电平。485可以传输上千米,而232与TTL可能只能几十米。这些电压都是对地电压。

3.串口的参数

1000比特就是1s要发送1000位;波特率为9600时,发送一位的时间为1/9600;

固定低电平为起始位,告诉设备我要开始发送了;

固定高电平为停止位,告诉设备我发送好了。(同时把引脚恢复成了高电平)

有3种校验:奇校验,偶校验,无校验。

奇校验就是,包括奇校验在内的9位数据会出现奇数个1;发送数据的时候,若不是奇数,校验位就会补1,若是奇数,校验位就会补0;最后接收数据的时候会检查个数是否正常,是否为奇数。

偶校验就是,包括偶校验在内的9个数据会出现偶数个1;同理。

停止位有三种:1个停止位,0.5个停止位,1.5个停止位

相当于每次发送一个字节的数据,停止位占1个字节或0.5字节或1.5字节。

串口没有发送数据的时候就是空闲高电平。

4.Stm32的USART介绍

串口的同步模式一般用于兼容其他的协议,串口一般用异步。

波特率是对时钟比如72MHZ进行分频,然后得到我们想要的波特率,就可以以这样的波特率进行收发数据了。

硬件流控制要多一根线,有点像标志位,判断对面设备是否接收完成我们发送的数据,这根线置高或低电平等。

5.USART基本结构

一旦发送移位寄存器移位完成,TDR寄存器就会把数据往下送,然后置一个标志位。我们就可以判断标志位,要不要写下一个数据等。

6.程序编写-USART-发送与接收数据包

(1)USART引脚与时钟配置

打开对应外设与引脚的时钟。配置引脚的模式,发送数据就是引脚输出高低电平,所以选择复用推挽;接收数据,查阅手册可以配置位上拉或者浮空。

	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_USART1,ENABLE);
	
	GPIO_InitTypeDef GPIO_InitStructure;
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;   //发送数据就是置高低电平,所以选复用推挽,增加输出能力
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_Init(GPIOA,&GPIO_InitStructure);
	
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;   //接收数据上拉或者浮空,阅读手册可知道
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_Init(GPIOA,&GPIO_InitStructure);

 (2)USART基本配置

	USART_InitTypeDef USART_InitStruct;
	USART_InitStruct.USART_BaudRate = 9600;  									 //波特率
	USART_InitStruct.USART_HardwareFlowControl = USART_HardwareFlowControl_None; //硬件流控制
	USART_InitStruct.USART_Mode = USART_Mode_Tx | USART_Mode_Rx;				//发送模式
	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(USART1,&USART_InitStruct);

设置波特率为9600,双方的波特率一定要相同哦。

 关闭硬件流控制。

打开发送与接收模式。

无校验。

停止位长度为1。

数据帧的长度为8。

这样我们的串口就配置好了,只差最后一步使能串口USART1

(3)配置串口中断和使能

	USART_ITConfig(USART1,USART_IT_RXNE,ENABLE);
	
	NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
	
	NVIC_InitTypeDef  NVIC_InitStructure;
	NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn;
	NVIC_InitStructure.NVIC_IRQChannelCmd =ENABLE ;
	NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;
	NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;
	NVIC_Init(&NVIC_InitStructure);
    USART_Cmd(USART1,ENABLE);

想要使用串口中断就要先打开通道。

配置中断的通道。

 (4)中断函数编写

中断函数的名字可以去系统的启动文件中查找。

void USART1_IRQHandler(void)
{
	static uint8_t RxState = 0;		//定义表示当前状态机状态的静态变量
	static uint8_t Rxcount =0;
	if (USART_GetITStatus(USART1, USART_IT_RXNE) == SET)		
	{
		Serial_RxData = USART_ReceiveData(USART1);				//读取数据寄存器,存放在接收的数据变量
		if(RxState==0)
		{
			if(Serial_RxData==0xFF)
			{
				RxState=1;
				Rxcount=0;
			}
		}
		else if(RxState==1)
		{
			RxData_Packet[Rxcount]=Serial_RxData;
			Rxcount++;
			if(Rxcount>=4)
			{
				RxState=2;
			}
			
		}
		else if(RxState==2)
		{
			if(Serial_RxData==0xFE)
			{
				RxState=0;
				Serial_RxFlag = 1;										//置接收标志位变量为1
			}
		}
		USART_ClearITPendingBit(USART1,USART_IT_RXNE);			//清除USART1的RXNE标志位
																//读取数据寄存器会自动清除此标志位
																//如果已经读取了数据寄存器,也可以不执行此代码
	}
}

在中断函数中完成数据转存,然后在主函数中打印出来

(5)主函数

int main(void)
{
	OLED_Init();
	Serial_Init();
	OLED_ShowString(1, 1, "RxData:");
	
	while(1)
	{
		if(Serial_GetRxFlag()==1) //接收到数据了,判断标志位
		{
			OLED_ShowHexNum(2,1,RxData_Packet[0],2);
			OLED_ShowHexNum(2,4,RxData_Packet[1],2);
			OLED_ShowHexNum(2,7,RxData_Packet[2],2);
			OLED_ShowHexNum(2,10,RxData_Packet[3],2);
			SendPacket(RxData_Packet,4);
		}
	}
	
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/313081.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

2023 年最值得推荐的11个视频转换器(免费和付费)

拥有一个视频转换器供您使用意味着您可以轻松地在任何设备上播放所有视频。我们展示了适用于 Windows 的最佳视频转换器,这样您就不必浪费时间使用不合格的工具。 录制、编辑和分享视频是人生最大的消遣之一。有如此多的设备能够捕捉视频——而且共享它们的途径也很…

【Git】查看凭据管理器的账号信息,并删除账号,解决首次认证登录失败后无法重新登录的问题

欢迎来到《小5讲堂》 大家好,我是全栈小5。 这是是《代码管理工具》序列文章,每篇文章将以博主理解的角度展开讲解, 特别是针对知识点的概念进行叙说,大部分文章将会对这些概念进行实际例子验证,以此达到加深对知识点的…

Python编程作业一:程序基本流程

目录 一、多分支语句 二、判断闰年 三、猴子吃桃问题 四、上/下三角形乘法表 五、猜数字游戏 一、多分支语句 某商店出售某品牌的服装,每件定价132元,1件不打折,2件(含)到3件(含)打9折&…

可拖拽表单比传统表单好在哪里?

随着行业的进步和发展,可拖拽表单的应用价值越来越高,在推动企业实现流程化办公和数字化转型的过程中发挥了重要价值和作用,是提质增效的办公利器,也是众多行业客户朋友理想的合作伙伴。那么,可拖拽表单的优势特点表单…

【时光记:2023的心灵旅程】

💝💝💝欢迎来到我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…

ARM Cortex-Mx 权威指南笔记—SysTick定时器

前言 通过本次学习你可以学到: 1、什么是SysTick定时器? 2、Systick定时器的操作。 3、如何使用Systick定时器。 正文内容参考 ARM Cortex-Mx 权威指南笔记 9.5小节。 什么是Systick定时器 SysTick定时器是Cortex-M处理器内部集成的名为系统节拍定时…

【python,机器学习,nlp】RNN循环神经网络

RNN(Recurrent Neural Network),中文称作循环神经网络,它一般以序列数据为输入,通过网络内部的结构设计有效捕捉序列之间的关系特征,一般也是以序列形式进行输出。 因为RNN结构能够很好利用序列之间的关系,因此针对自…

电位器

一、电位器简介 电位器是一种可调的电子元件。它是由一个电阻体和一个转动或滑动系统组成。当电阻体的两个固定触电之间外加一个电压时,通过转动或滑动系统改变触点在电阻体上的位置,在动触点与固定触点之间便可得到一个与动触点位置成一定关系的电压。…

C++系列-第1章顺序结构-6-加法、减法和乘法

在线练习: http://noi.openjudge.cn/ https://www.luogu.com.cn/ 总结 本文是C系列博客,主要讲述加法减法乘法的用法 加法 减法 乘法 当然可以。下面我将分别为初一的同学提供C中加法、减法、乘法的简单教程和案例,最后再提供一个综合性的…

【Linux驱动】Linux的中断系统 | 中断的重要数据结构

🐱作者:一只大喵咪1201 🐱专栏:《Linux驱动》 🔥格言:你只管努力,剩下的交给时间! 目录 🏀Linux系统的中断⚽中断分类软中断和硬中断中断的上半部和下半部 ⚽tasklet⚽工…

Android studio调试

Android Studio连接手机详细教程(包含遇到的问题集)_android studio 连接手机-CSDN博客 可以创建虚拟机或直连真机或直连模拟器。 无法打开本地终端 Android studio Failed to start [powershell.exe] 利用Android studio的adb命令删除app应用 - 简书 利用ADB工具免root停用A…

如何下载 DEM数字高程数据(SRTM和COPERNICUS)

数字高程模型(Digital Elevation Model,DEM)是地球表面的数字表示,以地形高程信息的形式存在。DEM通常以栅格或点云的形式存在,其中每个单元(栅格或点)都具有对应的高程数值。DEM可以使用各种技…

第88讲:XtraBackup实现增量数据备份以及故障恢复的应用实践

文章目录 1.XtraBackup增量备份恢复的概念2.XBK增量备份语法3.使用XBK实现数据库的增量备份3.1.周日全量备份数据库3.2.周一产生增量数据并进行增量备份3.3.周二产生增量数据并进行增量备份3.4.查看两次增量以及全量的备份文件3.5.核对全量和增量备份的准确性 4.使用XBK通过增量…

销售团队如何实现业绩增长?CRM系统的线索管理功能有什么用?

随着“以客户为中心”观念的逐渐普及,销售团队的客户比过去更复杂,交易周期更久,竞争也更激烈。假如没有明确的销售计划,团队可能陷入混乱,最后导致客户&公司之间的负面结果。在这种情况下,人工智能驱动…

YOLOv8 损失函数改进 | 引入 Shape-IoU 考虑边框形状与尺度的度量

🗝️改进YOLOv8注意力系列一:结合ACmix、Biformer、BAM注意力机制 论文讲解加入代码本文提供了改进 YOLOv8注意力系列包含不同的注意力机制以及多种加入方式,在本文中具有完整的代码和包含多种更有效加入YOLOv8中的yaml结构,读者可以获取到注意力加入的代码和使用经验,总…

npm报错error:03000086:digital envelope routines::initialization error

1.可能是因为node版本过高,与现在的项目不符合 这是降低node版本的命令,然后重新运行 npm install npm8.1.2 -g 2.改下这个package.json "dev": "SET NODE_OPTIONS--openssl-legacy-provider && vue-cli-service serve",也…

企业网络出口部署案例

知识改变命运,技术就是要分享,有问题随时联系,免费答疑,欢迎联系! 厦门微思网络​​​​​​ https://www.xmws.cn 华为认证\华为HCIA-Datacom\华为HCIP-Datacom\华为HCIE-Datacom Linux\RHCE\RHCE 9.0\RHCA\ Oracle O…

写点东西《Docker入门(上)》

写点东西《Docker入门(上)》 环境变量 Docker 镜像 Docker CMD 与 ENTRYPOINT 有什么区别 Docker 中的网络: Docker 存储: Docker 是一个工具,允许开发人员将他们的应用程序及其所有依赖项打包到一个容器中。然后&…

CRM系统针对销售管理有哪些功能?如何帮助销售效率增长?

从长远来看,有效的CRM管理系统可以帮助您的企业达到甚至超过收入目标。现代大多数企业都依靠CRM系统来管理其销售周期并增加收入。但是,当大多数人提到CRM时,他们指的是使能够改善业务关系并轻松管理不断团队的软件或工具。合格的CRM系统能够…

Bug小能手系列(python)_14: pd.concat得到的矩阵错误

pd.concat得到的不是自己想要的矩阵 0 引言1 错误原因2 解决思路3 具体代码4 总结 0 引言 今天在运行pd.concat (pd指的是pandas库),需要将两个DataFrame数据(数据分别为5*4的矩阵)进行列合并时,突然发现得到的矩阵是10*8的&…