STM32-中断优先级管理NVIC详解

article/2025/9/15 3:51:21

中断和NVIC详解

  • 1,什么是中断?
  • 2,中断、异常、事件三者的区别
  • 3,中断由谁管理?NVIC
    • 中断优先级
    • 中断相关函数
  • 4,外部中断使用示例

1,什么是中断?

 举个简单的例子,你正在打王者荣耀,然后你女朋友电话打过来了,此时你是接还是不接,如果不接,那么你女朋友就要和你分手,如果接了可能游戏就挂机了。你该如何选择,可能广大男性同胞会选择先接电话,然后简单敷衍两句,继续回来打游戏。此时,你女朋友的电话就相当于是一个中断源,他触发了你的中断,然后你要去执行中断服务函数也就是接女朋友电话,执行完毕之后你还要回来打游戏,继续之前的任务。这个过程其实就是咱们常说的中断。
 在单片机的世界,中断是一种常见的特性,它的执行流程如下:
在这里插入图片描述
中断的基础概念:=
中断源:能够产生中断事件。(固定的)
中断通道:给Cortex-M3交互路径。
中断优先级:中断同时到来,谁先执行。数字越小,优先级越高。
抢占优先级/剥夺:抢占优先级高的中断可以打断低抢占优先级的任务执行;
响应/次级:抢占优先级相等,同时到来,响应优先级谁高谁执行;
硬件优先级:中断向量表
中断响应:中断事件发生,Cortex-M3内核准备执行该事件,即为中断响应。
中断嵌套:可嵌套的内核 – 中断可以被其他中断打断。(Cortex-M)
  不可嵌套的内核 – 不可以打断。
可嵌套内核:在执行中断服务程序时,来了抢占优先级高的中断,把处理器状态压栈,转而执行优先级高的中 断的服务程序,再出栈;
中断挂起:中断事件发生了,但是Cortex-M3内核还没准备去执行。
中断服务函数:中断发生后,要执行的程序。(固定格式或则别人要求)
  软件编程,不调用,函数名固定;
 无参无返回值;
 执行时间短,不要使用阻塞函数;如果时间较长记录,在主程序运行;

2,中断、异常、事件三者的区别

在这里插入图片描述
 从上面这个图我们可以看出,首先异常和中断从广义上来讲,都可以称之为中断,只不过中断一般是指有外部产生的,这里的外部指的就是单片机上的那些外设,异常是指的是内核产生的。具体的中断和异常我们可以从内核手册里查到,异常的的编号在0-15之间,16-255则是外部中断。
在这里插入图片描述
在这里插入图片描述
那什么是事件呢?
事件其实就是触发中断的一个条件,当事件发生时,我们可以选择触发中断,也可以选择不触发中断。如下图所示,红色的路线是事件在单片机得运转的路线,蓝色的是中断在单片机内运行的路线。边沿检测电路检测到上升沿或者下降沿事件发生时,可以进行选择是否触发中断,如果直接到脉冲发生器,则不产生中断。
中断的执行路径:
 图中的蓝色虚线箭头,标出了外部中断信号的传输路径。首先,外部信号从编号1的芯片管脚进入,经过编号2的边沿检测电路,通过编号3的或门进入中断挂起请求寄存器,最后经过编号4的与门输出到NVIC中断检测电路。首先是编号2的边沿检测电路:这个边沿检测电路受上升沿或下降沿选择寄存器控制,用户可以使用这两个寄存器控制需要哪一个边沿产生中断,因为选择上升沿或下降沿是分别受2个平行的寄存器控制,所以用户可以同时选择上升沿或下降沿,而如果只有一个寄存器控制,那么只能选择一个边沿了。接下来,是编号3的或门,这个或门的另一个输入是软件中断/事件寄存器,从这里可以看出,软件可以优先于外部信号请求一个中断或事件,即当软件中断/事件寄存器的对应位为"1"时,不管外部信号如何,编号3的或门都会输出有效信号。然后,一个中断或事件请求信号经过编号3的或门后,进入挂起请求寄存器,到此之前,中断和事件的信号传输通路都是一致的,也就是说,挂起请求寄存器中记录了外部信号的电平变化。外部请求信号最后经过编号4的与门,向NVIC中断控制器发出一个中断请求,如果中断屏蔽寄存器的对应位为"0",则该请求信号不能传输到与门的另一端,实现了中断的屏蔽。
在这里插入图片描述

3,中断由谁管理?NVIC

 单片机可以产生的中断有很多个,这些终端统统由NVIC进行管理,NVIC是位于内核里的一个嵌套向量中断控制器。NVIC 与 CM3 内核同声相应,同气相求,相辅相成,里应外合,共同完成对中断的响应。NVIC 的寄存器以存储器映射的方式来访问,除了包含控制寄存器和中断处理的控制逻辑之外,NVIC 还包含了 MPU的控制寄存器、 SysTick 定时器以及调试控制。
 NVIC最多支持管理256个中断请求,但是大部分单片机会对这个中断进行相应设置并没有那么多,以STM32F103系列的芯片来说,他最多可以产生68个中断请求。这些中断按照NVIC分配好的优先级进行执行。
在这里插入图片描述

中断优先级

 在中断产生之后,CPU是否去执行该中断的处理以及什么时间去执行这个中断,这一切取决与中断的优先升级设置,对于M3内核来说,最大支持256个可编程优先级设置,也就是一共有8位优先级寄存器。但是在STM32芯片中设计者只是用了其中的4位,也就是说在STM32里,可编程的优先级一共有16中。其中4位优先级又被分为了抢占优先级和响应优先级,有的地方可能称之为占线优先级和次级优先级。
 抢占优先级高的中断先执行,而且抢占优先级高的中断可以打断带抢占优先级低的中执行。当两个中断抢占优先级一样,那么谁先到来谁先执行,如果同时到来则比较响应优先级,响应优先级高的先执行。在STM32中有优先级数值越小,优先级就越高。

优先级的具体划分可以参考下放这个例子:
       占先    次级
事件A     0     2
事件B     1     0
事件C     1     3
例如:
  事件C发生中断,此时事件A发生,A会抢占C(占先A大于C)
   事件C发生中断,此时事件B发生,不可以(占先B 和C一样)
   事件C和事件B同时到来,执行B,因为占先一样,比较次级。
   事件A和事件B同时到来,执行A,A的占先大于B的

中断相关函数

 对于中断的操作,一般我们在开启中断之后,会对中断进行优先级的设置,这里我们可以直接使用内核里提供的函数进行操作。参数中涉及的IRQn_Type可以从STM32F10x.h文件里查找。需要注意的是中断优先级分组设置,在一个工程中只能设置一次,避免出现中断优先级混乱的情况,一般在main函数开始的地方先进行中断优先级设置。
在这里插入图片描述
中断的配置步骤:
  1,设置中断优先级分组(只需设置一次)
  2,设置中断优先级
  3,开启中断通道

4,外部中断使用示例

下面用一个最简单的外部中断来演示一下,中断的使用
具体配置过程如下:
  1.按键初始化为浮空输入模式
 2.把PA0映射到EXTI0上:
  3.配置EXTI0:
    边沿检测、使能
 4.配置NVIC:配置EXTI0中断通道
    优先级、使能
  5.编写中断服务函数

//外部中断配置
void EXTI_Config(void)
{EXTI_InitTypeDef EXTI_InitStruct={0};NVIC_InitTypeDef NVIC_InitStruct={0};//打开端口复用时钟RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);;//配置外部中断线GPIO_EXTILineConfig(GPIO_PortSourceGPIOA,GPIO_PinSource0);//配置EXTIEXTI_InitStruct.EXTI_Line=EXTI_Line0;EXTI_InitStruct.EXTI_Mode=EXTI_Mode_Interrupt;EXTI_InitStruct.EXTI_Trigger=EXTI_Trigger_Rising;EXTI_InitStruct.EXTI_LineCmd=ENABLE;EXTI_Init(&EXTI_InitStruct);//配置中断优先级NVIC_InitStruct.NVIC_IRQChannel=EXTI0_IRQn;NVIC_InitStruct.NVIC_IRQChannelCmd=ENABLE;NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority=3;NVIC_InitStruct.NVIC_IRQChannelSubPriority=3;NVIC_Init(&NVIC_InitStruct);
}
//中断服务函数
void EXTI0_IRQHandler(void)
{//此处可以添加自己的任务功能函数……EXTI_ClearITPendingBit(EXTI_Line0);
}

http://chatgpt.dhexx.cn/article/wJRwqwkj.shtml

相关文章

STM32——中断概览(中断优先级)

中断是指计算机运行过程中,出现某些意外情况需要主机干预时,机器能够自动停止正在运行的程序并转入处理新情况的程序,处理完毕后有返回原来被暂停的程序继续运行 STM32的中断和异常 (1)对于异常和外部中断的功能&…

stm32——中断优先级管理

1.NVIC中断优先级分组 1.CM3内核支持256个中断, 其中包含16个内核中断和240个外部中断,并且具有256级的可编程中断设置。 2.STM32并没有使用CM3内核全部的东西,而是只用了他其中的一部分。 3.STM32有84个中断,包括16个内核中断…

STM32中断设置以及中断优先级设置

最近,在做一个智能锁的项目,由于,今天碰到了一个关于中断的问题,因此,又回来好好啃一下中断配置的知识,俗话说:磨刀不误砍柴工。问题是什么呢?项目中我用到了一个触摸键盘TTP229&…

Java基础——this和super关键字

🏡个人主页 : 守夜人st 🚀系列专栏:java …持续更新中敬请关注… 🙉博主简介:软件工程专业,在校学生,写博客是为了总结回顾一些所学知识点 ​ ✈️推荐一款模拟面试,刷题…

super 关键字详解

super 关键字主要有三个作用: 从子类访问父类的成员变量从子类访问父类的成员方法从子类构造器访问父类的构造器 下面我将从这三个方面做一些细节说明和注意事项。 从子类访问父类的成员变量 使用 super 关键字从子类访问父类的成员变量需要遵循访问修饰符的限制…

super关键字的使用详解

目录 一、super关键字 二、super关键字的是三种用法 1、super.父类成员变量 2、super.父类成员方法 3、super();调用父类构造方法 一、super关键字 super关键字和this关键字用法比较相似。通俗讲创建一个子类和父类,super在子类中可以引用父类内容&…

Java——super关键字

1、super是关键字,全部小写。 2、super和this对比: this: this能出现在实例方法和构造方法中。 this的语法: “this.” 、 “this ()” this不能使用在静态方法中。 this.大部分情况下可以省略,在区分局部变量和实例变…

Java中super关键字详解

Java中super关键字详解 super有什么用?super什么时候不可以省略呢?super在内存图中是如何存在的呢?super使用时的注意事项 super有什么用? (1)当子类中构造方法第一行没有super时,会默认第一行有一个super()&#xff…

java语言之super关键字详解

文章目录 前言 一、super介绍二、super的语法三、super内存图四、super小结 前言 你第一次遇到super关键字是什么时候呢?是不是使用IDEA或者eclipse快捷键生成类构造方法的时候出现在构造方法第一行的super()语句呢?在没有了解super关键字之前&#xff…

super 关键字的作用

super 关键字的作用 super 代表父类对象,在子类中访问父类成员 访问父类构造方法 在子类方法中调用且必须是第一句 正文 super 关键字与 this 关键字是不一样的,this 表示当前对象,而 super 关键字代表的是父类对象在程序中,它通常…

super关键字的使用

1、super 概念 指的是:父类的 2、super可以修饰属性,可以修饰方法 在子类的方法中,可以通过 super.属性 super.方法 的方式,显示的去调用父类提供的属性,方法。在通常情况下,super.可以省略不写&#xf…

super关键字

一,什么是super关键字及其作用 super主要是在继承关系下 存在于子类方法中,用于指向子类对象中父类对象。 二,super关键字的三种用法及其在构造方法中的注意事项 1:super.父类的成员变量 (1)如下代码所…

Qt开源炫酷界面QCoolPage

背景介绍 做开发有大概三年时间了,先后做过MFC,上位机(Qt),游戏服务端(C),HTTP客户端(Qt)以及使用Qt做精美UI架构,也是积累了一些Qt方面的心得&a…

QT之界面布局

1. Qt界面布局 Qt的界面布局大致分为三类:水平布局、垂直布局、栅格布局(以下示例图出自一位灵魂画师) 水平布局 垂直布局 栅格布局 2. 我们为什么需要界面布局 1. 美观 美观是显而易见的,我们通过一个简单地示例来演示一…

Qt界面设计总结

1. 子窗体或控件,重写paintEvent事件,画边框、背景、文字、图片效果比较好。用paintEvent 事件画边框,用QPalette设置背景。 // 画边框 QPainter painter(this); painter.setRenderHint(QPainter::Antialiasing, true); painter.setPen(QPen(…

Qt的ui界面操作

界面布局 界面布局的美化:拖拽widget,进行布局:水平布局、垂直布局、栅格布局;以及打破布局等。默认窗口和控件之间有9像素间隙,可以调整layoutLeftMargin 等属性若要使得widget大小和控件大小一样大,可以…

Qt界面开发(二)

首先给一个福利,学习qtQuick好的github地址。 https://github.com/zhengtianzuo/QtQuickExamples 效果图: 1.计划日历 下载地址:https://download.csdn.net/download/zhangxiaoyu_sy/10436208 2.无边框界面 下载地址:https://download.csdn.net/download/zhangxia…

Qt如何调用建立好的ui界面

在我们刚才学习qt的时候,很多的时候,按照新建立的工程文件,出现一个困扰。就是如何调用额外建立的UI界面。在这里主要是说明这里的面的关键因素。其实学习qt,如果之前有过学过C的同事,那么就学习qt就会很容易上手。因为…

Qt实战案例(13)——Qt的界面外观详细介绍

目录 一、Qt风格1.1 对风格进行预览1.2 风格使用 二、Qt样式表2.1 使用代码设置样式表2.2 在设计模式中设置样式表2.3 Qt样式表的语法2.4 子控件(Sub-Controls)2.5 伪状态(Pseudo-States)2.6 继承2.7 qss2.8 代码示例 三、特殊效果…

Qt-UI 界面工具库简介

一、关于Qt-UI界面工具库 Qt-UI界面工具库是武汉维仕杰科技有限公司基于Qt上进行扩展开发的控件包和界面工具,并且拥有完全自主的知识产权。得益于丰富的界面开发经验和强大的支持团队,使得Qt-UI界面开发工具成为最专业、功能强大的Qt开发工具库。 Qt-…