中断方式的数据接收

中断接收简介

回顾之前的代码在这里插入图片描述
之前的代码是 等待标志位RXNE位为1才有数据 进而读取数据存放在变量c中 再根据c变量的数据是为0还是为1进而编写灯亮灭的代码 if语句
但这样的代码明显不符合裸机多任务的编程模型 因为在while中为进程 进程执行的时间不能大于5ms 但是while(RXNE==0)这条语句的执行时间是由发送数据的一方决定的 当发送方1s后发送数据 这条语句就执行1s 完全超出了裸机多任务模型的时间
右边的代码则是使用了中断 数据通过RX引脚进入 当状态寄存器SR 的RXNE标志位由0变为1就通过USART1触发一次中断 传递到NVIC进而执行中断函数

配置中断源

产生电平型的中断源
在这里插入图片描述
USART产生的是电平型的中断 当标志位由0变为1就产生中断 在SR状态寄存器中 每一个标志位都可以触发中断 都可以触发7个电平型的中断源
中断共用
在这里插入图片描述
这七个标志位共用一个中断源(节省中断源) 在stm32中NVIC是管理中断源的 当这七个标志位当中只要有一个为1通过这个或门就会触发中断源 传递到NVIC中 那如果产生了中断 那到底是那个标志位为1触发了中断呢? 我们去查询sr寄存器即可 if 语句判断到底是那个标志位触发了中断 (可能是一个 也可能是多个)
中断屏蔽
在这里插入图片描述
中断传输到NVIC过程中有一个开关 闭合就能通过中断 打开就屏蔽了中断信号 那我们如何实现屏蔽一个标志位产生的中断呢? 就是左下角的结构 将中断标志位和中断使能位通过一个与门相互连接 当中断使能位为0不管中断标志位为1还是为0都无法通过或门触发中断源 当中断使能位为1就等于闭合了开关 中断标志位即可正常工作 注意中断标志位FE NE ORE都是共用了一个中断使能位eie 当中断使能位eie为0就屏蔽了这三个中断标志位的中断触发请求 其他的中断标志位都是各自有一个独立的中断使能位
编程接口
在这里插入图片描述
第一个编程接口(函数)就是通过配置蓝色的中断使能寄存器来屏蔽 使能中断的 第二个接口就是查询状态寄存器的标志位 第三个接口是清除标志位 当触发了中断 如PE标志位触发了中断就为1 然后需要调用这个函数来手动清零
USART_ITConfig
在这里插入图片描述
USART_GetITStatus
在这里插入图片描述
USART_ClearITPendingBit在这里插入图片描述

中断接收数据的编程思路

数据处理能够瞬间完成
在这里插入图片描述
套用裸机多任务的模型 就是初始化 然后进程函数 再到中断服务函数 但是中断函数中处理数据的速度要大于数据接收的速度(不然等到下一个数据发送过来还在处理上一个数据会造成数据的丢失和出错) 那小于10us就看作瞬间完成 那么这里对数据的处理就是判断if语句还有向对应的gpio模块的ODR寄存器写入对应的0或1 远远小于10us 视为瞬间完成 符合裸机多任务模型的时间需求
在这里插入图片描述
如第一幅图 处理数据的时间远远小于数据传来的时间(箭头代表数据传输进来) 在两个数据传输中数据已经处理完成
第二幅图当箭头传入 (数据传入) 当第一个箭头(第一个数据)传入开始处理数据 第二个箭头(代表第二个数据传入)传入后还在处理第一个数据接着第三个数据传入 导致了第二个数据的重载 (丢失了第二个数据) 导致数据传输的错误
但是数据处理的时间确实太长了怎么办?
在这里插入图片描述
那我们就不在中断服务函数中处理 就把数据传到缓存区在传入进程函数中延时处理

改进串口编程实验

因为 这次数据处理的时间很短就只是个点灯 所以可以放在中断服务函数中执行

usart初始化

在这里插入图片描述
编写中断响应函数
在这里插入图片描述
清除中断的操作可以为第二步和第三步 因为标志位RXNE为1表示有数据接收
当读取了数据RXNE标志位就会由1变为0 所以第三步读取数据也相当于清除了中断

#include "stm32f10x.h"
#include "stm32f10x_pal.h"

static  void USART_Recv_Init(void);


int main(void)
{
	NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//NVIC的中断优先级分组
	
	PAL_Init();
	USART_Recv_Init();
	
	while(1)
	{
	}
}



static  void USART_Recv_Init(void)
{
	//1.初始化IO引脚
	//PB6 Tx PB7  Rx (经过了AFIO映射映射到了PB6和PB7引脚)
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);//开启GPIOB的时钟
	//初始化PB6
	GPIO_InitTypeDef GPIOInitStruct;
	GPIOInitStruct.GPIO_Pin = GPIO_Pin_6;
	GPIOInitStruct.GPIO_Mode =  GPIO_Mode_AF_PP;//PIN6为复用推挽模式
	GPIOInitStruct.GPIO_Speed = GPIO_Speed_10MHz;
	
	GPIO_Init(GPIOB,&GPIOInitStruct);
	
	//初始化PB7
	GPIOInitStruct.GPIO_Pin = GPIO_Pin_7;
	GPIOInitStruct.GPIO_Mode = GPIO_Mode_IPU;
	GPIO_Init(GPIOB,&GPIOInitStruct);

	
	//初始化PC13
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC,ENABLE);//开启GPIOC的时钟
	GPIOInitStruct.GPIO_Pin = GPIO_Pin_13 ;
	GPIOInitStruct.GPIO_Mode = GPIO_Mode_Out_OD;
	GPIOInitStruct.GPIO_Speed = GPIO_Speed_2MHz;
	GPIO_Init(GPIOC,&GPIOInitStruct);
	//复用功能重映射
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);
	GPIO_PinRemapConfig(GPIO_Remap_USART1 ,ENABLE);
	
	//使能USART1的时钟
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1,ENABLE);
	
	//配置USART的参数
	//9600 8为数据有效位 无奇偶校验 1停止位为1位  Tx|Rx
	USART_InitTypeDef USART1InitStruct;
	USART1InitStruct.USART_BaudRate = 9600;
	USART1InitStruct.USART_WordLength = USART_WordLength_8b ;
	USART1InitStruct.USART_StopBits = USART_StopBits_1;
	USART1InitStruct.USART_Parity = USART_Parity_No;
	USART1InitStruct.USART_Mode = USART_Mode_Rx|USART_Mode_Tx;
	USART1InitStruct.USART_HardwareFlowControl = USART_HardwareFlowControl_None ;//硬件流控
	USART_Init(USART1,&USART1InitStruct);
	
	//配置中断源
	USART_ITConfig(USART1,USART_IT_RXNE,ENABLE);//标志位RXNE的使能
	
	//NVIC的参数设置
	NVIC_InitTypeDef NVICInitStruct;
	NVICInitStruct.NVIC_IRQChannel = USART1_IRQn;
	NVICInitStruct.NVIC_IRQChannelPreemptionPriority = 0;//抢占优先级
	NVICInitStruct.NVIC_IRQChannelSubPriority =0;//子优先级
	NVICInitStruct.NVIC_IRQChannelCmd = ENABLE;
	NVIC_Init(&NVICInitStruct);
	
	
	//闭合总开关
	USART_Cmd(USART1,ENABLE);
}



void USART1_IRQHandler(void)
{
		uint8_t c;
		if(USART_GetITStatus(USART1,USART_IT_RXNE) == SET)
		{
				c = USART_ReceiveData(USART1); //清除了中断也读取了数据
			if(c == '0')
			{
					GPIO_WriteBit(GPIOC,GPIO_Pin_13,Bit_SET);
			}
			
			if(c == '1')
			{
				GPIO_WriteBit(GPIOC,GPIO_Pin_13,Bit_RESET);
			
			}
			
		}

}

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

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

相关文章

pcie-2-rj45速度优化

背景: 目前用iperf3打流传输速率达不到要求,千兆实际要求跑到800M以上: 优化方案: 1.优化defconfig: 首先编译user版本验证看是否正常 debug版本关闭CONFIG_SLUB_DEBUG_ON宏控。 2.找FAE ,通过更换驱动,或者更新驱动来优化 3.绑定大核: 以8125网卡为例,udp…

企业数字化转型的作用是什么?_光点科技

在当今快速变化的商业环境中,数字化转型已成为企业发展的重要策略。企业数字化转型指的是利用数字技术改造传统业务模式和管理方式,以提升效率、增强竞争力和创造新的增长机会。 提升运营效率:数字化转型通过引入自动化工具和智能系统&#x…

【数据结构】树如何定义 | 如何存储 | 实际应用

前言 如上图,A中的孩子的个数是不固定的。我们无法精确的每个不同的根结点有多少个孩子。所以并不能精确知道需要定义多少个孩子节点。 struct TreeNode {int val;struct TreeNode* child1;struct TreeNode* child2;struct TreeNode* child3;//...//这样显然是不能…

AnalyticDB for PostgreSQL 实时数据仓库上手指南

AnalyticDB for PostgreSQL 实时数据仓库上手指南 2019-04-016601 版权 本文涉及的产品 云原生数据仓库 ADB PostgreSQL,4核16G 50GB 1个月 推荐场景: 构建的企业专属Chatbot 立即试用 简介: AnalyticDB for PostgreSQL 提供企业级数…

mysql 行转列 GROUP_CONCAT 试验

1.概要 很多时候需要用到行专列的方式做数据分析。比如对通讯数据的采集 数据采集结果如下: 变量值采集周期131251132272 我想要看的结果 变量1变量2采集周期351372 就是我想看到相关数据的周期变化情况。 2.试验 2.1创建数据如下(表名 tb5&…

CentOS虚拟机重置账号密码

虚拟机忘记密码了 一般来说,虚拟机的账号密码,工作中都会有文档记录,如果忘记了可以查看文档。但是也有特例,虚拟机的密码没有记录到文档中,尝试了很多次依然登录失败,这时候就只能重置账号密码了。 1.重…

使用vcpkg安装库失败的解决方法

1、前言 vcpk是是一款开源的c/c库管理工具,尤其是在windows平台,可以帮助我们很好的管理各种依赖包。 在windows环境做c/c开发的人应该都深有体会,有时候编译需要下载一堆依赖库,导致搭建编译环境特别麻烦。但是,通过v…

【黑马甄选离线数仓day02_数据采集】

1. 数仓工具使用-DataX 1.1 DataX介绍 ​ DataX 是阿里推出的一个异构数据源离线同步工具,致力于实现包括关系型数据库(MySQL、Oracle等)、HDFS、Hive、ODPS、HBase、FTP等各种异构数据源之间稳定高效的数据同步功能。 ​ 将DataX安装好之后, 仅需要配置Json的采…

STM32 中断系统

单片机学习 目录 文章目录 前言 一、中断系统 1.1 什么是中断 1.2 中断优先级 1.3 中断嵌套 1.4 C语言中的中断程序 二、STM32的中断通道和中断向量 2.1 中断通道 2.2 嵌套向量中断控制器NVIC 2.2.1 什么是NVIC 2.2.2 NVIC基本结构 2.2.3抢占优先级和响应优先级 2.2.4 NVIC的优…

【OJ比赛日历】快周末了,不来一场比赛吗? #11.25-12.01 #17场

CompHub[1] 实时聚合多平台的数据类(Kaggle、天池…)和OJ类(Leetcode、牛客…)比赛。本账号会推送最新的比赛消息,欢迎关注! 以下信息仅供参考,以比赛官网为准 目录 2023-11-25(周六) #9场比赛2023-11-26…

分布式链路追踪入门篇-基础原理与快速应用

为什么需要链路追踪? 我们程序员在日常工作中,最常做事情之一就是修bug了。如果程序只是运行在单机上,我们最常用的方式就是在程序上打日志,然后程序运行的过程中将日志输出到文件上,然后我们根据日志去推断程序是哪一…

Selenium介绍及基本使用方法

Selenium是一个开源、免费、简单、灵活,对Web浏览器支持良好的自动化测试工具,在UI自动化、爬虫等场景下是十分实用的,能够熟练掌握并使用Selenium工具可以大大的提高效率。 Selenium简介 Selenium支持多平台、多浏览器、多语言去实现自动化…

为销售赋能:利用 Splashtop 增强远程培训技术

远程销售团队这一概念在当今快节奏的商业环境中日益普遍。各公司正在计划在不同地点灵活开展销售业务,希望利用技术优势缩小地域差距。但是,这种向远程销售的转型面临着重大挑战,尤其在培训和发展领域。培训远程销售团队需要采用创新方法&…

Kafka 控制器(controller)

Kafka 控制器(controller) 在kafka集群中 会存在一个或者多个broker(一个服务器就是一个broker),其中有一个broker会被选举为控制器 kafka controller ,负责管理整个集群中所有副本、分区的状态&#xff0…

5.1 PBR基础 BRDF介绍

基于物理的渲染(Physically Based Rendering,PBR)是指使用基于物理原理和微平面理论建模的着色/光照模型,以及使用从现实中测量的表面参数来准确表示真实世界材质的渲染理念。 一、反射率方程 理论基础放在参考链接里。 直接开始…

什么是steam搬砖中的散户、倒爷和倒狗?三者有什么区别?

csgo倒狗们是如何操盘csgo饰品市场的? 什么是游戏搬砖中的散户、倒爷和倒狗?三者有什么区别? csgo饰品市场有三种人:散户,倒爷和倒狗。 散户:定义和股票市场中的定义是一样的,拥有同类型饰品数…

STM32入门笔记15_PWR电源管理模块

PWR和低功耗模式 PWR简介 PWR(Power Control) 电源控制PWR负责管理STM32内部的电源供电部分,可以实现可编程电压检测器和低功耗模式的功能可编程电压检测器(PVD) 可以监控VDD电源电压,当VDD下降到PVD阈值以下或上升到PVD阈值之上时,PVD会触…

ESP32测试DHT11温湿度

ESP32测试DHT11温湿度 arduino导入dht库 2.arduion里 DHT11 代码 #include <DHT.h> #define DHTPIN 4 //修改数据引脚 #define DHTTYPE DHT11 DHT dht(DHTPIN, DHTTYPE); void setup() {Serial.begin(9600);dht.begin(); }void loop() { float h dht.readHum…

使用Git bash切换Gitee、GitHub多个Git账号

Git是分布式代码管理工具&#xff0c;使用命令行的方式提交commit、revert回滚代码。这里介绍使用Git bash软件来切换Gitee、GitHub账号。     假设在gitee.com上的邮箱是alicefoxmail.com 、用户名为alice&#xff1b;在github上的邮箱是bobfoxmail.com、用户名为bob。 账号…

iframe内部子页面与外部主页面通讯

文章目录 一、问题二、解决2.1、子页面2.2、主页面 三、知识点3.1、[浏览器兼容性](https://developer.mozilla.org/zh-CN/docs/Web/API/Window/postMessage#%E6%B5%8F%E8%A7%88%E5%99%A8%E5%85%BC%E5%AE%B9%E6%80%A7)3.2、详解3.2.1、发送方3.2.2、接收方 一、问题 如上所示&a…