中断系统简介

其实中断嵌套和函数调用有着很大的相似性,不是吗?
中断向量表
中断跳转由于硬件限制,只能跳到固定的地址执行程序。为了能让硬件跳转到不固定的中断函数,就需要在内存维护一个固定的列表地址,中断发生后,先跳到这个固定位置,之后再跳到中断函数。
NVIC(嵌套中断向量控制器)
分配中断优先级和管理外设,如图:

抢断优先级和响应优先级

可以这样说,如果比作医院,响应优先级高可以插队排队,而抢断优先级高,可以直接把正在接诊的病人拉走,自己先来(抢断当前中断)。
- 抢占优先级(Preemption Priority):决定能不能打断别人(中断嵌套)。数值越小,级别越高。
- 响应优先级(Subpriority / 响应优先级):决定能不能插队。当两个中断同时发生,且抢占优先级相同时,响应优先级高的先执行。但它不能打断正在执行的中断。
优先级寄存器有4位,(0~15,即二进制 0000 ~ 1111)总共只能表示16个等级。但系统需要区分两种不同的优先级概念。
为了兼顾这两种需求,硬件设计允许你把这4个位切成两半,一部分给抢占,一部分给响应。这就是“高n位”和“低4-n位”的来源。当然,这个用来区分四位从哪里切割划分给抢占和响应的、至关重要的 n 是由我们在代码里决定的。在STM32中,n可以取0、1、2、3、4,对应5种优先级分组(由 NVIC_PriorityGroupConfig() 函数设置)。
假设这4位寄存器的二进制值是 1010(十进制10)。
- 如果 n = 2:
- 高2位(第3、2位):
10(二进制)= 2(抢占优先级) - 低2位(第1、0位):
10(二进制)= 2(响应优先级)
- 高2位(第3、2位):
- 如果 n = 3:
- 高3位(第3、2、1位):
101(二进制)= 5(抢占优先级)
- 高3位(第3、2、1位):
这里根据四位二进制和分组规格,大肥鱼整理了一个表格:
| 分组 (n) | 高n位(抢占优先级) | 低4-n位(响应优先级) | 抢占级数 | 响应级数 |
|---|---|---|---|---|
| n=0 | 0位 | 4位 | 1级 (无嵌套) | 16级 |
| n=1 | 1位 | 3位 | 2级 | 8级 |
| n=2 | 2位 | 2位 | 4级 | 4级 |
| n=3 | 3位 | 1位 | 8级 | 2级 |
| n=4 | 4位 | 0位 | 16级 | 1级 (全嵌套) |
EXTI中断

简而言之,EXTI是由电平变化产生的中断:
- 上升沿:从低电平 → 高电平产生中断
- 下降沿:同上
- 双边沿:上升沿 + 下降沿
- 软件触发:由代码触发
但是有一个问题,相同的Pin不能同时触发中断,比如 PA6 与 PB6,PA0 与 PB0 这样的。
由于外部中断可以从低功耗下唤醒STM32的功能,于是 PVD输出、RTC闹钟 也过来凑热闹,需要借助外部中断实现,占了四个输出通道。
事件响应用于通向其他外设,触发其他外设的操作。
EXTI基本结构

GPIO的16个引脚进入AFIO,但EXTI只有16个通道,所以说有AFIO这个数据选择器,可以从前面GPIO外设的16个引脚里面选一个接入EXTI。
现在就回答了这个问题,为什么相同的Pin不能同时触发中断,因为以GPIOA为例子,冲突只发生在 “数字后缀相同” 的引脚之间。规则如下:
- PA7(后缀是7) → 经过AFIO多路复用器 → 连到 EXTI7 这根线。
- PB6(后缀是6) → 经过AFIO多路复用器 → 连到 EXTI6 这根线。
因为 EXTI6 和 EXTI7 是两根独立的线,所以 PA7和PB6可以同时做外部中断,互不影响。
真正会打架的是谁? 是 PA7、PB7、PC7、PD7… 这些后缀都是“7”的引脚。它们同时抢 EXTI7 这一根线。AFIO的“多选一”开关只能选一个,所以它们不能同时用。下面是AFIO具体的实现图:

有趣的是看图你会发现:9-5和15-10被分配进了同一个 EXTI 里面,所以说外部中断的9-5和15-10会触发同一个中断函数!
深入了解-EXTI框图

- 边沿检测电路和软件中断事件寄存器通过或门连接,只要一个为1,那么输出为1。这个软件中断事件寄存器就是我们之前说的中断触发的软件触发,就是纯代码触发的中断,不管外部电路有没有事。所以说只要边沿检测电路(检测电平变化)和软件中断事件寄存器有一个为1(真),那么就可以触发中断。
- 之后会走到请求挂起寄存器,这个相当于中断的标志位,可以读取这个寄存器判断是哪个通道触发的中断,由于9-5和15-10被分配进了同一个
EXTI里面,所以说在这里就有区分的作用。 - 最后你会发现和
中断屏蔽控制器共同进入一个与门,到了NVIC中断控制器。
这个是中断触发,下面那一路就是事件触发啦。如果只发生中断而不需要事件,事件屏蔽寄存器(EMR)对应的位会被配置为0,从而在下方“与门”处将信号阻断,剩下的框图我相信你通过前面中断的理解,肯定易于理解(
分享文章
生成精美分享图或复制链接,与更多人分享本文。
继续阅读
换条路线
从其他文章中稳定抽取
评论