[STM32] EXTI 外部中断 (三)

文章目录

      • 1.中断
        • 1.1 中断系统
        • 1.2 中断流程
      • 2.STM32 中断
        • 2.1 EXTI(外部中断)
        • 2.2 EXTI 的基本结构
        • 2.3 AFIO 复用IO口
        • 2.4 EXTI 的框图
      • 3.NVIC 基本结构
        • 3.1 NVIC 优先级分组
      • 4.配置 EXTI
        • 4.1 AFIO 库函数
        • 4.2 EXTI 库函数
        • 4.3 NVIC 库函数
        • 4.4 配置EXTI 的步骤
        • 4.5 初始化EXTI

1.中断

1.1 中断系统
  1. 中断:在主程序运行过程中,出现了特定的中断触发条件(中断源),使得CPU暂停当前正在运行的程序,转而去处理中断程序,处理完成后又返回原来被暂停的位置继续运行。
  2. 中断优先级:当有多个中断源同时申请中断时,CPU会根据中断源的轻重缓急进行裁决,优先响应更加紧急的中断源。
  3. 中断嵌套:当一个中断程序正在运行时,又有新的更高优先级的中断源申请中断,CPU再次暂停当前中断程序,转而去处理新的中断程序,处理完成后依次进行返回。
1.2 中断流程

在这里插入图片描述

  • 在主程序中,当他执行到某个地方时,这时无论主程序在干什么事情,只要满足了外设的中断条件,主程序都立即暂停,程序由硬件电路自动跳转到中断程序中。当中断程序执行完后,程序在返回被暂停的地方继续运行。
  • 右边就是中断嵌套的执行流程,当其中一个中断正在执行时,又有新的优先级更高的中断来,那么就会再次打断中断,然后执行新的中断;新的中断结束,再继续原来的中断,原来的中断结束,再继续主程序,这就是中断嵌套。

在这里插入图片描述

2.STM32 中断

  1. 68个可屏蔽中断通道,包含EXTI、TIM、ADC、 USART、SPI、I2C、 RTC实时时钟等多个外设。
  2. 使用NVIC统一管理中断,每个中断通道都拥有16个可编程的优先等级,可对优先级进行分组,进一步设置抢占优先级和响应优先级。
2.1 EXTI(外部中断)
  • EXTI可以监测指定GPIO口的电平信号,当其指定的GPIO口产生电平变化时,EXTI将立即向NVIC发出中断申请,经过NVIC裁决后即可中断CPU主程序,使CPU执行EXTI对应的中断程序。
  • 支持的触发方式:上升沿/下降沿/双边沿/软件触发
  • 支持的GPIO口:所有GPIO口,但相同的Pin不能同时触发中断(意思是PA0和PB0不能同时使用,或者PA1、PB1、PC1等这样的)。
  • 通道数:16个GPIO_Pin,外加PVD输出、RTC闹钟、USB唤醒、以太网唤醒。
  • 触发响应方式:中断响应/事件响应。
2.2 EXTI 的基本结构

在这里插入图片描述

  1. 最左边是GPIO口的外设,比如GPIOA、GPIOB、GPIOC等等,每个GPIO外设有16个引脚,所以进来16根线。

  2. EXTI模块只有16个GPIO的通道,但每个GPIO外设都有16个引脚,如果每个引脚都占用一个通道,那么EXTI的通道就不够用了,因此在这里就会有一个AFIO中断引脚选择的电路模块。

  3. 这个AFIO就是一个数据选择器,他可以在前面的3个GPIO外设的16个引脚中选择其中一个连接到后面EXTI的通道里,所以印证了前面我们所说的相同的Pin不能同时出发中断

  4. 通过AFIO选择之后的16个通道,就接到了EXTI边沿检测及控制电路上,同时下面还接入了4个外设;这些加起来就组成了EXTI的20个输入信号。

  5. 经过EXTI电路之后,分为了两种输出。上面部分接NVIC,用来触发中断;下面部分有20条输出线路接到了其他外设,用来触发其他外设中断,也就是事件响应。

  6. 输出分为两种, 触发中断和事件响应。

2.3 AFIO 复用IO口

AFIO主要用于引脚复用功能的选择和重定义。
在STM32中,AFIO主要完成两个任务:复用功能引脚重映射、中断引脚选择。

在这里插入图片描述

2.4 EXTI 的框图

在这里插入图片描述

  1. 先是右边的输入线20根, 然后进入边沿检查电路, EXTI 可以上升沿或者下降沿触发或者是两个都触发, 然后信号进入或门。
  2. 硬件中断和软件中断接入进或门, 有一个1的话则输出1。所以支持的触发方式还有软件触发的方式。
  3. 上面是触发中断的, 下面是触发事件的。触发中断的话会置一个挂起寄存器, 就是相当于一个中断标志位, 如果置1的话, 会和中断屏蔽寄存器进入与门, 两个都是1的话才会触发中断。
  4. 下面的需要和事件屏蔽寄存器进入与门, 两个都是1的话才触发事件。
  5. 1 & x == x, 0 & x == 0, 与门为一个开关控制。
  6. 上面的是APB总线, 通过总线访问这些寄存器。

3.NVIC 基本结构

在这里插入图片描述

  1. NVIC是用来统一分配中断优先级和管理中断的。NVIC是一个内核外设,是CPU的助手;他有很多输入口,中断线路都可以接过去;线上画了斜杠,上面写了n,意思是一个外设可能同时占用多个通道,因此这里有n条线。
  2. NVIC只有一个出口,NVIC根据每个中断的优先级分配中断的先后顺序,之后通过右边的输出口告诉CPU应该处理哪个中断。
3.1 NVIC 优先级分组

STM32的NVIC可以对优先级进行分组,分为抢占优先级和响应优先级。

  1. NVIC的中断优先级由优先级寄存器的4位(0~15)决定(值越小,优先级越高),这4位可以进行切分,分为高n位的抢占优先级和低4-n位的响应优先级。
  2. 抢占优先级高的可以中断嵌套,响应优先级高的可以优先排队,抢占优先级和响应优先级均相同的按中断号排队。

在这里插入图片描述

4.配置 EXTI

4.1 AFIO 库函数

在这里插入图片描述

AFIO 库函数在GPIO 库函数中。

  1. GPIO_AFIODeInit,这个函数是用来复位AFIO外设的,调用一下这个函数,AFIO的配置就会全部清零。

  2. GPIO_PinLockConfig,用来锁定GPIO配置,调用这个函数,参数指定某个引脚,那这个引脚就会被锁定,防止意外更改。

  3. GPIO_EventOutputConfig,这个函数用来配置AFIO的事件输出功能的。

  4. GPIO_EventOutputCmd,也是用来配置AFIO的事件输出功能。

  5. GPIO_PinRemapConfig,用来进行引脚重映射,第一个参数选择要重映射的方式,第二个参数是新的状态。

  6. GPIO_EXTILineConfig,调用这个函数,就可以配置AFIO的数据选择器,来选择想要的中断引脚。

  7. PIO_ETH_MediaInterfaceConfig,和以太网有关的函数。

4.2 EXTI 库函数

在这里插入图片描述

  1. EXTI_DeInit,调用他,可以把EXTI的配置都清除,恢复成上电默认状态。

  2. EXTI_Init,根据结构体里面的参数配置EXTI外设,初始化EXTI。

  3. EXTI_StructInit,可以把参数的结构体变量赋一个默认值。

  4. EXTI_GenerateSWInterrupt,软件出发外部中断,调用这个函数,参数给一个指定的中断线,就能软件出发一次外部中断。

  5. FlagStatus EXTI_GetFlagStatus,可以获取指定的标志位是否被置1。

  6. EXTI_ClearFlag,可以对置1的标志位进行清除。

  7. ITStatus EXTI_GetITStatus,获取中断标志位是否被置1。

  8. EXTI_ClearITPendingBit,清除中断挂起标志位。

其中第5、6个函数和第7、8个函数的区别是:第5、6个函数是用在主程序中查看和清除标志位的;而第7、8个函数是在中断函数里查看和清除标志位的。

4.3 NVIC 库函数

在这里插入图片描述

  1. NVIC_PriorityGroupConfig,用来中断分组,参数是中断分组的方式。

  2. NVIC_Init,根据结构体里面指定的参数初始化NVIC。

  3. NVIC_SetVectorTable,设置中断向量表。

  4. NVIC_SystemLPConfig,系统低功耗配置。

4.4 配置EXTI 的步骤
  1. 配置RCC,把要涉及的外设的时钟都打开(不打开时钟,外设是无法工作的);

  2. 配置GPIO,选择我们的端口为输入模式;

  3. 配置AFIO,选择我们的这一路GPIO,连接到后面的EXIT;

  4. 配置EXIT,选择边沿触发方式,比如上升沿,下降沿或者双边沿,以及选择触发响应方式,可以选择中断响应和事件响应(一般是中断响应);

  5. 配置NVIC,给我们这个中断选择一个合适的优先级。

  6. 通过NVIC,外部中断信号就能进入CPU了,这样CPU才能收到中断信号,才能跳转到中断函数里执行中断程序。

NVIC不需要手动开启时钟,因为NVIC属于内核中的外设,内核中的外设是不需要手动开启时钟的。

4.5 初始化EXTI
#include "stm32f10x.h"  // Device headervoid CountSensor_Init(void)
{//1.配置RCCRCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);  //开启GPIOB的时钟RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);  //开启AFIO的时钟//RCC管的是内核外的外设//AFIO也是APB2外设总线上的//EXTI和NVIC两个外设时钟是一直都打开的,不需要我们再开启时钟//NVIC是内核的外设,内核的外设不需要开启时钟//2.配置GPIOGPIO_InitTypeDef GPIO_Initstructure;GPIO_Initstructure.GPIO_Mode=GPIO_Mode_IPD;//选择模式GPIO_Initstructure.GPIO_Pin=GPIO_Pin_14;//选择引脚GPIO_Initstructure.GPIO_Speed=GPIO_Speed_50MHz;GPIO_Init(GPIOB,&GPIO_Initstructure);//调用函数,初始化GPIOB外设//3.配置AFIO	GPIO_EXTILineConfig(GPIO_PortSourceGPIOB,GPIO_PinSource14);  //配置AFIO外部中断引脚//当执行完这个函数后,AFIO的第14个引脚数据选择器就拨好了//输入端被拨到了GPIO外设上,对应的就是PB14号引脚;输出端固定连接的是EXTI的第14个中断线路。//这样PB14号引脚的电平信号就可以顺利通过AFIO,进入后面的EXTI电路了//4.配置EXTIEXTI_InitTypeDef EXTI_InitStructure;EXTI_InitStructure.EXTI_Line=EXTI_Line14;//指定要配置的中断线EXTI_InitStructure.EXTI_LineCmd=ENABLE;//指定选择的中断线的新状态EXTI_InitStructure.EXTI_Mode=EXTI_Mode_Interrupt;//指定外部中断线模式EXTI_InitStructure.EXTI_Trigger=EXTI_Trigger_Falling;//指定触发信号的有效边沿方式EXTI_Init(&EXTI_InitStructure);//5.配置NVICNVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//配置优先级分组:先占优先级和从占优先级//6.调用NVIC_Init函数NVIC_InitTypeDef NVIC_InitStructure;NVIC_InitStructure.NVIC_IRQChannel=EXTI15_10_IRQn;//指定中断通道来开启或关闭NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE;NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=1;//指定抢占优先级NVIC_InitStructure.NVIC_IRQChannelSubPriority=1;//指定响应优先级NVIC_Init(&NVIC_InitStructure);}

外部中断的信号从GPIO到AFIO,再到EXTI,再到NVIC,最终通向CPU,这样才能让CPU由主程序跳转到中断程序执行。

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

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

相关文章

浅谈人工智能之DB-GPT(番外篇)Chat Excel功能示例

浅谈人工智能之DB-GPT(番外篇)Chat Excel功能示例 当我们安装完成DB-GTP以后,我们就可以对该功能进行使用,本文以Chat Excel功能未示例,介绍DB-GPT的强大功能。 Excel准备 首先我们准备一份Excel,该Exce…

泰鸿万立上会,业绩增速放缓,对吉利、长城依赖度较高

作者:Eric 来源:IPO魔女 2024年11月8日,深交所上市委将审议浙江泰鸿万立科技股份有限公司(简称“鸿泰万立”)主板IPO申请。公司保荐机构为东方证券。拟募集资金为11.50亿元。 鸿泰万立主营业务为汽车结构件、功能件的…

耕地类项目知识点汇总(持续完善中……)

测绘 | 浅谈三次国土调查的“前世今生” 1.三次国土调查 全国国土调查一调1984年开始,1996年底调查完成,共耗时13年。 全国国土调查二调2007年开始,2009年全面调查完成。 全国国土调查三调2017年下半年,2020年10月底调查完成。…

基于CNN-BiLSTM的时间序列数据预测,15个输入1个输出,可以更改数据集,MATLAB代码

1. 数据收集与预处理 数据清洗:处理缺失值、异常值等。特征工程:提取有助于预测的特征。数据标准化:将时间序列数据标准化,使其具有零均值和单位方差,有助于模型训练。滑动窗口划分:将时间序列数据划分为多…

红帆OA iorepsavexml.aspx文件上传漏洞

漏洞描述 广州红帆科技深耕医疗行业20余年,专注医院行政管控,与企业微信、阿里钉钉全方位结合,推出web移动一体化办公解决方案——iOffice20(医微云)。提供行政办公、专业科室应用、决策辅助等信息化工具,…

Python 基础笔记之生成器generator

生成斐波拉契数列 def fib(length):a,b0,1n0while n<length:yield aa,bb,abn1return abc g2fib(10) try:print(next(g2)) 生成器方法&#xff1a; __next__():获取下一个元素 send(value):向每次生成器调用中传值 注意&#xff1a;第一次调用send(None) def gen():i0while…

qt QWebSocketServer详解

1、概述 QWebSocketServer 是 Qt 框架中用于处理 WebSocket 服务器端的类。它允许开发者创建 WebSocket 服务器&#xff0c;接受客户端的连接&#xff0c;并与之进行双向通信。WebSocket 是一种在单个 TCP 连接上进行全双工通讯的协议&#xff0c;它使得客户端和服务器之间的数…

qt QTabWidget详解

1、概述 QTabWidget是Qt框架中的一个控件&#xff0c;它提供了一个标签页式的界面&#xff0c;允许用户在不同的页面&#xff08;或称为标签&#xff09;之间切换。每个页面都可以包含不同的内容&#xff0c;如文本、图像、按钮或其他小部件。QTabWidget非常适合用于创建具有多…

HTML的总结作业

作业1 参照图使用表格定位表单。 参考代码 <!DOCTYPE html> <html> <head> <meta charset"utf-8"/> <title></title> </head> <body> <form action""> …

Rust 力扣 - 3090. 每个字符最多出现两次的最长子字符串

文章目录 题目描述题解思路题解代码题目链接 题目描述 题解思路 本题使用滑动窗口进行求解&#xff0c;使用左指针和右指针分别表示窗口的左边界和窗口的右边界&#xff0c;使用哈希表记录窗口内的字符及其对应数量 我们首先向右移动右指针&#xff0c;将字符加入到哈希表中进…

qt qchart添加跟随鼠标的十字线

基于qchart添加跟随鼠标的十字线和item 或许你需要些许QGraphics框架的基础知识,当然照抄这个帖子也是没有任何问题的,也可以实现功能 老套路,一图胜千言 效果如上动图,略微讲一点QGraphics框架的内容 QGraphicsScene是一个item管理集合,QGraphicsView就是scene的眼睛,it…

Flutter PC端UI组件库

一、参考Element-ui的设计和交互&#xff0c;构建基于dart的Flutter UI组件库 https://javonhuang.github.io/sky-ui-page/index.html

让股票数据分析从此如此简单

你是否遇到过&#xff0c;此类事件&#xff0c;一直在上班&#xff0c;没办法自己长时间盯盘&#xff0c;而且&#xff0c;可能会出现&#xff0c;这种情况&#xff0c;各类股票类APP功能巨多&#xff0c;但是呢&#xff0c;自己有自己一套理论&#xff0c;但是又没办法定制&am…

2.3立项【硬件产品立项的核心内容】

硬件产品立项的核心内容 2.3 硬件产品立项的核心内容2.3.1 第一步&#xff1a;市场趋势判断2.3.2 第二步&#xff1a;竞争对手分析1.竞争对手识别2.根据竞争对手分析制定策略 2.3.3 第三步&#xff1a;客户分析2.3.4 第四步&#xff1a;产品定义2.3.5 第五步&#xff1a;开发执…

狼叔的职业成长历程和面对AI的焦虑与自我消解-浪说播客

浪说播客&#xff1a;专注于泛 IT 方向&#xff0c;讨论技术之外的有趣内容。 浪说播客地址&#xff1a;LANGSHUO0.PODCAST.XYZ “浪”是个中性词。它可以指浪潮&#xff0c;也可以表示一种过于兴奋的状态。在可控范围内玩得有趣&#xff0c;这其实才是我最喜欢的理解。当然&am…

C++ OpenCV 理想滤波

理想低通滤波 通过设置频率半径&#xff0c;半径内的频率大小不变&#xff0c;半径外的频率置为0&#xff0c;即保留了低频区&#xff0c;滤除了高频区&#xff0c;达到滤波的目的。 #include<iostream> #include<opencv2/opencv.hpp> #include "MY_DFT.h&qu…

25-RVIZ CARLA插件

RVIZ插件(RVIZ plugin)提供了一个基于RVIZ(RVIZ) ROS包的可视化工具。 用RVIZ运行ROS桥接 RVIZ插件需要一个名为ego_vehicle的自车。要查看ROS-bridge使用RVIZ的示例&#xff0c;请在运行CARLA服务器的情况下执行以下命令&#xff1a; 1. 启用RVIZ启动ROS桥接&#xff1a; # …

鸿蒙OS带来前端的机遇:ArkTS与Typescript+ArkUI与SwiftUI的简单对比你就知道了

随着鸿蒙系统的不断发展&#xff0c;它已逐渐成为智能设备领域的第三大操作系统&#xff0c;与安卓和iOS形成三足鼎立之势。鸿蒙系统不仅在智能手机领域崭露头角&#xff0c;其在智能穿戴、车载、家居等领域的应用也在不断扩展。对于开发者而言&#xff0c;鸿蒙生态的崛起不仅带…

Java+Swing实现的五子棋游戏

JavaSwing实现的五子棋游戏 一、系统介绍二、功能展示1.游戏展示 三、系统实现1.ChessFrame .java 四、其它1.其他系统实现 一、系统介绍 五子棋游戏实现人机对战、人人对战两个模式。 二、功能展示 1.游戏展示 三、系统实现 1.ChessFrame .java package five;import java…

C语言实验 顺序结构

时间&#xff1a;2024.11.1 实验一、7-1 逆序的三位数 #include<stdio.h> int main(){int n,a,b,c;scanf("%d",&n);an%10;bn/10%10;cn/100;printf("%d",a*100b*10c);return 0; }实验二、7-2 求整数均值 #include<stdio.h> int main(){int…