STM32中断
目录
中断概述
中断的功能
中断源与中断屏蔽
中断处理过程
中断优先级与中断嵌套
STM32F1中断系统
STM32F1中断优先级
STM32F1中断服务函数
STM32F1中断HAL驱动函数
中断概述
中断是计算机系统的一种处理异步事件的重要方法。它的作用是在计算机的CPU运行软件的同时,监测系统内外有没有发生需要CPU处理的“紧急事件”:当需要处理的事件发生时,中断控制器会打断CPU正在处理的常规事务,转而插入一段处理该紧急事件的代码;而该事务处理完成之后,CPU又能正确地返回刚才被打断的地方,以继续运行原来的代码。中断可以分为“中断响应”、“中断处理”和“中断返回”三个阶段。 在实际的应用系统中,嵌入式单片机STM32可能与各种各样的外部设备相连接。这些外设的结构形式、信号种类与大小、工作速度等差异很大,因此,需要有效的方法使单片机与外部设备协调工作。通常单片机与外设交换数据有三种方式:无条件传输方式、程序查询方式以及中断方式。
1. 无条件传输方式 单片机无须了解外部设备状态,当执行传输数据指令时直接向外部设备发送数据,因此适合于快速设备或者状态明确的外部设备。
2. 程序查询方式 控制器主动对外部设备的状态进行查询,依据查询状态传输数据。查询方式常常使单片机处于等待状态,同时也不能做出快速响应。因此,在单片机任务不太繁忙,对外部设备响应速度要求不高的情况下常采用这种方式。
3. 中断方式 外部设备主动向单片机发送请求,单片机接到请求后立即中断当前工作,处理外部设备的请求,处理完毕后继续处理未完成的工作。这种传输方式提高了STM32微处理器的利用率,并且对外部设备有较快的响应速度。因此,中断方式更加适应实时控制的需要。
中断的功能
1. 提高CPU工作效率 在早期的计算机系统中,CPU工作速度快,外设工作速度慢,形成CPU等待,效率降低。设置中断后,CPU不必花费大量的时间等待和查询外设工作,例如,计算机和打印机连接,计算机可以快速地传送一行字符给打印机(由于打印机存储容量有限,一次不能传送很多),打印机开始打印字符,CPU可以不理会打印机,处理自己的工作,待打印机打印该行字符完毕,发给CPU一个信号,CPU产生中断,中断正在处理的工作,转而再传送一行字符给打印机,这样在打印机打印字符期间(外设慢速工作),CPU可以不必等待或查询,自行处理自己的工作,从而大大提高了CPU工作效率。
2. 具有实时处理功能 实时控制是微型计算机系统特别是单片机系统应用领域的一个重要任务。在实时控制系统中,现场各种参数和状态的变化是随机发生的,要求CPU能做出快速响应、及时处理。有了中断系统,这些参数和状态的变化可以作为中断信号,使CPU中断,在相应的中断服务程序中及时处理这些参数和状态的变化。
3. 具有故障处理功能 微控制器在实际运行中,常会出现一些故障。例如,电源突然掉电、硬件自检出错、运算溢出等。利用中断,就可执行处理故障的中断程序服务。
4. 实现分时操作 单片机应用系统通常需要控制多个外设同时工作。例如,键盘、打印机、显示器、A/D转换器、D/A转换器等,这些设备的工作有些是随机的,有些是定时的,对于一些定时工作的外设,可以利用定时器,到一定时间产生中断,在中断服务程序中控制这些外设工作。例如,动态扫描显示,每隔一定时间会更换显示字位码和字段码。
中断源与中断屏蔽
1. 中断源 中断源是指能引发中断的事件。通常,中断源都与外设有关。在前面讲述的朋友来访的例子中,门铃的铃声是一个中断源,它由门铃这个外设发出,告诉主人(CPU)有客来访(事件),并等待主人(CPU)响应和处理(开门接待客人)。计算机系统中,常见的中断源有按键、定时器溢出、串口收到数据等,与此相关的外设有键盘、定时器和串口等。 每个中断源都有它对应的中断标志位,一旦该中断发生,它的中断标志位就会被置位。如果中断标志位被清除,那么它所对应的中断便不会再被响应。所以,一般在中断服务程序最后要将对应的中断标志位清零,否则将始终响应该中断,不断执行该中断服务程序。
STM32F103VET6采用了Cortex-M3 处理器内核,所以这部分保留使用,但STM32F103VET6并没有使用Cortex-M3内核全部的东西(如内存保护单元MPU等),因此它的NVIC是Cortex-M3内核的NVIC的子集。中断事件的异常处理通常被称作中断服务程序(ISR),中断一般由片上外设或者I/O口的外部输入产生。
2. 中断屏蔽 中断屏蔽是中断系统一个十分重要的功能。在计算机系统中,程序设计人员可以通过设置相应的中断屏蔽位,禁止CPU响应某个中断,从而实现中断屏蔽。在微控制器的中断控制系统,对一个中断源能否响应,一般由“中断允许总控制位”和该中断自身的“中断允许控制位”共同决定。这两个中断控制位中的任何一个被关闭,该中断就无法响应。 中断屏蔽的目的是保证在执行一些关键程序时不响应中断,以免造成延迟而引起错误
中断处理过程
在中断系统中,通常将CPU处在正常情况下运行的程序称为主程序,把产生申请中断信号的事件称为中断源,由中断源向CPU所发出的申请中断信号称为中断请求信号,CPU接收中断请求信号停止现行程序的运行而转向为中断服务称为中断响应,为中断服务的程序称为中断服务程序或中断处理程序。 现行程序被打断的地方称为断点,执行完中断服务程序后返回断点处继续执行主程序称为中断返回。这个处理过程称为中断处理过程,中断处理过程示意图如图所示,其大致可以分为四步:中断请求、中断响应、中断服务和中断返回。
1. 中断响应 当某个中断请求产生后,CPU进行识别并根据中断屏蔽位判断该中断是否被屏蔽。若该中断请求已被屏蔽,仅将中断寄存器中该中断的标志位置位,CPU不作任何响应,继续执行当前程序;若该中断请求未被屏蔽,不仅中断寄存器中该中断的标志位将置位,CPU还执行以下步骤响应异常。 (1)保护现场。 保护现场是为了在中断处理完成后可以返回断点处继续执行下去而在中断处理前必须做的操作。在计算机系统中,保护现场通常是通过将CPU关键寄存器进栈实现的。 (2)找到该中断对应的中断服务程序的地址。
2. 执行中断服务程序 每个中断都有自己对应的中断服务程序,用来处理中断。CPU响应中断后,转而执行对应的中断服务程序。通常,中断服务程序,又称中断服务函数(interrupt service routine),由用户根据具体的应用使用汇编语言或C语言编写,用来实现对该中断真正的处理操作。 中断服务程序具有以下特点:
(1)中断服务程序是一种特殊的函数(function),既没有参数,也没有返回值,更不由用户调用,而是当某个事件产生一个中断时由硬件自动调用。
(2)在中断服务程序中修改,在其他程序中访问的变量,在其定义和声明时要在前面加上 volatile修饰词。
(3)中断服务程序要求尽量简短,这样才能够充分利用CPU的高速性能和满足实时操作的要求。 3. 中断返回
CPU执行中断服务程序完毕后,通过恢复现场(CPU关键寄存器出栈)实现中断返回,从断点处继续执行原程序。
中断优先级与中断嵌套
1. 中断优先级 计算机系中的中断源众多,它们也有轻重缓急之分,这种分级就被称为中断优先级。一般来说,各个中断源的优先级都有事先规定。通常,中断的优先级是根据中断的实时性、重要性和软件处理的方便性预先设定的。当同时有多个中断请求产生时,CPU会先响应优先级较高的中断请求。由此可见,优先级是中断响应的重要标准,也是区分中断的重要标志。
2. 中断嵌套 在计算机系统中,中断嵌套是指当系统正在执行一个中断服务时又有新的中断事件发生而产生了新的中断请求。此时,CPU如何处理取决于新旧两个中断的优先级。当新发生的中断的优先级高于正在处理的中断时,CPU将终止执行优先级较低的当前中断处理程序,转去处理新发生的,优先级较高的中断,处理完毕才返回原来的中断处理程序继续执行。通俗地说,中断嵌套其实就是更高一级的中断“加塞儿”,当CPU正在处理中断时,又接收了更紧急的另一件“急件”,转而处理更高一级的中断的行为。
STM32F1中断系统
STM32F1嵌套向量中断控制器NVIC
向量中断控制器简称NVIC(Nested Vectored Interrupt Controller),是Cortex-M3不可分离的一部分。 NVIC与Cortex-M3内核相辅相成,共同完成对中断的响应。NVIC的寄存器以存储器映射的方式访问,除了包含控制寄存器和中断处理的控制逻辑之外,NVIC还包含了MPU、SysTick定时器及调试控制相关的寄存器。 STM32可支持68个中断通道,已经固定分配给相应的外部设备,每个中断通道都具备自己的中断优先级控制字节(8位,但是STM32中只使用4位,高4位有效),每4个通道的8位中断优先级控制字构成一个32位的优先级寄存器。68个通道的优先级控制字至少构成17个32位的优先级寄存器。
每个外部中断与NVIC中的下列寄存器中有关:
(1)使能与除能寄存器(除能也就是平常所说的屏蔽)。
(2)挂起与解挂寄存器。
(3)优先级寄存器。
(4)活动状态寄存器。 另外,下列寄存器也对中断处理有重大影响:
(1)异常屏蔽寄存器(PRIMASK、FAULTMASK及BASEPRI)。
(2)向量表偏移量寄存器。
(3)软件触发中断寄存器。
(4)优先级分组段位。
STM32F1中断优先级
中断优先级决定了一个中断是否能被屏蔽,以及在未屏蔽的情况下何时可以响应。优先级的数值越小,则优先级越高。 STM32(Cortex-M3)中有两个优先级的概念:抢占式优先级和响应优先级,也把响应优先级称作“亚优先级”或“副优先级”,每个中断源都需要被指定这两种优先级。
1. 何为抢占式优先级(preemption priority) 高抢占式优先级的中断事件会打断当前的主程序/中断程序运行,俗称中断嵌套。
2. 何为响应优先级(subpriority) 在抢占式优先级相同的情况下,高响应优先级的中断优先被响应。 在抢占式优先级相同的情况下,如果有低响应优先级中断正在执行,高响应优先级的中断要等待已被响应的低响应优先级中断执行结束后才能得到响应(不能嵌套)。
3. 判断中断是否会被响应的依据 首先是抢占式优先级,其次是响应优先级。抢占式优先级决定是否会有中断嵌套。
4.优先级冲突的处理 具有高抢占式优先级的中断可以在具有低抢占式优先级的中断处理过程中被响应,即中断的嵌套,或者说高抢占式优先级的中断可以嵌套低抢占式优先级的中断。 当两个中断源的抢占式优先级相同时,这两个中断将没有嵌套关系,当一个中断到来后,如果正在处理另一个中断,这个后到来的中断就要等到前一个中断处理完之后才能被处理。如果这两个中断同时到达,则中断控制器根据它们的响应优先级高低来决定先处理一个;如果它们的抢占式优先级和响应优先级都相等,则根据它们在中断表中的排位顺序决定先处理哪一个。
STM32F1中断向量表
中断向量表是中断系统中非常重要的概念。它是一块存储区域,通常位于存储器的地址处,在这块区域上按中断号从小到大依次存放着所有中断处理程序的入口地址。当某中断产生且经判断其未被屏蔽,CPU会根据识别到的中断号到中断向量表中找到该中断的所在表项,取出该中断对应的中断服务程序的入口地址,然后跳转到该地址执行STM32F1产品的中断向量表如书表所示。
STM32F1中断服务函数
STM32F103所有的中断服务函数在该微控制器所属产品系列的启动代码文件 startup_stm32f10x_xx.s中都有预定义,通常以PPP_IRQHandler命名,其中PPP是对应的外设名。用户开发自己的STM32F103应用时可在文件stm32f10x_it.c中使用C语言编写函数重新定义之。程序在编译、链接生成可执行程序阶段,会使用用户自定义的同名中断服务程序替代启动代码中原来默认的中断服务程序。 STM32F103的中断服务函数具有以下特点:
(1)预置弱定义属性。除了复位程序以外,STM32F103其他所有中断服务程序都在启动代码中预设了弱定义(WEAK)属性。用户可以在其他文件中编写同名的中断服务函数替代在启动代码中默认的中断服务程序。
(2)全C实现。STM32F103中断服务程序,可以全部使用C语言编程实现,无须像以前Arm7或Arm9处理器那样要在中断服务程序的首尾加上汇编语言“封皮”用来保护和恢复现场(寄存器)。STM32F103的中断处理过程中,保护和恢复现场的工作由硬件自动完成,无须用户操心。用户只需集中精力编写中断服务程序即可。