中断方式的数据接收

中断接收简介

回顾之前的代码在这里插入图片描述
之前的代码是 等待标志位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的时钟//初始化PB6GPIO_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);//初始化PB7GPIOInitStruct.GPIO_Pin = GPIO_Pin_7;GPIOInitStruct.GPIO_Mode = GPIO_Mode_IPU;GPIO_Init(GPIOB,&GPIOInitStruct);//初始化PC13RCC_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|RxUSART_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.hqwc.cn/news/213650.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

毛里塔尼亚市场开发攻略,收藏一篇就够了

毛里塔尼亚是非洲西北部的一个国家,也是中国长期援建的一个国家,也是一带一路上的国家。毛里塔尼亚生产生活资料依赖进口,长期依赖跟我们国家的贸易关系也是比较紧密的,今天就来给大家介绍一下毛里塔尼亚的市场开发公路。文章略长…

188. 股票买卖问题(交易次数为任意正整数)

题目 题解 class Solution:def maxProfit(self, k: int, prices: List[int]) -> int:N len(prices)# 定义状态:dp[i][j][k]表示在第i天,有j次交易机会,持有或不持有的最大利润dp [[[0 for i in range(2)] for j in range(k1)] for m in range(N)]f…

2023 hnust 湖南科技大学 信息安全管理课程 期中考试 复习资料

前言 ※老师没画重点的补充内容★往年试卷中多次出现或老师提过的,很可能考该笔记是奔着及格线去的,不是奔着90由于没有听过课,部分知识点不一定全,答案不一定完全正确 题型 试卷有很多题是原题 判断题(PPT&#xff…

2023.11.23使用flask实现在指定路径生成文件夹操作

2023.11.23使用flask实现在指定路径生成文件夹操作 程序比较简单,实现功能: 1、前端输入文件夹 2、后端在指定路径生成文件夹 3、前端反馈文件夹生成状态 main.py from flask import Flask, request, render_template import osapp Flask(__name__)a…

下一代ETL工具:微服务架构的全新数据集成平台

当前对于大型企业来说数据的整合和加工变得越来越重要。随着业务需求的不断增长,企业数据量越来越大,数据管道越来越多,现有的ETL(抽取、转换、加载)工具已不再满足实时、高性能和微服务架构等现代化需求。因此&#x…

Android开发从0开始(Activity篇)

Activity的生命周期 对应解释: startActivity(new Intent(源页面.this,目标页面.class)) 结束当前活动页面finish(); Activity的启动模式 App先后打开两个活动,此时活动会放入栈内。 (Android:launchMode”standard”)默认 &am…

2023年亚太杯数学建模A题——深度学习苹果图像识别(思路+模型+代码+成品)

Image Recognition for Fruit-Picking Robots 水果采摘机器人的图像识别功能 问题 1:计数苹果 根据附件 1 中提供的可收获苹果的图像数据集,提取图像特征,建立数学模型,计算每幅图像中的苹果数量,并绘制附件 1 中所有…

【云备份】第三方库的认识与使用

文章目录 json库粗略认识详细认识writer 类reader类jsoncpp序列化实现jsoncpp反序列化实现 bundle文件压缩库简单认识bundle库实现文件压缩bundle库实现文件解压缩 httplib库Request类Response类Server类Client类 json库 粗略认识 json是一种数据交换格式,采用完全…

干货科普 | 不同类型的机器人及其在工作中的应用

原创 | 文 BFT机器人 制造商在其操作中使用各种类型的机器人,每种机器人都具有特定的能力和功能。我们将讨论制造业中使用的一些最常见类型的机器人,以及哪种机器人可能最适合您的应用。 01 关节机器人 关节式机器人是一种工业机器人,具有一…

2023 全球CSO网络安全峰会(中国站)圆满落幕,探讨新形势下的数据安全保护!

2023年11月23日 北京 IDC数据显示,到2027年,全球数据安全市场投资预测将接近212.2亿美元;其中,中国市场规模预期为32.4亿美元,五年复合增长率将达到24.4%,远高于全球平均水平。此外,网络安全领…

技术前沿探索:人工智能与大数据融合的未来

技术前沿探索:人工智能与大数据融合的未来 摘要:本博客将探讨人工智能与大数据融合领域的最新技术趋势、前沿研究方向以及挑战与机遇。通过介绍相关技术和案例,我们希望激发读者对这一领域的兴趣,并为其职业发展提供有益参考。 一…

YaRN方法:无需微调,高效扩展语言模型上下文窗口/蚂蚁集团与浙大发布原生安全框架v1.0,引领企业网络安全新时代 |魔法半周报

我有魔法✨为你劈开信息大海❗ 高效获取AIGC的热门事件🔥,更新AIGC的最新动态,生成相应的魔法简报,节省阅读时间👻 🔥资讯预览 YaRN方法:无需微调,高效扩展语言模型上下文窗口 蚂蚁…