1. 中断的相关概念
1.1 什么是中断
• 中断是单片机正在执行程序时,由于内部或者外部事件的触发,打断当前正在执行的程序,转而去处理这一事件,当处理完成后再回到原来被打断的地方继续执行原程序的过程。
• 在ARM体系结构中,中断通常由外设或者外部输入 产生,有时也可以是软件触发 。中断是单片机系统处理紧急或者突发事件的重要方式,如定时器触发,按键输入,串口数据到达等。
• 图:

1.2 意义
• 中断的意义主要在于提高 cpu 的执行效率 ,而不会一直占用cpu,实现对突发事件的实时处理。相对于轮询方式(既按照一定的频率和周期不断地检测某些事件的发生),中断在处理一些偶然发生的事情时效率更高。
1.3 中断优先级
• 中断具有优先级高低之分,两个中断同时发生,则优先响应高优先级的中断,再响应低优先级的中断。
1.4 中断嵌套
• 如果一个高优先级的中断发生,则会打断当前正在处理的中断(如果其优先级较低),并首先处理这个高优先级中断,这就是中断嵌套。如图:

1.5 中断的执行流程
• 当中断发生时,STM32的执行流程:首先,由外设发出中断请求,然后,cpu会暂停当前的任务,保护现场 ,接着程序跳转到对应的中断服务程序执行,当中断服务程序执行完后,恢复现场,最后返回到被中断的位置,继续执行下一个指令。
2. STM中断的数量
• 以STM32F03C8T6为例:STM32F103C8T6一共有70个中断,其中60 个外部中断和10个内核中断。(详细可以参考芯片手册)。
2.1 中断向量表(可以理解为"跳板")
• STM32的中断向量表是一个存储中断处理函数地址的数组 ,位于Flash 区 的起始位置 。每个数组元素对应一个中断源,其地址指向相应的中断服务程序。当中断发生时,处理器会根据中断号查找对应向量表,然后跳转到对应的中断服务程序执行。
• 中断向量表的主要作用是解决中断函数地址不固定与中断必须跳转到固定地方执行程序之间的矛盾。由于编译器每次编译都会为中断函数随机分配地址,但硬件要求中断必须跳转到固定的位置,因此,中断向量表就这样作为这样一个固定的地址列表,其中包含了中断函数的地址以及跳转到这些地址的程序。当中断发生时,处理器根据中断号,会跳转到这个固定的中断向量表,然后根据其中的信息跳转到相应的中断服务程序,从而执行中断逻辑。如图:

3. NVIC
3.1 NVIC介绍
• NVIC,即Nested Vectored Interrupt Controller(嵌套向量中断控制器),是STM32中的中断控制器 。它负责管理和协调处理器的中断请求,是STM32中处理异步事件的重要机制。
• NVIC提供了灵活、高效、可扩展的中断处理机制,支持多级优先级 、多向中断、嵌套向量中断等特性。当一 个中断请求到达时,NVIC 会确定其优先级并决定是否应该中断当前执行的程序,以便及时响应和处理该中断****请求。这种设计有助于提高系统的响应速度和可靠性,特别是在需要处理大量中断请求的实时应用程序中。
• NVIC 支持:最多支持256个中断(16内核+240外部),支持:256个优先级,允许裁剪。
3.2 NVIC工作原理

• 外部中断 进来先经过中断使能和使能寄存器,确定那些外部中断使能或者失能
• 然后再经过外部中断优先级寄存器 和内部中断优先级寄存器 对外部中断和内核中断设置优先级。
• 然后AIRCR寄存器对中断进行分组。
3.3 中断优先级的基本概念
• NVIC可以管理多个中断请求,并按优先级 处理它们。在STM32中,中断优先级被划分为抢占式优先级 和响应 优先级,可以根据具体的应用需求进行配置。不同的优先级分组方式会影响中断的响应和处理顺序。
3.4 抢占优先级
• 如果一个中断的抢占优先级高于当前正在执行的中断,那么它可以打断当前中断,优先得到执行。数值越 小,优先级越高.
3.5 响应优先级
• 如果两个中断同时到达 ,且它们的抢占优先级相同 ,那么响应优先级高的中断将首先得到响应。数值越小, 优先级越高。
3.6自然优先级
• 自然优先级是由硬件 固定并预先设定的,用户无法更改。当抢占优先级和响应优先级都相同时,自然优先级将决定哪个中断先得到处理。
3.7 优先级执行顺序
• 当多个中断同时发生时,执行顺序首先由抢占优先级决定 。如果抢占优先级相同,则进一步由响应优先级决定。如果响应优先级也相同,则最终由自然优先级决定。
• 在中断嵌套的情况下,高抢占优先级的中断可以打断低抢占优先级的中断,但高响应优先级的中断不能打断 低响应优先级的中断(当它们具有相同的抢占优先级时)。
3.8 优先级分组
• 优先级寄存器 IPR 有 8 位,但实际只使用到高 4 位,用于决定抢占优先级、响应优先级的等级。

• 优先级的分组又和AIRCE这个寄存器有关
• 例如,如果AIRCE配置成101这三位,那么抢占式优先级有两个,响应优先级也有两个。
3.9 NVIC寄存器

3.10 NVIC配置方法
• 设置中断分组 → 设置中断优先级等级 → 使能中断。
• 设置中断分组 一般在 HAL_Init 函数中进行,并且一般最好配置成2 个抢占式优先级和 2 个响应式优先级。
• HAL_NVIC_SetPriorityGrouping(NVIC_PRIORITYGROUP_2);设置中断分组,
• HAL_NVIC_SetPriority(EXTI0_IRQn,2,0);//设置中断优先级等级
• HAL_NVIC_EnableIRQ(EXTI0_IRQn);//使能中断
• 中断框图:
