【STM32】STM32的中断系统&寄存器NVIC、EXTI

发布于:2025-06-22 ⋅ 阅读:(15) ⋅ 点赞:(0)


中断概述

中断的概念

在主程序运行过程中,出现了特定事件,使得CPU暂停当前正在运行的程序,转而去处理这个事件,等这个事件处理完成之后,CPU再回到刚才被打断的位置继续处理,这就是中断。
那个打断CPU执行的特定事件,我们一般称之为中断源。被中断源打断的位置我们称为断点。处理特定事件的过程,我们称为执行中断处理程序

在这里插入图片描述

正在执行中断程序的时候,这个时候有可能被另外一个中断源给中断,CPU转而去执行另外一个中断源的中断处理程序,这叫中断嵌套
中断B能否打断中断A,要看他们的优先级,优先级高的可以打断优先级低的,优先级低的无法打断优先级高的。

在这里插入图片描述

中断源可以是外部的,也可以是内部的。外部的叫外部中断源,内部的叫内部中断源内部的中断有时候也叫异常)。

为什么需要中断

对单片机系统来说,中断至关重要。
比如我们要检测按键是否按下,如果没有中断,则需要循环的方式不断的去检测按键对应的IO口的电平,(轮询)这是比较耗费CPU的时间的。如果要检测的更多的话,CPU有可能会导致阻塞。
有了中断事情就变的简单了,主程序不需要循环不断的去检测按键,当有按键按下的时候,CPU执行被打断,去执行按键处理程序就行了。当没有按键按下的时候,CPU完全可以正常执行代码,丝毫不受任何的影响。

STM32的中断

Cortex-M3内核支持256个中断,其中包含了16个内核中断和240个外部中断,并且具有256级的可编程中断设置。
但是一般情况下我们并不需要如此多中断,所以芯片厂商会对Cortex-M3的中断进行裁剪。
STM32有84个中断,包括16个内核中断和68个可屏蔽中断,具有16级可编程的中断优先级。
STM32F103系列70个中断(小编介绍的芯片)有10个内核中断和60个可编程的外部中断。
下面的列表中,灰色背景的是内部中断(或者异常),其他的为外部中断。

在这里插入图片描述

该表中的每一个地址就代表我们要进入该中断的中断服务程序的入口地址。
在这张表中,优先级数字越小代表它优先级越高。

STM32的中断体系架构

在中断服务中,内核是核心,因为所有中断请求都要发给内核,打断内核当前处理的程序,转而去执行中断服务程序。
我们可以把内核想象成皇上,所以它需要丞相来协助它,每一个中断请求都要先经它手,它会把每一个要见内核的中断按优先级排序,接下来我们介绍的NVIC就可以形象理解成丞相。
按照中断的来源不同,NVIC要处理的中断又分为三类。
来源1:内核其他控件
它们是离内核最近的,可以理解成是朝廷的官员,如系统滴答定时器,复位等。
来源2:片上外设
它们可以理解成是地方上的官员,还是在这个国家内,比如串口,定时器,I2C等。
来源3:外部中断
它们可以理解成是外国使臣,它们要进入单片机内部要经过输入输出引脚,也就是GPIOA~G,但是我们知道每一个GPIO都有16个引脚,一共7个GPIO就是112个引脚,但是并不是在同一时间所以外国使臣都要来进贡,所以我们可以在芯片内部将连线精简。
所有进入芯片的GPIO都要经过AFIO引脚复用选择器,就是只会选择7个GPIO中其中一个来进行传输(7合1),中断服务程序)会传输给EXTI(外部中断控制器),它可以理解成外交官,它会见整理所有外部请求,然后再传给NVIC。

在这里插入图片描述

NVIC

因为NVIC贴近内核,所以我们配置寄存器优先级不用手动设置,直接调标准库就行了。

NVIC的介绍

NVIC(Nested vectored interruptcontroller嵌套向量中断控制器)和处理器核的接口紧密相连,可以实现低延迟的中断处理和高效地处理中断。嵌套向量中断控制器管理着包括内核异常,外部中断等所有中断。由NVIC决定哪个中断的处理程序交给CPU来执行。
每一个外部中断都可以被使能或者禁止,并且可以被设置为挂起状态或者清除状态。处理器的中断可以是电平形式的,也可以是脉冲形式的,这样中断控制器就可以处理任何中断源。
16个IO的中断与PVD(电源电压检测),RTC(实时时钟),USB,以太网检测这20个外部中断会通过EXTI来控制,然后交给NVIC。其他中断都是直接交给NVIC来处理。

中断优先级

NVIC为了方便管理中断,可以通过软件给每个中断设置优先级。NVIC用4个位来控制优先级,值小的优先级高。把优先级分为两种:抢占优先级响应优先级
规则:

  • 优先级值越小,优先级越高。
  • 如果不设置优先级,则默认优先级为0。
  • 先比较抢占优先级。抢占优先级高的可以打断抢占优先级低的。
  • 若抢占优先级一样,再比较响应优先级。但是响应优先级不会导致中断嵌套。
  • 若抢占优先级一样的同时挂起,则优先处理响应抢占优先级高的。
  • 若挂起的优先级(抢占和响应)都一样,则查找中断向量表,值小的先响应。

优先级寄存器

我们再来看看系统手册里对优先级寄存器的说明:

在这里插入图片描述

我们可以看到一共又21个寄存器,每个寄存器可以配置4个优先级级值,一共可以配置84个,正好对应了前面我们介绍的STM32有84个中断。
但是我们还说了一共只有16个可编程的中断优先级,但是每一个可配置的地方却有8位,也就是可以配256个中断优先级,所以系统也有如下规定,优先级配置只有高四位有效:

在这里插入图片描述

优先级组

优先级组就是前面介绍的抢占优先级的底层划分,对每一个优先级组再次划分就是响应优先级。
NVIC对优先级分了5组,在程序中先对中断进行分组,而且分组只能分一次,若多次分,只有最后一次生效。

我们来看看寄存器是如何配置寄存器组的:
在这里插入图片描述

其实理解也很简单,优先级组一共划分为5组,每一组的区别就是对原本配置优先级的高4位进行划分,图中的x就代表抢占优先级,y就代表相应优先级,以第三组0b101为例,有四种抢占优先级,也就是这四种不同的抢占优先级中优先级高的可以打断优先级低的,每一种抢占优先级又分为4种响应优先级,也就是同一抢占优先级的四位不能互相打断,但是有都在挂起时的相应先后顺序。

在这里插入图片描述

EXTI

这个模块的很多寄存器都需要我们手动配置,所以我们需要关注它的原理图。

在这里插入图片描述
以上就是小编分享的全部内容了,如果觉得不错还请留下免费的关注和收藏
如果有建议欢迎通过评论区或私信留言,感谢您的大力支持。
一键三连好运连连哦~~

在这里插入图片描述


网站公告

今日签到

点亮在社区的每一天
去签到