STM32之三:中断外部中断

目录

1. 什么是中断

1.1 中断概念

1.2 中断优先级

1.3 中断嵌套

2.STM32中断

2.1 NVIC中断优先级

3 外部中断

3.1 EXTI简介

3.2 EXTI中断/事件线

3.3 EXTI功能框图

3.4 中断和事件的区别?

3.5 什么时候用外部中断?

3.怎么使用STM32中断

3.1 STM32外部中断编程要点

3.2 GPIO&AFIO

3.3 EXTI初始化

3.4 配置NVIC

3.5 编写中断服务函数

3.6 清除中断标志位


1. 什么是中断

1.1 中断概念

中断是计算机的一种机制,描述了这样一种场景:CPU暂停当前正在处理的程序,转而去处理紧急的事情,这种场景就叫中断。

中断其实很好理解,因为这样的场景经常发生在我们日常生活中。比如小李正在写作业,但是电话铃声响了,他转而去接电话,接完电话回来后继续写作业。在这个情境中,小李就完成了一次中断,下图根据现实生活的中断场景形象的表示了CPU中断过程,便于理解。

图1 中断场景概念

1.2 中断优先级

中断优先级即当有多个中断源请求中断时,CPU会根据中断优先级来判断首先执行那个中断。

1.3 中断嵌套

这个和中断优先级一起适配。当CPU正在相应中断,执行中断服务程序,此时又来了一个比当前中断优先级还高的中断,则此时CPU会停下当前执行的中断服务程序,转而去响应中断优先级更高的中断,等执行高优先级的中断后,回来继续执行未执行完的中断服务程序。中断可以有多个嵌套,有点套娃的意思。

2.STM32中断

STM32共有6个内核中断,68个可屏蔽中断。可见下图。

图2 互联型产品的向量表

STM32中断使用嵌套向量中断控制器NVIC管理包括内核异常等中断,NVIC和处理器核的接口紧密相连,可以实现低延迟和高效的中断处理。

使用NVIC,主要使其ISER(使能中断)、ICER(失能中断)、IP(中断优先级)三个寄存器。

2.1 NVIC中断优先级

NVIC有一个寄存器来进行优先级设置:中断优先级寄存器NVIC_IPRx。NVIC的中断优先级分为抢占优先级和响应优先级。抢占优先级即可以进行中断嵌套的一种优先级,CPU会优先处理抢占优先级高的中断。而响应优先级只在抢占优先级相同的时候才会触发,相同抢占优先级下,优先执行相应优先级的高的中断。如果抢占优先级和响应优先级都相同,则比较中断的硬件中断编号(图2所示优先级),编号越小,优先级越高。

如何配置优先级?

NVIC的中断优先级由优先级寄存器的4位(0~15)决定,这4位可以进行切分,分为高n位的抢占优先级和低4-n位的响应优先级(n的取值由用户在程序中进行选择)。抢占优先级高的可以中断嵌套(低优先级中断在占用CPU时,抢占优先级高的中断可以抢占低优先级中断的CPU,让低优先级中断暂停执行),响应优先级高的可以优先排队抢占优先级和响应优先级均相同的按中断号排队

图3 NVIC优先级分组(来源: STM32入门教程(EXTI外部中断篇)_请求挂起寄存器和中断标志位一样吗-CSDN博客 侵删,博主写的很清晰很详细,推荐看)

总结下NVIC、中断和CPU之间的关系

图4 NVIC基本结构  来源(B站江协科技STM32视频,推荐大家看)

3 外部中断

3.1 EXTI简介

EXTI(External interrupt/event controller)外部中断/事件控制器由20个产生事件/中断请求的边沿检测器组成。每个输入线可以独立的配置、触发和屏蔽。

3.2 EXTI中断/事件线

EXTI支持20个中断/事件线,其中前16根为GPIO输入线,另外4根用于特定的外设事件,可参考下图。

图5 EXTI 中断/事件线(来源:野火STM32库开发实战指南 18. EXTI—外部中断/事件控制器 — [野火]STM32库开发实战指南——基于野火指南者开发板 文档 )

由上图可以看到,EXIT支持所有的GPIO口产生中断,但是相同的Pin不能同时触发中断(比如PA0和PB0不能同时使用,但PA0和PB1可以同时使用)。因为EXTI0线同时只能选择其中1个进行中断输出,可以看下图,PA0、PB0、PC0、PD0、PE0、PF0、PG0都输入到同一个数据选择器,EXTI0线输出的信号通过AFIO_EXTICR1寄存器的EXTI0[3:0]位来配置。

图6 外部中断IO映射

外部中断配置寄存器共有4个,即AFIO_EXTICRx[x=1,2,3,4],其中每个AFIO_EXTICRx中管理4个EXTI中断,因此共有16个GPIO对应的EXTI中断/事件线。外部中断配置寄存器可以看下图:

图7 外部中断配置寄存器

图4中外部中断配置寄存器和图3中EXTI0—EXTI15是对应上的,AFIO中有16个数据选择器,以0号数据选择器为例,它负责选择PA0、PB0……PG0中的其中一个引脚,在写程序时如果想选择PB0作为中断引脚,就需要对AFIO的0号数据选择器进行配置,让它选择GPIOB的0号引脚。另外注意图3中最后一句话,通过AFIO_EXTICRx配置GPIO线上的外部中断/事件,必须先使能AFIO的时钟。

3.3 EXTI功能框图

图8 EXTI功能框图

这个框图可以从右往左看,分为两路,其中红色表示产生中断,绿色表示产生事件。1、2、3号电路是产生中断和产生事件共用的,到3号电路输出信号分开,一路走至NCIV产生中断信号,一路走至脉冲发生器产生事件。框图中“/20”表示线路有20个,这和3.2章节有20根中断/事件线,并且每个线路都是可以独立配置、屏蔽、触发是相一致的。

我们首先来看红色部分产生中断信号的流程。其中1号电路输入线即为3.2章节介绍的EXTI中断/事件线,一般是传入电平变化的信号。之后往左将该信号传递到2号边沿检测电路。该电路连接了两个寄存器,分别是上升沿触发选择寄存器和下降沿触发选择寄存器,这两个寄存器用来判断2号边沿检测电路检测哪些类型的电平信号,即上升沿触发或者下降沿触发,或者上升沿下降沿都触发。

之后继续往左,来到3号电路,是一个或门,或门的意思是有1即1。或门的两个输入端分别是来自2号电路边沿检测电路的信号和软件中断/事件寄存器。由此可见,产生中断信号可以有两个方式,其一即20跟输入线产生电平跳变信号,其二即在软件中断事件寄存器进行配置,也可达到产生中断/事件的效果。

3号电路输出的信号就表示是否有中断/事件信号,从图中可以看出该输出也兵分两步:其一往上输入到请求挂起寄存器,其二输入到4号与门电路中。我们先看上面部分。

当在外部中断线上发生了选择的边沿跳变,则请求挂起寄存器的相应中断线位置会被置1、之后继续往左,走到7号电路,该电路是一个与门,共有两个输入端,其一为请求挂起寄存器的输出信号,其二为中断屏蔽寄存器。中断屏蔽寄存器[19:0]位为1则表示可以该中断线可以产生中断,否则将屏蔽该中断线上的请求。

之后往左,可以看到与门输出为NVIC中断控制器,可以知道经过一系列判断最终输入线产生的中断被送往NVIC中断控制器。至此,外部中断信号产生过程已介绍完毕。

接着看下面部分,事件产生过程,3号电路输出信号输入到4号电路中,该电路与7号电路作用一致,也是一个与门,通过事件屏蔽寄存器来决定是否能产生事件,相应位置1表示可以产生事件,置0则表示屏蔽该线路中断。

4号电路信号输出到5号电路脉冲发生器中,4号电路是一个有效信号,则此时5号电路就会产生一个脉冲;否则不会产生脉冲。脉冲信号就是产生事件的意思,因为这个脉冲信号可以给其他外设发送信息,即可以通过该脉冲信号来触发TIM、ADC等外设。

这个框图比较复杂,我们抽取一些有用的信息来记忆:

1.要想产生某个线路的中断/事件,必须将该线路的中断/事件屏蔽寄存器响应位置位。

2.20个中断/事件线是独立的,有各自独立的边沿触发寄存器、屏蔽寄存器。

3.中断/事件产生可以通过20个输入线来产生,也可以通过软件来产生。通过软件来产生需要置位软件中断/事件寄存器相应位为1。

4.20个输入触发中断/事件的方式有:上升沿、下降沿、上升沿+下降沿。

3.4 中断和事件的区别?

产生事件的目的是传送一个脉冲信号给其他外设使用。

产生中断是把中断信号传递给NVIC,NVIC会通过优先级配置最终传递给CPU,让CPU去执行中断服务函数,实现中断功能。这就是产生事件和产生中断的区别。

3.5 什么时候用外部中断?

对于由外部触发的一些场景,例如遥控器,调整声音的按钮等,这些不是时时刻刻发生,而是由人为(外部信号)发出,并且发生后需要立即捕获其信号的场景,可以使用外部中断来进行捕获。

3.怎么使用STM32中断

3.1 STM32外部中断编程要点

1. 明确中断源(一般是GPIO),开启GPIO时钟,初始化要产生中断的GPIO。此步骤需注意,复用AFIO,需开启AFIO时钟,并且选择AFIO中断引脚【GPIO_EXTILineConfig()】。

2.初始化EXTI,主要是EXTI_InitTypeDef结构体。

3.经前面介绍,中断过后会到NVIC控制器中,所以需要配置NVIC相应寄存器【NVIC中断分组、NVIC配置】。

4.编写中断服务函数。

5.清除中断标志位

3.2 GPIO&AFIO

GPIO时钟和配置此处就省略了,重点关注开启IO复用时钟。查看stm32f10x_rcc.h,RCC_APB2PeriphResetCmd()函数用来开启APB2总线上的时钟。

RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE); //开启IO口复用时钟

之后,需要设置IO口与中断线的映射关系。查看stm32f10x_gpio.h,GPIO_EXTILineConfig()函数用来选择在EXTI中断线的GPIO引脚。

//例如,将外部中断的0号线映射到GPIOB,即选择PB0作为外部中断引脚
GPIO_EXTILineConfig(GPIO_PortSourceGPIOB, GPIO_PinSource0);

3.3 EXTI初始化

我们来看下EXTI初始化结构体,配置EXTI初始化结构体可以配置中断/事件线、产生中断还是产生事件、边沿触发方式、使能EXTI线。

//EXTI初始化结构体
//配置EXTI初始化结构体可以配置中断/事件线、产生中断还是产生事件、边沿触发方式、使能EXTI线
typedef struct
{uint32_t EXTI_Line;               //中断/事件线EXTIMode_TypeDef EXTI_Mode;       //中断/事件模式,可选为产生中断(EXTI_Mode_Interrupt)或               者产生事件(EXTI_Mode_Event)EXTITrigger_TypeDef EXTI_Trigger;  //EXTI边沿触发方式。上升沿触发(EXTI_Trigger_Rising)、下降沿触发(EXTI_Trigger_Falling)、上升沿下降沿都触发(EXTI_Trigger_Rising_Falling)FunctionalState EXTI_LineCmd;     //是否使能EXTI线
}EXTI_InitTypeDef;

 示例代码如下:

/*EXTI初始化*/EXTI_InitTypeDef EXTI_InitStructure;						//定义结构体变量EXTI_InitStructure.EXTI_Line = EXTI_Line0 | EXTI_Line1;		//选择配置外部中断的0号线和1号线EXTI_InitStructure.EXTI_LineCmd = ENABLE;					//指定外部中断线使能EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;			//指定外部中断线为中断模式EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling;		//指定外部中断线为下降沿触发EXTI_Init(&EXTI_InitStructure);								//将结构体变量交给EXTI_Init,配置EXTI外设

3.4 配置NVIC

	/*NVIC中断分组*/NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);				//配置NVIC为分组2//即抢占优先级范围:0~3,响应优先级范围:0~3//此分组配置在整个工程中仅需调用一次//若有多个中断,可以把此代码放在main函数内,while循环之前//若调用多次配置分组的代码,则后执行的配置会覆盖先执行的配置/*NVIC配置*/NVIC_InitTypeDef NVIC_InitStructure;						//定义结构体变量NVIC_InitStructure.NVIC_IRQChannel = EXTI0_IRQn;			//选择配置NVIC的EXTI0线NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;				//指定NVIC线路使能NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;	//指定NVIC线路的抢占优先级为1NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;			//指定NVIC线路的响应优先级为1NVIC_Init(&NVIC_InitStructure);								//将结构体变量交给NVIC_Init,配置NVIC外设

3.5 编写中断服务函数

void EXTI0_IRQHandler(void){}

3.6 清除中断标志位

EXTI_ClearITPendingBit(EXTI_Line0);			//清除外部中断0号线的中断标志位//中断标志位必须清除//否则中断将连续不断地触发,导致主程序卡死

至此,STM32外部中断部分介绍完毕。

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

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

相关文章

stm32F4库函数c++和C混合编程笔记20240626

1、有时候需要用到c的一些特性,封装,类等等。 2、研究一下如何更改之前c工程的内容,实现混合编程。 操作 1、keil设置 2、要重新建立一个main文件,后缀名是cpp,cpp才能调用cpp. 后面如果要用到c特性的,需要…

msvcr100.dll丢失的解决方法,学会这几种方法都能快速解决dll丢失

一、 msvcr100.dll丢失原因分析 系统文件损坏 系统文件损坏是导致msvcr100.dll丢失的常见原因之一。这种情况可能由多种因素引起,包括但不限于: 磁盘错误:磁盘的物理损坏或逻辑错误可能导致系统文件损坏。 病毒或恶意软件攻击&#xff1a…

【探索Linux】P.35(传输层 —— UDP协议)

阅读导航 引言一、UDP协议端格式二、UDP的特点三、UDP的缓冲区四、基于UDP的应用层协议温馨提示 引言 在上一篇文章中,我们深入探讨了网络协议的应用层,揭示了各种协议如何协同工作以确保信息在网络中正确、高效地传递。从HTTP到FTP,每一层协…

C++ Thead多线程 condition_variable 与其使用场景---C++11多线程快速学习

std::condition_variable 的步骤如下&#xff1a; 创建一个 std::condition_variable 对象。 创建一个互斥锁 std::mutex 对象&#xff0c;用来保护共享资源的访问。 在需要等待条件变量的地方 使用 std::unique_lock<std::mutex> 对象锁定互斥锁 并调用 std::conditio…

6.二叉树.题目2

6.二叉树.题目2 题目9.找树左下角的值10.路径总和11.从中序与后序遍历序列构造二叉树12.最大二叉树13.合并二叉树14.二叉搜索树中的搜索15.验证二叉搜索树16.二叉搜索树的最小绝对差 总结 题目 9.找树左下角的值 题目链接 给定一个二叉树&#xff0c;在树的最后一行找到最左边…

【LeetCode】二、链表相关:移除与反转链表

文章目录 1、链表结构2、leetcode203&#xff1a;移除链表元素3、leetcode206&#xff1a;反转链表 1、链表结构 和数组不同&#xff0c;此时不需要连续的内存空间&#xff0c;如下为单端链表&#xff0c;无pre指针 时间复杂度&#xff1a; 和数组相反&#xff0c;访问元素时…

Jackson和fastjson解决序列化时字段属性大小写改变的问题

在部分特殊场景下&#xff0c;我们可能会把实体的字段属性改成全部大写&#xff0c;但是在返回前端时&#xff0c;字段会被序列化成小写。 比如我们有一个这个类属性都是大写&#xff1a; 后端接口是这样的 然后我们请求后&#xff0c;会发现我们的字段被变成全部小写的。 …

linux服务器解压/压缩文件

在Linux服务器上&#xff0c;可以使用zip和tar命令来进行文件的打包&#xff08;压缩&#xff09;和解包&#xff08;解压缩&#xff09;。下面是它们的基本用法&#xff1a; 打包&#xff08;压缩&#xff09;与解压方法&#xff1a; 1. 使用 zip 命令 打包成 .zip 文件&am…

Java面试题:讨论如何使用JVM工具(如jconsole、jstack、jmap)诊断内存泄漏

诊断Java应用程序中的内存泄漏可以使用JVM提供的多种工具&#xff0c;如jconsole、jstack和jmap。这些工具可以帮助开发者监控和分析Java应用程序的运行状况&#xff0c;定位内存泄漏的根源。以下是这些工具的详细介绍及其使用方法&#xff1a; 1. jconsole JConsole&#xf…

CCAA:认证通用基础 7(认证的基本概念)

7认证的基本概念 7.1认证类型(产品认证、管理体系认证、服务认证)及基本特征 第一节 认证 1.认证的定义和本质 1.1认证的定义 (1)认证:与产品、过程、体系或人员有关的第三方证明。 ①”产品&#xff0c;过程&#xff0c;体系或人员”是认证的对象&#xff0c;认证是对“产…

PyQt6+mitmproxy,实现抓取网络请求并打印到桌面的窗口中

你可以将你的PyQt6应用程序与mitmproxy结合使用&#xff0c;以便在GUI中显示拦截的HTTP请求和响应。以下是修改后的代码&#xff1a; 安装依赖项&#xff1a; 确保你已经安装了PyQt6和mitmproxy&#xff1a; pip install PyQt6 mitmproxy编写Python代码&#xff1a; 创建一个Py…

软考中级:信息系统管理工程师备考资源

信息系统管理工程师备考资源 1 备考资源内容2 使用心得3 资源地址 1 备考资源内容 资源内容包含三部分&#xff1a;教程书籍pdf、备考笔记、历年真题 可以结合“软考通”APP进行练习备考&#xff0c;无偿分享。 2 使用心得 上面的资源很多&#xff0c;可以先从复习笔记开…

Kotlin作用域函数it和with的使用场景

在 Kotlin 中&#xff0c;apply、run、with 使用 this&#xff0c;而 let 和 also 使用 it&#xff0c;这背后的原因是为了提供灵活性和代码清晰度。不同的作用域函数有不同的设计目的&#xff0c;选择使用 this 或 it 是为了适应不同的使用场景。以下是详细解释&#xff1a; …

如何提高工业交换机的电源功耗?

工业交换机的电源功耗是指在工作状态下所消耗的能量。随着工业自动化技术的发展&#xff0c;工业交换机在生产和制造领域中扮演着至关重要的角色。它们通过连接各种设备和系统&#xff0c;实现信息的传输和处理&#xff0c;提高生产效率和质量。然而&#xff0c;工业交换机的大…

高质量3d建模素材网站推荐,建议收藏!

很多设计师、建模师想要制作出高质量的3D模型&#xff0c;除了扎实的技巧和丰富的经验外&#xff0c;还需要大量的高质量素材。那么到哪里去找高质量3d建模素材网站呢?本文将给大家推荐一些&#xff0c;建议收藏! 1、建e网&#xff1a;建e网是一个专注于为建筑、室内、景观设计…

郑州大学人工智能简答

第一章 1. 什么是人工智能&#xff1f; 人工智能又称机器智能&#xff0c;主要研究人工的方法和技术开发智能机器或智能系统&#xff0c;以模仿、延伸和扩展人的智能、生物智能、自然智能&#xff0c;实现机器的智能行为。 人工智能的定义分四类&#xff1a; &#xff08;1&am…

ai语音智能电销机器人的运用有哪些,呼叫系统部署

现在智能电销机器人仍是很火&#xff0c;智能电销机器人的运用有哪些&#xff0c;到底有什么效果&#xff1f;智能电销机器人运用有哪些了&#xff0c;我们一起来看看 1、确保心情丰满。电销人员在作业中&#xff0c;会由于作业比较单调而导致心情烦躁&#xff0c;不能确保全天…

Java--乐观锁

乐观锁是一种并发控制机制&#xff0c;用于处理多个事务或线程对同一数据进行并发修改的问题。它假设多个事务或线程在操作数据时不会互相干扰&#xff0c;因此不在数据上加锁&#xff0c;而是在提交数据时检查数据是否被其他事务修改过。如果数据在提交前已经被其他事务修改&a…

政务网站(.gov)应选择什么样的SSL证书

政府网站作为公共服务的重要平台&#xff0c;承载着发布政策信息、提供在线服务、促进政民互动等功能&#xff0c;其数据安全性和网站可信度尤为重要。因此&#xff0c;选择合适的SSL证书对于政府网站而言&#xff0c;不仅是遵循网络安全法规的需要&#xff0c;也是提升公众信任…