中断方式的数据接收

news2024/12/25 0:25:37

中断接收简介

回顾之前的代码在这里插入图片描述
之前的代码是 等待标志位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);
			
			}
			
		}

}

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

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

相关文章

Linux实验四:shell程序设计: shell控制语句

实验目的 进一步巩固shell程序设计语言基本语法,加深对所学知识理解。 实验内容 要求学生掌握以下内容 (1)条件表达式 (2)判断和分支语句 (3)循环语句 (4)函数 实验内容 1 条件表达式 $ test 10 -gt 5 // 算数表达式 10>5 $ echo $? //显示上述表达…

〔004〕虚幻 UE5 像素流部署

✨ 目录 ▷ 启用像素流插件▷ 打包项目▷ 下载环境包▷ 手动下载▷ 安装信令服务器环境▷ 启动信令服务器▷ 设置启动参数▷ 启动程序▷ 网页运行▷ 开启触控界面▷ 启用像素流插件 打开虚幻启动程序,选择 编辑 后点击 插件在插件列表中搜索 pixel streaming 关键字,勾选后重…

杨传辉:从一体化架构,到一体化产品,为关键业务负载打造一体化数据库

在刚刚结束的年度发布会上,OceanBase正式推出一体化数据库的首个长期支持版本 4.2.1 LTS,这是面向 OLTP 核心场景的全功能里程碑版本,相比上一个 3.2.4 LTS 版本,新版本能力全面提升,适应场景更加丰富,有更…

北邮22级信通院数电:Verilog-FPGA(11)第十一周实验(2)设计一个24秒倒计时器

北邮22信通一枚~ 跟随课程进度更新北邮信通院数字系统设计的笔记、代码和文章 持续关注作者 迎接数电实验学习~ 获取更多文章,请访问专栏: 北邮22级信通院数电实验_青山如墨雨如画的博客-CSDN博客 目录 一.代码部分 1.1 counter_24.v 1.2 divid…

【Flink】Standalone运行模式

独立模式是独立运行的,不依赖任何外部的资源管理平台;当然独立也是有代价的:如果资源不足,或者出现故障,没有自动扩展或重分配资源的保证,必须手动处理。所以独立模式一般只用在开发测试或作业非常少的场景…

Spring Boot集成MyBatis实现多数据源访问的“秘密”

文章目录 为什么需要多数据源?Spring Boot集成MyBatis的基础配置使用多数据源小结 🎉Spring Boot集成MyBatis实现多数据源访问的“秘密” ☆* o(≧▽≦)o *☆嗨~我是IT陈寒🍹✨博客主页:IT陈寒的博客🎈该系列文章专栏&…

TIDB拓扑结构

TiDB Server:SQL层,负责接受客户端的连接,执行SQL解析和优化,最终生成分布式执行计划。TiDB Server为无状态的,可增加节点负载均衡。 PD (Placement Driver) Server:整个TiDB集群的元信息管理模块&#xf…

在全球碳市场中崭露头角的中碳CCNG

在全球气候治理的大背景下,中国碳中和发展集团有限公司(简称中国碳中和)正在成为全球碳交易市场的一个重要参与者。随着国际社会对碳排放的日益关注,中国碳中和凭借其在碳资产开发、咨询与管理等领域的深厚积累,正成为…

010 OpenCV中的4种平滑滤波

目录 一、环境 二、平滑滤波 2.1、均值滤波 2.2、高斯滤波 2.3、中值滤波 2.4、双边滤波 三、完整代码 一、环境 本文使用环境为: Windows10Python 3.9.17opencv-python 4.8.0.74 二、平滑滤波 2.1、均值滤波 在OpenCV库中,blur函数是一种简…

vue3 echarts滑动条datazoom怎么设置圆角

效果图 代码 dataZoom: [// {// type: "slider",// show: val.Ydata.length > 8 ? true : false, //隐藏或显示(true)组件// backgroundColor: "#1c3030", // 组件的背景颜色。// fillerColor: "#74adb2", // 选…

小叶子钢琴智能陪练 助力打牢钢琴基础

孩子在练琴过程中,经常会出现错音错节奏,为了能够帮助她更高效的练琴,最近开始使用智能钢琴陪练工具——小叶子钢琴智能陪练。 身边也有很多朋友在用这款应用,它比较知名的功能就是三大练琴模式,也就是识谱模式、提升…

Java Web 实战 21 - 用 Servlet 实现一个Hello World

用 Servlet 来写一个 Hello World~ 一 . 基本部署方式1.1 创建 Servlet 项目1.2 引入依赖1.3 创建目录1.4 编写代码继承 HttpServlet重写 doGet 方法删除 super 方法加上 WebServlet 注解写业务逻辑 1.5 打包1.6 部署1.7 验证1.8 小结 二 . 更方便的部署方式2.1 Smart Tomcat 的…

详解开源数据库审计平台Yearning

基本概念 数据库审计(简称DBAudit)能够实时记录网络上的数据库活动,对数据库操作进行细粒度审计的合规性管理,对数据库遭受到的风险行为进行告警,对攻击行为进行阻断。它通过对用户访问数据库行为的记录、分析和汇报&…

python树的双亲存储结构

这种存储结构是一种顺序存储结构,采用元素形如“[结点值,双亲结点索引]”的列表表示。通常每个结点有唯一的索引(或者伪地址),根结点的索引为0,它没有双亲结点,其双亲结点的索引为-1。例如,所示的树对应的双…

项目中常用的 19 条 SQL 优化宝典

一、EXPLAIN 做MySQL优化,我们要善用 EXPLAIN 查看SQL执行计划。 下面来个简单的示例,标注(1,2,3,4,5)我们要重点关注的数据 type列,连接类型。一个好的sql语句至少要达到range级别。杜绝出现all级别 key列,使用到的索引名。如果没有选择索引,值是NULL。可以采取强制索引…

Cobalt Strike之反向上线操作

前言 ​ Cobalt Strike 使用 GUI 框架 SWING(一种java GUI的库)开发,攻击者可通过CS木马在 beacon 元数据中注入恶意 HTML 标签,使得Cobalt Strike对其进行解析并且加载恶意代码(类似XSS攻击),…

【Proteus仿真】【51单片机】智能垃圾桶设计

文章目录 一、功能简介二、软件设计三、实验现象联系作者 一、功能简介 本项目使用Proteus8仿真51单片机控制器,使用报警模块、LCD1602液晶模块、按键模块、人体红外传感器、HCSR04超声波、有害气体传感器、SG90舵机等。 主要功能: 系统运行后&#xf…

【LeetCode刷题笔记】DFSBFS(三)

图的基础知识 邻接矩阵是一个二维表,其中横纵坐标交叉的格子值为 1 的表示这两个顶点是连通的,否则是不连通的。

BUUCTF [ACTF新生赛2020]outguess 1

BUUCTF:https://buuoj.cn/challenges 题目描述: 得到的 flag 请包上 flag{} 提交。 密文: 下载附件,得到一堆文件。 解题思路: 1、根据题目和flag.txt文件提示,猜测为outguess隐写。 outguess下载安装 kail 终端命…

竞赛YOLOv7 目标检测网络解读

文章目录 0 前言1 yolov7的整体结构2 关键点 - backbone关键点 - head3 训练4 使用效果5 最后 0 前言 世界变化太快,YOLOv6还没用熟YOLOv7就来了,如果有同学的毕设项目想用上最新的技术,不妨看看学长的这篇文章,学长带大家简单的…