STM32——中断系统和外部中断EXTI

一、中断

1.1中断系统

中断系统是管理和执行中断的逻辑结构;

1.2中断

系统在执行主程序过程中,出现了特定的触发条件(触发源),系统停止执行当前程序,转而去执行中断程序,执行完毕后,返回至暂停的地方继续执行;

中断产生前,会对现场进行保护,中断结束后,会对现场进行恢复;

例如:串口通信时接收到一个信息,产生中断,触发DMA将数据转运走;

定时器定时中断,触发ADC测量等;

1.3中断优先级

当多个中断源同时申请中断时,CPU根据中断源的轻重缓急,优先执行优先级高的;

1.4中断嵌套

当一个中断程序正在允许时,又有新的更高优先级的中断源申请中断,CPU再次暂停执行当前中断程序,转而去执行新的中断程序,执行完毕后依次返回;

二、NVIC

2.1NVIC

在STM32中有很多可屏蔽的中断通道,使用NVIC,嵌套中断向量控制器统一管理,每一个通道有16个编程的优先级,通过对其进行分组,进一步设置抢占优先级和响应优先级;

2.2抢占优先级和响应优先级

在STM32中有16位的优先级寄存器,通过配置其中4位设置,高N位配置抢占优先级,低N-4位配置响应优先级;

抢占优先级可以执行中断嵌套;

响应优先级可以优先排队;

2.3中断向量表

中断函数执行地址是由编码器在随机分配的是不固定的;

但是由于硬件的限制,中断只能跳转到固定的位置,为了使中断可以跳转到随机的位置,定义一个地址列表,列表的地址是固定的,当产生中断时,跳转到固定地址,再有编码器和跳转到中断函数的代码,就可以实现跳转到任何的位置,这个地址列表就是中断向量表;

中断向量表排行越低,优先级越高;

产生中断后,自动执行中断函数;

三、外部中断

EXTI是众多能产生中断的外设之一;

EXTI外部中断,可以监控指定引脚的电平跳变,当引脚出现引脚跳变时,立刻向NVIC发送中断申请,经过NVIC仲裁后,CPU响应中断;

EXTI可以通过上边沿,下边沿,全边沿,软件触发(程序中执行一句代码就可以实现);

EXTI可以通过全部的GPIO通道外加RTC时钟,USB唤醒,以太网唤醒,RVD触发(从低功耗模式唤醒EXTI);

EXTI触发响应的方式:中断响应(配置NVIC优先级,CPU响应中断,触发中断函数),事件响应(触发其他外设工作);

四、EXTI工作流程图

外部信号通过GPIO输入至AFIO,AFIO选择配置外部中断引脚后,输出给EXTI,EXTI通过边沿选择和控制输出给NVIC或触发其他外设工作,NVIC配置优先级经过仲裁后,CPU响应中断;

五、AFIO

AFIO复用IO口,主要用于引脚重映射和外部中断引脚选择

AFIO内部本质是一个数据选择器,对输入的GPIO——pin引脚进行选择,作为EXTI的外部引脚输入,因为AFIO只有16个输出通道到EXTI,所以相同pin引脚只能有一个可以触发;

AFIO的结构图:

六、EXTI结构图

经过AFIO选择后的信号输入至EXTI,通过APB总线配置边沿触发选择和软件触发选择器,配置触发方式(上升沿,下降沿,全边沿,软件), 触发后进入或门(有1则为1),分为两路,一路和事件屏蔽信号组成一个与门(有0则0)组成事件响应,另一路置中断标志位并和中断屏蔽信号组成中断触发至NVIC;

使用外部中断模块的特性:想要获取的信号是外部驱动的很快的突变信号; 

七、API实现

7.1对射式红外编码器计次

7.1.1实现的功能:当红外编码器被遮挡时,触发中断,计数加1,通过OLED显示;

7.1.2思路:

底层:配置EXTI,中断函数计次计数值,读取计次;

驱动层:初始化EXTI,OLED显示;

1.RCC开始GPIO,AFIO,EXTI,NVIC时钟(EXTI和NVIC不需要开启,上电后自动开启)

2.初始化GPIO,配置为上拉输入模式,读取外部引脚信号;

3.配置AFIO选择外部中断引脚,连接GPIO->AFIO->EXTI;

4.配置EXTI选择边沿触发方式,触发方式,连接EXTI->NVIC;

5.配置NVIC对优先级进行分组,设置抢占优先级和响应优先级,连接NVIC->CPU;

6.配置中断函数,在中断函数中执行,当产生中断时候计次++;

7.使用OLED显示;

7.1.3函数分析:

void EXTI_DeInit(void);//复位EXTI
void EXTI_Init(EXTI_InitTypeDef* EXTI_InitStruct);//结构体初始化EXTI
void EXTI_StructInit(EXTI_InitTypeDef* EXTI_InitStruct);//初始化结构体
void EXTI_GenerateSWInterrupt(uint32_t EXTI_Line);//软件触发
FlagStatus EXTI_GetFlagStatus(uint32_t EXTI_Line);//程序读取中断标志位
void EXTI_ClearFlag(uint32_t EXTI_Line);//清除中断标志位
ITStatus EXTI_GetITStatus(uint32_t EXTI_Line);//中断函数里读取中断标志位
void EXTI_ClearITPendingBit(uint32_t EXTI_Line);//清除中断标志位

NVIC.H

void NVIC_PriorityGroupConfig(uint32_t NVIC_PriorityGroup);//优先级分组
void NVIC_Init(NVIC_InitTypeDef* NVIC_InitStruct);//初始化
void NVIC_SetVectorTable(uint32_t NVIC_VectTab, uint32_t Offset);//设置向量表位置和偏移量
@param NVIC_VectTab:指定向量表是在 RAM 还是闪存中。
void NVIC_SystemLPConfig(uint8_t LowPowerMode, FunctionalState NewState);//指定系统进入低功耗模式
void SysTick_CLKSourceConfig(uint32_t SysTick_CLKSource);//指定SysTick 时钟源

7.1.4实现

1.RCC开始GPIO,AFIO,EXTI,NVIC时钟(EXTI和NVIC不需要开启,上电后自动开启)

2.初始化GPIO,配置为上拉输入模式,读取外部引脚信号;

3.配置AFIO选择外部中断引脚,连接GPIO->AFIO->EXTI;

4.配置EXTI选择边沿触发方式,触发方式,连接EXTI->NVIC;

5.配置NVIC对优先级进行分组,设置抢占优先级和响应优先级,连接NVIC->CPU;

6.配置中断函数,在中断函数中执行,当产生中断时候计次++;

防止信号抖动,可以再次判断引脚电平;

7.使用OLED显示;

7.2机械触点式编码器计次 

在红外传感器基础上,额外配置一个通道即可

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

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

相关文章

HCIA学习作业五

拓扑图: PC端 PC1>ipconfig PC2>ipconfig PC3>ipconfig PC4>ipconfig PC>ping PC1>ping 192.168.1.125 PC1>ping 192.168.1.254 PC1>ping 192.168.1.253 PC2>ping 192.168.1.125 PC2>ping 192.168.1.253 PC3>ping 192.168.1.126…

java程序员怎么完善自己各个方面的能力?

java程序员怎么完善自己各个方面的能力? 在开始前我分享下我的经历,刚入行时遇到一个好公司和师父,给了我机会,两年时间从3k薪资涨到18k的, 我师父给了一些java学习方法和资料,让我不断提升自己,感谢帮助…

vue 使用 v-viewer 用于图片浏览的Vue组件,支持旋转、缩放、翻转等操作,基于viewer.js。

作者连接 npm: npm install v-viewerlegacy viewerjs main.js 引入: // 引入Viewer插件 import VueViewer, { directive as viewerDirective } from v-viewer; // 引入Viewer插件的图片预览器的样式 import viewerjs/dist/viewer.css; // 使用Viewer图片…

【C++】类与对象(二)特殊成员函数

前言 类与对象(二) 文章目录 一、特殊成员函数二、构造函数三、析构函数四、拷贝构造函数五、拷贝赋值运算符 一、特殊成员函数 如果在类的声明中未显式提供某个成员函数的定义,编译器会自动生成一个默认实现。 这包括默认构造函数、默认析构…

Android studio打包apk比较大

1.遇到的问题 在集成linphone打包时发现有118m,为什么如此之大额。用studio打开后发现都是c不同的pu架构。 2.解决办法 增加ndk配置,不选配置那么多的cpu结构,根据自己需要调整。 defaultConfig { applicationId "com.matt.linphoneca…

备战蓝桥杯---数据结构与STL应用(基础3)

今天我们主要介绍的是pair,string,set,map pair:我们可以把它当作一个结构体&#xff1a; void solve(){pair<int int> a;//创建amake_pair(1,2);//添加元素cout<<a.first<<endl<<a.second<<endl;}//输出 当然&#xff0c;它也可以嵌套&#…

python笔记10

1、继承 继承是面向对象编程中的一个重要概念&#xff0c;它允许一个类&#xff08;子类&#xff09;继承另一个类&#xff08;父类&#xff09;的属性和方法。通过继承&#xff0c;子类可以重用父类的代码&#xff0c;并且有机会添加新的属性和方法&#xff0c;或者重写父类的…

使用PowerBI 基于Adventure Works案例分析

Adventure Works案例分析 前言 数据时代来临&#xff0c;但一个人要顺应时代的发展是真理。 数据分析的核心要素 那数分到底是什么&#xff1f; 显然DT 并不等同于 IT&#xff0c;我们需要的不仅仅是更快的服务器、更多的数据、更好用的工具。这些都是重要的组成部分&…

堆宝塔

L2-1 堆宝塔 分数 25 作者 陈越 单位 浙江大学 堆宝塔游戏是让小朋友根据抓到的彩虹圈的直径大小&#xff0c;按照从大到小的顺序堆起宝塔。但彩虹圈不一定是按照直径的大小顺序抓到的。聪明…

AI特训一:为什么要学习AI

我们先了解什么是AI AI&#xff08;人工智能&#xff09;是指计算机系统经过学习和推理能够模拟人类智能行为的一种技术。AI利用机器学习、深度学习、自然语言处理等技术&#xff0c;能够分析大量的数据、识别模式、做出决策和预测 AI有哪些强大之处 处理大量数据&#xff1a…

专栏:数据库、中间件的监控一网打尽

前言 对于数据库、中间件的监控&#xff0c;目前社区里最为完善的就是 Prometheus 生态的各个 Exporter&#xff0c;不过这些 Exporter 比较分散&#xff0c;不好管理&#xff0c;如果有很多目标实例需要监控&#xff0c;就要部署很多个 Exporter&#xff0c;要是能有一个大一…

蓝桥杯嵌入式——测量两路PWM频率和占空比

原理&#xff1a;在通道1&#xff0c;TIM_CH1上会输入PWM波&#xff0c;在每个上升沿来的时候会发生三个动作&#xff0c;第一个动作会触发一个中断&#xff0c;第二个动作会把CNT计数值捕获&#xff0c;第三个动作会把CNT的值清0&#xff0c; 要测量占空比则需要打开TI1FP2&a…

经济学基础入门,从《小岛经济学》看经济的演变

一直在学习怎么赚钱&#xff0c;没有专业的人指导。于是就想着先学习一下经济学相关的知识吧&#xff01;无意间看到大家推荐的这本书籍&#xff0c;一本很适合经济学入门的经济《小岛经济学》&#xff0c;这本书以故事的方式&#xff0c;讲解了经济演变过程。而且大约只需要2到…

对嵌入式系统、GCC、的理解

1、嵌入式系统通用硬件组成 2、Linux系统的嵌入式的开发流程 3、Linux系统的嵌入式的结构 4、文件IO和标准IO&#xff1f; 5、为什么需要交叉编译 1、嵌入式系统硬件的限制&#xff08;CPU处理能力不如电脑、存储空间小、网络带宽小不利于传输、安全性不如电脑、能耗问题&…

【计算机网络】——TCP协议

&#x1f4d1;前言 本文主要是【计算机网络】——传输层TCP协议的文章&#xff0c;如果有什么需要改进的地方还请大佬指出⛺️ &#x1f3ac;作者简介&#xff1a;大家好&#xff0c;我是青衿&#x1f947; ☁️博客首页&#xff1a;CSDN主页放风讲故事 &#x1f304;每日一句…

【学网攻】 第(16)节 -- 扩展ACL访问控制列表

系列文章目录 目录 系列文章目录 文章目录 前言 一、ACL(访问控制列表)是什么 ? 二、实验 1.引入 实验目标 实验步骤 实验设备 实验拓扑图 实验配置 配置ACL访问控制 实验验证 总结 文章目录 【学网攻】 第(1)节 -- 认识网络【学网攻】 第(2)节 -- 交换机认识…

2024 年, Web 前端开发趋势

希腊哲学家赫拉克利特认为&#xff0c;变化是生命中唯一不变的东西。这句话适用于我们的个人生活、行业和职业领域。 尤其是前端开发领域&#xff0c;新技术、开发趋势、库和框架不断涌现&#xff0c;变化并不陌生。最近发生的一些事件正在改变开发人员构建网站和 Web 应用的方…

Python机器学习--简单清晰的说说K近邻算法的基本原理

K近邻算法的基本原理&#xff1a;首先通过所有的特征变量构筑起一个特征空间&#xff0c;特征空间的维数就是特征变量的个数&#xff0c;然后针对某个测试样本&#xff0c;按照参数K在特征空间内寻找与它最为近邻的K个训练样本观测值&#xff0c;最后依据这K个训练样本的响应变…

快速理解MoE模型

最近由于一些开源MoE模型的出现&#xff0c;带火了开源社区&#xff0c;为何&#xff1f;因为它开源了最有名气的GPT4的模型结构&#xff08;OPEN AI&#xff09;&#xff0c;GPT4为何那么强大呢&#xff1f;看看MoE模型的你就知道了。 MoE模型结构&#xff1a; 图中&#xff0…

Netty-ChannelHandle的业务处理

ChannelHandle结构 ChannelHandler基础接口 基础接口里面定义的基础通用方法。增加handler&#xff0c;移除handler&#xff0c;异常处理。 ChannelInboundHandler public interface ChannelInboundHandler extends ChannelHandler {/*** The {link Channel} of the {link Ch…