【STM32 CubeMX】STM32中断体系结构

文章目录


前言


一、中断体系的比喻

STM32中断体系如下图所示:

一座大型建筑物,比如一座高楼大厦,代表整个 STM32 芯片。在这座建筑物中,有许多房间和走廊,每个房间都代表一个特定功能的模块或外设,比如 GPIO、UART 等。

GPIO(通用输入输出):想象每个房间都有窗户,用于与外界交流。这些窗户可以用来输入信息(外部信号)或输出信息(驱动外部设备)。GPIO 窗户可以被打开或关闭,以允许或阻止信息的流动。

EXTI(外部中断):有些房间有特殊的门,称为 EXTI 门。当外部事件发生时,比如有人敲门,这些门会触发一个中断,通知系统发生了某些重要的事情。

NVIC(中断向量控制器):NVIC 就像一个大厅,里面有一个信息中心,负责管理整栋大楼中发生的所有事件和紧急情况。当有门被触发时,信息中心负责通知大楼的其他部分,告诉它们如何处理这个事件。

UART(通用异步收发传输器):想象一个房间里有一个电话,可以用来和外界通信。UART 中断就像是电话铃声响起,通知你有人在打电话,你需要停下手头的工作去接听电话。

综合以上,整个 STM32 中断结构就像一座大楼,有许多房间(外设模块)和走廊(数据总线),以及信息中心(NVIC)来管理这些房间和走廊中发生的事件。GPIO、EXIT、NVIC、UART 等都是这座大楼中不同的部分,各自承担着不同的功能,共同构成了 STM32 的中断系统。

二、中断的内部结构

2.1 EXTI

中断的框图如下:

我们可以通过设置寄存器进而来设置指定的引脚接到exti中断上

比如我们可以设置EXTI0这四位寄存器来设置哪个引脚有EXIT,通过指定的值

比如:设置PA[X]我们要使用0x0000

如果我们设置0000,他就有下面这样的情节

比如说,PA0接上一个开关

你可以去配置是按下中断还是松开时中断,在EXTI这里。

你可以去配置触发方式:

  1. 上升沿触发
  2. 下降沿触发
  3. 双边沿触发

我们还要去使能EXTI,使能他是否能发给下一级的NVIC

触发方式

上升沿触发就是从低电平变成高电平

下降沿触发就是从高电平变成低电平

双边沿就是上升和下降都触发

2.2 NVIC

NVIC:Nested vectored interrupt controller,嵌套向量中断控制器。

在上面这个图中,有这么多中断,比如EXTI,UART串口等等

NVIC就是去控制这些中断谁先得到cpu的执行

我们可以配置里面的优先级

我们还可以进一步使能,是否传递给CPU

2.3 cpu与中断

cpu中有一个总开关,我们可以去配置CPU让他处理中断/紧张处理中断

cpu是怎么处理中断的?

在NVIC中,有一个向量表,里面存储着这些中断函数的地址,当CPU检测到中断,NVIC会发一个id给CPU,然后根据id,使用id,在NVIC的向量表里找到对应项,然后调用函数

2.4 外部中断控制器框图

PA0进来,其中Edge detect circuit为边缘检测电路

他就可以去检测上升下降沿了

上升沿触发选择寄存器

其中bit0如果写入1的话就代表使能上升沿触发

如果是0就是静止。那么对于下降沿也是一样的

屏蔽/使能寄存器

以EXTI0为例子,我们可以写bit0,来屏蔽(写0)/使能(写1)

等待处理寄存器

如果某一个EXTI发生了,在他对应的bit位会设置成1

比如EXTI0发送了,那么这个寄存器的bit0会设置成1表示中断已经发生了

2.5 中断优先级

在 NVIC 里,对于每一个中断,都有一个 8 位的寄存器被用来表示它的优先级。这个 8

位的寄存器,被分为 2 部分,分别表示:分组优先级(也叫抢占优先级)、子优先级。

分组优先级被用来判断:当前正在处理的中断,能否被打断。比如当前正在处理 EXT0

中断,它的分组优先级为 3;如果这时候发生了 EXT1 中断,它的分组优先级为 4(数值越

高,优先级越低),那么 EXT1 的中断就无法打断 EXT0,等 EXT0 的中断处理完毕,EXT1 的

中断才能被处理。但是,如果 EXT1 的分组优先级为 2,那么当前的 EXT0 中断就被"抢占",

先执行 EXT1 的中断处理函数,再继续执行"被抢占的 EXT0"中断函数。

子优先级被用来判断:两个中断同时发生时,谁先被处理。还是以 EXT0、EXT1 为例,

如果它们同时发生了,那么分组优先级高的中断先被处理;如果分组优先级相同,那么子

优先级高的先被处理;如果连子优先级也相同,那么编号小的 EXT0 先被处理。

注意:如果 EXT0、EXT1 的分组优先级相同,是不会发生"抢占"的。比如 EXT0 中断

正在被处理,EXT1 紧接着被触发了,即使 EXT1 的子优先级高于 EXT0,EXT1 也不会抢占

EXI0。当 EXT0 被处理完毕,才轮到 EXT1 被处理。


总结

相关推荐
网易独家音乐人Mike Zhou3 小时前
【卡尔曼滤波】数据预测Prediction观测器的理论推导及应用 C语言、Python实现(Kalman Filter)
c语言·python·单片机·物联网·算法·嵌入式·iot
zy张起灵3 小时前
48v72v-100v转12v 10A大功率转换电源方案CSM3100SK
经验分享·嵌入式硬件·硬件工程
搬砖的小码农_Sky6 小时前
C语言:数组
c语言·数据结构
PegasusYu6 小时前
STM32CUBEIDE FreeRTOS操作教程(九):eventgroup事件标志组
stm32·教程·rtos·stm32cubeide·free-rtos·eventgroup·时间标志组
ahadee10 小时前
蓝桥杯每日真题 - 第19天
c语言·vscode·算法·蓝桥杯
Theliars10 小时前
C语言之字符串
c语言·开发语言
Reese_Cool10 小时前
【数据结构与算法】排序
java·c语言·开发语言·数据结构·c++·算法·排序算法
lantiandianzi11 小时前
基于单片机的多功能跑步机控制系统
单片机·嵌入式硬件
文弱书生65611 小时前
输出比较简介
stm32
哔哥哔特商务网11 小时前
高集成的MCU方案已成电机应用趋势?
单片机·嵌入式硬件