中断是指计算机在运行过程中,出现某些意外情况需要计算机处理时,计算机能自动暂停正在运行的程序并转入处理新情况的程序,处理完毕后又返回原先被暂停的程序继续运行的功能。
举一个生活中的例子来说明:小明在厨房干活,流程是烧水→洗菜→切菜→煮饭→煮汤。烧水需要10 min,当小明加完水点火后,需要等10 min才能烧完水。此时小明为了提高效率,不应该白白地等10 min,于是小明继续洗菜。洗菜的过程中,水烧开了,烧水壶发出了声音,小明停止手里正在洗菜的工作,把烧水的火关了,防止烧干,然后回来继续洗菜。
在这个过程中,小明洗菜等同于计算机正在处理当前程序。水烧开了等同于中断发生了;小明停止洗菜,去把火关了,等同于计算机开始处理新程序。之后小明继续回来洗菜等同于计算机返回原先被暂停的程序继续运行。
通过这个例子,我们可以知道中断有3个重要的因素:
(1)中断源。引发中断发生的原因,例如水烧开了就是一个中断源。
(2)中断处理函数。当中断发生时,我们必须为计算机指定该中断对应的处理函数,否则计算机不知道如何处理这个中断。例如小明把火关了这个动作就是中断处理函数。
(3)可返回。中断处理完后必须返回到原先的程序。
中断是计算机系统的关键技术之一,可以有效提高计算机的效率,满足实时性的要求。
STM32具有非常强大的中断系统,将中断分为两种类型:内核中断和外部中断,并将所有中断编排起来形成一个表,我们称之为中断向量表。需要注意的是,STM32系列芯片有很多型号,每种型号的中断向量表都不一样,读者需要根据自己的芯片型号到ST官网下载对应的芯片手册查看。本书只列出STM32F407系列芯片的中断向量表,如表4.1所示。
其中,-3~6被标黑的这几列属于内核中断。从7开始属于外部中断。
内核中断是不能被打断的,也不能设置优先级,它们凌驾于外部中断之上。常见的内核中断有:复位(Reset)、不可屏蔽中断(NMI)、硬中断(HardFault)等。
外部中断是我们学习的重点,可配置优先级。优先级分为两种:抢占优先级和响应优先级。
抢占优先级高的中断能打断抢占优先级低的中断,当优先级高的任务处理完后,再回来继续处理之前低优先级的中断任务。所以当存在多个抢占优先级不同的任务时,可能会出现抢占优先级的情况。
响应优先级又被称为次优先级,若两个任务的抢占式优先级一样,那么响应优先级较高的任务则先执行,且在执行的同时不能被下一个响应优先级更高的任务打断。
STM32F405xx/07xx和STM32F415xx/17xx具有82个可屏蔽中断通道,16个可编程优先级(使用了4位中断优先级),如表4.1所示。
表4.1 STM32F407中断向量表
续表
续表
由于STM32的中断系统比较复杂,所以内核中有一个专门管理中断的控制器:NVIC。
STM32标准库提供了一套通过NVIC来控制中断的API。我们首先来看一看NVIC_Init()函数,这套函数首先要定义并填充一个结构体:NVIC_InitTypeDef,该结构体的定义如下:
NVIC_IRQChannel:需要配置的中断向量。
NVIC_IRQChannelCmd:使能或者关闭相应中断向量的中断响应。
NVIC_IRQChannelPreemptionPriority:配置相应中断向量的抢占优先级。
NVIC_IRQChannelSubPriority:配置相应中断的响应优先级。
不过要注意的一点是,NVIC只可以配置16种中断向量的优先级,其抢占优先级和响应优先级都用一个4位的数字来决定。在库函数中,将其分为5种不同的分配方式。
第0组:所有的4位都可表示响应优先级,能够配置16种不同的响应优先级。中断优先级则都相同。
第1组:最高一位用来配置抢占优先级,剩余三位用来表示响应优先级。那么就有两种不同的抢占优先级(0和1)和8种不同的响应优先级(0~7)。
第2组:高两位用来配置抢占优先级,低两位用来配置响应优先级。那么两种优先级就各有4种。
第3组:高三位用来配置抢占优先级,低一位用来配置响应优先级。有8种抢占优先级和2种相应优先级。
第4组:所有位都用来配置抢占优先级,即有16种抢占优先级,没有响应属性。
这5种不同的分配方式,根据项目的实际需求来配置。
配置的API如下:
NVIC_PriorityGroupConfig();
其中括号内可以输入以下任一参数,代表不同的分配方式:
NVIC_PriorityGroup_0 NVIC_PriorityGroup_1 NVIC_PriorityGroup_2 NVIC_PriorityGroup_3 NVIC_PriorityGroup_4
本节主要讲述中断的作用,以及STM32F407的中断向量表、优先级、中断控制器,并简单讲解了STM32标准库中与中断控制器相关的API说明。下一节将通过一个实例使读者加深中断的理解,并学会使用中断。需要强调的是,中断是计算机、嵌入式最重要的概念之一,本书后面的章节都会涉及中断,希望读者能认真理解中断这一概念。