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

news2024/11/16 0:41:18

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);
		}
	}
	
}

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

uniapp 打包成 apk(原生APP-云打包)免费

修改APP配置 根据需求,修改 manifest.json 配置,常见的修改有: 应用名称,应用版本名称,应用版本号 升级版本时,应用版本名称和应用版本号必须高于上一版的值 应用图标 点浏览选择png格式的图片后&#x…

【VPN技术】简述几种常见VPN技术并比较其异同点

VPN技术是一种可以在公共网络上建立加密通道的技术,通过这种技术可以使远程用户访问公司内部网络资源时,实现安全的连接和数据传输。 下面以四种常见的VPN技术,分别介绍各自的特点和适用场景,然后进行异同点的比较。 PPTP&#x…

微信私域,如何实现高效回复客户消息?

随着微信用户数量的增加,人们的需求也越来越多。其中有一项就是全天候及时回复消息,不让好友等待。当企业拥有多个微信号进行私域流量管理时,如何做到及时回复客户消息呢? 下面给大家分享高效回复客户消息的秘诀,帮助提…

highlight.js 实现搜索关键词高亮效果 ,显示匹配数量及切换显示功能

先看效果&#xff1a; 更新&#xff1a;增加切换显示 折腾了老半天&#xff0c;记录一下 注意事项都写注释了 代码&#xff1a; <template><div class"absolute-lt wh-full overflow-hidden p-10"><div style"width: 200px"><el-…

研究了Web版Photoshop,提升自己=提升价值

Adobe 发布了Web版 Photoshop&#x1f517;&#xff0c;它是使用 WebAssembly、web components、P3 颜色等 Web 技术构建的。本文就来研究一下网页版 Photoshop 上有趣又有用的 CSS 知识&#xff01; Photoshop 旧 Logo 首先&#xff0c;在浏览器控制台中使用了 Photoshop 的 …

【数字人】9、DiffTalk | 使用扩散模型基于 audio-driven+对应人物视频 合成说话头(CVPR2023)

论文&#xff1a;DiffTalk: Crafting Diffusion Models for Generalized Audio-Driven Portraits Animation 代码&#xff1a;https://sstzal.github.io/DiffTalk/ 出处&#xff1a;CVPR2023 特点&#xff1a;需要音频对应人物的视频来合成新的说话头视频&#xff0c;嘴部抖…

基于python的Hurst计算预测未来发展趋势(长时序栅格影像)

1.Hurst指数反映了时间序列长期记忆性的程度&#xff0c;即过去的信息对未来的影响程度。Hurst指数的取值范围为0到1之间&#xff0c;当Hurst指数等于0.5时&#xff0c;时间序列被认为是一种随机漫步&#xff0c;即具有随机性&#xff1b;当Hurst指数大于0.5时&#xff0c;时间…

JAVA基础学习笔记-day17-反射

JAVA基础学习笔记-day17-反射 1. 反射(Reflection)的概念1.1 反射的出现背景1.2 反射概述1.3 Java反射机制研究及应用1.4 反射相关的主要API1.5 反射的优缺点 2. 理解Class类并获取Class实例2.1 理解Class2.1.1 理论上2.1.2 内存结构上 2.2 获取Class类的实例(四种方法)2.3 哪些…

【MySQL】本地创建MySQL数据库详解

文章目录 下载MySQL安装重置密码本地连接 下载MySQL 下载网址&#xff1a;https://dev.mysql.com/downloads/mysql/ 安装 将下载好的压缩包解压到D盘。 在解压好的文件夹中创建my.ini文件。 将以下代码复制粘贴到创建好的my.ini文件中。注意修改文件路径。 [mysqld] #设置…

重生奇迹MU装备升级材料的获取

在重生奇迹MU中&#xff0c;装备升级需要使用各种材料&#xff0c;包括经验章、神秘石、宝石、元素石等。以下是各种材料的获取方法。 经验章&#xff1a;经验章是装备升级的基础材料&#xff0c;可以通过打怪掉落、任务奖励、商城购买等方式获得。建议玩家们多参加游戏中的活…

Python——python练习题

1.小明身高1.75&#xff0c;体重80.5kg。请根据BMI公式&#xff08;体重除以身高的平方&#xff09;帮小明计算他的BMI指数&#xff0c;并根据BMI指数&#xff1a; 低于18.5&#xff1a;过轻 18.5-25&#xff1a;正常 25-28&#xff1a;过重 28-32&#xff1a;肥胖 高于32&…

(Arcgis)matlab编程批量处理hdf4格式转换为tif格式

国家青藏高原科学数据中心 中国区域1km无缝地表温度数据集&#xff08;2002-2020&#xff09; 此代码仅用于该数据集处理 版本&#xff1a;arcgis10.2 matlab2020 参考&#xff1a;MATLAB hdf(h5)文件转成tif图片格式&#xff08;批量处理&#xff09; 此代码仅用于该数据集处…

SecLists:安全测试人员的必备手册 | 开源日报 No.144

danielmiessler/SecLists Stars: 50.9k License: MIT SecLists 是安全测试人员的伴侣&#xff0c;它是一个收集了多种类型列表的项目&#xff0c;用于安全评估。这些列表包括用户名、密码、URL、敏感数据模式、模糊负载、Web shell 等。其目标是使安全测试人员能够将该存储库拉…

SV-9001 壁挂式网络采播终端

SV-9001 壁挂式网络采播终端 一、描述 SV-9001是深圳锐科达电子有限公司的一款壁挂式网络采播终端&#xff0c;具有10/100M以太网接口&#xff0c;配置一路线路输入和一组麦克风输入&#xff0c;可以直接连接音源输出设备或麦克风&#xff0c;将采集音源编码后发送至网络播放终…

腾讯云COS桶文件上传下载工具类

1&#xff0c;申请key和密钥 2&#xff0c;引入依赖 <dependency><groupId>com.qcloud</groupId><artifactId>cos_api</artifactId><version>5.6.24</version></dependency>3&#xff0c;工具类 package com.example.activi…

跨境商城系统如何开发代购商城、国际物流、一件代发等功能?

跨境商城系统的开发涉及到多个方面&#xff0c;其中代购商城、国际物流和一件代发等功能是其中的重要组成部分。本文将详细介绍如何开发这些功能&#xff0c;以帮助跨境商城系统更好地满足市场需求。 一、代购商城的开发 代购商城是跨境商城系统中的重要功能之一&#xff0c;它…

怎么将文件批量重命名为不同名称?

怎么将文件批量重命名为不同名称&#xff1f;有许多情况下可以考虑对文件进行批量重命名为不同名称&#xff0c;文件分类和整理&#xff1a;当您需要对一组文件进行分类、整理或重新组织时&#xff0c;可以考虑将它们批量重命名为不同的名称。这有助于更好地组织文件并使其更易…

【JaveWeb教程】(22) MySQL数据库开发之多表查询:内连接、外连接、子查询 详细代码示例讲解(最全面)

目录 数据库开发-MySQL1. 多表查询1.1 概述1.1.1 数据准备1.1.2 介绍1.1.3 分类 1.2 内连接1.3 外连接1.4 子查询1.4.1 介绍1.4.2 标量子查询1.4.3 列子查询1.4.4 行子查询1.4.5 表子查询 1.5 案例 数据库开发-MySQL 1. 多表查询 1.1 概述 1.1.1 数据准备 SQL脚本&#xff…

品牌出海新篇章:DTC营销与红人矩阵的完美结合

随着全球市场的竞争日益激烈&#xff0c;品牌在出海过程中面临着前所未有的挑战。传统的销售渠道逐渐显得滞后&#xff0c;DTC模式正成为品牌开拓国际市场的新趋势。在这一趋势中&#xff0c;结合红人矩阵的DTC营销策略备受关注&#xff0c;为品牌打开了一扇通向全球市场的大门…

【笔记------freemodbus】一、stm32的裸机modbus-RTU从机移植(HAL库)

freemodbus的官方介绍和下载入口&#xff0c;官方仓库链接&#xff1a;https://github.com/cwalter-at/freemodbus modbus自己实现的话往往是有选择的支持几条指令&#xff0c;像断帧和异常处理可能是完全不处理的&#xff0c;用freemodbus实现的话要简单很多&#xff0c;可移植…