一. 中断是啥
在STM32微控制器中,中断是一种事件驱动的机制,用于在特定条件发生时打断正在执行的程序,并立即处理特定的事件或执行相应的中断服务程序(ISR)。
通过外部或内部源触发的事件,例如定时器溢出、外部输入、通信接口传输完成等。当一个中断事件发生时,STM32微控制器会立即中断正在执行的程序,并跳转到相应的中断服务程序进行处理。一旦中断处理程序完成,控制权将返回到被中断程序的原始执行点。打个比方,现在的你正在看视频,在看视频的过程中,电话响起,一看是上司打来的,你首先将视频点击暂停,然后拿起手机接听上司的电话,当通话结束后,需要再次切到视频窗口点击播放,继续看视频。在这一个过程中,你的主程序就是看视频,在途中你遇到更加紧急的事情(上司电话),这时候触发中断响应,需要将接电话这个中断优先执行(接通电话),在执行完该中断程序后,再回去执行主程序(看视频)。
ARM Cortex_M3内核支持256个中断(16个内核和240个外设)和可编程256级中断优先级的设置。然而,STM32并没有全部使用M3内核的东西,STM32目支持的中断为84个,即16个内核加上68个外部及16级可编程中断优先级的设置。
二. 中断系统是啥
在STM32微控制器系列中,中断系统是一种用于管理和处理中断事件的硬件和软件机制。STM32系列的微控制器具有灵活且强大的中断控制器,可处理多种类型的中断,并支持多级中断优先级。
STM32中的中断系统包括这些方面:
- NVIC(Nested Vectored Interrupt Controller):是STM32微控制器中的中断控制器,它接收来自外部和内部中断源的中断请求,并将其分发给相应的中断处理程序。NVIC支持多级中断优先级,并提供屏蔽和优先级配置选项。
- 中断优先级:STM32中的中断优先级控制机制允许开发者为不同的中断源分配不同的优先级(抢占优先级和响应优先级)。在多个中断请求同时发生时,优先级较高的中断将首先得到处理。在NVIC中,每个中断通道具有预定义的优先级位数,可以通过配置寄存器来设置中断源的优先级。
- 中断向量表:是STM32微控制器中的一个特殊的内存区域,存储着不同中断向量的地址。当发生中断时,中断处理器会通过中断向量表找到相应中断源的中断处理程序的入口地址,并跳转到那里执行。在编程过程中需要设置适当的中断向量表,确保中断源的中断服务程序能够被正确调用。
- 中断源:能够引发中断的事件称为中断源,一般情况下,中断源都和外设有关,每一个中断源都有它对应的中断标志位,一旦该中断发生,它的中断标志位就会被置位,如果中断标志位被清除,那么它对应的中断便不会再被响应。
- 中断服务程序(ISR):在STM32中,每个中断源通常对应一个中断服务程序。中断服务程序是一段特定的代码,用于处理中断源触发的中断事件。当中断发生时,由中断系统根据中断向量表跳转到相应的中断服务程序。开发人员可以编写自定义的中断服务程序,以根据应用程序的需求做出相应的处理。
通过STM32中的中断系统,开发者可以实现灵活和高效的中断处理。这种中断机制使得STM32微控制器可以及时响应外部事件和内部条件,并提供出色的实时性和可靠性。
三. 中断的处理过程
中断的具体处理可分为中断响应,执行中断服务程序中断三部分。一般来说,在嵌入式系统中,中断响应和中断返回都由硬件自动执行完成,而在中断服务程序中,则是由用户编写的程序执行具体的效果。
1. 中断响应
当某个中断请求产生后, CPU进行识别,并根据中断屏蔽位,判断该中断是否被屏蔽。若该中断请求已被屏蔽,仅将中断标志位置位,CPU不做任何响应,继续执行主程序;若该中断请求未被屏蔽,不仅中断寄存器中该中断标志位为被置位,CPU还会执行以下步骤。
(1)保护现场。保护现场是为了在执行完服务程序后可以返回断点处继续执行在中断处理前必须做的操作。
(2)找到该中断对应的中断服务程序地址。
2. 执行中断服务程序
每个中断都有对应的中断服务程序,用来处理中断。CPU响应中断后,转而执行对应的中断服务程序。中断服务程序又称中断服务函数,由用户根据具体的应用使用汇编语言或C语言编写,用来实现对该中断真正的处理操作。
3. 中断返回
CPU执行的中断服务程序完毕后,通过恢复现场(CPU关键寄存器出栈)实现中断返回,从断点处继续执行原程序
四. 中断嵌套
中断优先级除了用于并发中断,还用于嵌套中断。
在嵌入式系统中,中断嵌套是指当系统正在执行一个中断服务程序时吗,又有新的中断事件发生而产生新的中断请求。此时,CPU根据事先设置的优先级来比较中断服务程序,优先级低的将被终止,先处理优先级高的中断服务程序,处理完毕后,才会返回来继续执行优先级较低的中断服务函数。
五. STM32F103嵌套向量中断控制器NVIC
Cortex-M3内核的中断处理机制主要是由NVIC实现的,NVIC集成在Cortex-M3内核的内部,与中央处理器核心(CPU)CM3Core耦合,负责处理不可屏蔽的中断和外部中断,而SYSTICK不是由它控制的。NVIC支持中断嵌套,使用挂起或放弃指令执行、迟到中断处理和尾链等多种技术减少中断延迟,为Cortex-M3提供出色的中断处理能力。
1. NVIC的优先级
优先级决定了一个中断是否能被屏蔽以及未屏蔽的情况下何时可以响应。在STM32中有两个优先级的概念:抢占优先级和响应优先级。
- 抢占优先级:又称组优先级或者占先优先级,标识了一个中断的抢占式优先级响应能力的高低。抢占优先级决定了是否会有中断嵌套发生。
- 响应优先级:又称从优先级,仅在抢占优先级相同时才会使用,标识了一个非抢占式优先级响应能力的高低。
在配置优先级的时候,还要注意一个很重要的问题,即中断种类的数量。NVIC只可以配置16种中断向量的优先级,也就是说,抢占优先级和响应优先级的数量由一个4位的数字决定,把这4个数字位数分配成抢占优先级和响应优先级。
六. 中断设置过程
1. 建立中断向量表
在Flash中建立中断向量表。
在RAM中建立中断向量表。
2. 分配栈空间并初始化
分配栈空间。
初始化栈。
3. 设置中断优先级
设置中断优先级的分组位数。
设置中断的抢占优先级和响应优先级。