目录
什么是中断?
CPU在正常执行程序的过程中,由于内部/外部事件的触发或程序的预先安排引起CPU暂时中断当前正在运行的程序,而转去执行中断服务子程序,待中断服务子程序执行完毕后,CPU继续执行原来的程序,这一过程称为中断;
中断处理的过程:
第一步:保护现场,将当前位置的PC地址压栈;
第二步:跳转到中断服务程序,执行中断服务程序;
第三步:恢复现场,将栈顶的值回送给PC;
第四步:跳转到被中断的位置开始执行下一个指令
中断响应时间:
收到中断信号到操作系统做出响应,并完成切换转入到中断服务程序的时间。
一、NVIC简介
NVIC是嵌套向量中断控制器,控制整个芯片中断相关的功能,他跟内核紧密耦合,是内核里面的一个外设。
1. NVIC寄存器简介

在配置中断的时候我们一般只用ISER、ICER和IP这三个寄存器,ISER用来使能中断,ICER用来失能中断,IP用来配置中断优先级。
2. 优先级定义
在NVIC有一个专门的寄存器:中断优先级寄存器NVIC——IPRx,用来配置外部中断的优先级,IPR宽度为8bit,原则上每个外部终端可配置的优先级为0-255,数值越小,优先级越高。
多数CM3芯片都会精简设计,以致实际上支持的优先级数减少,在F103中,只使用高4bit。
用于表达优先级的这 4bit,又被分组成抢占优先级和子优先级。如果有多个中断同时响应,抢占优先级高的就会抢占抢占优先级低的优先得到执行,如果抢占优先级相同,就比较子优先级。如 果抢占优先级和子优先级都相同的话,就比较他们的硬件中断编号,编号越小,优先级越高。
3. 中断编程
在配置中断的时候有3个编程要点:
- 使能外设某个中断,具体由每个外设的相关中断使能位控制;
- 初始化MVIC_InitTypeDef结构体,配置中断优先级分组,设置抢占优先级和子优先级,使能中断请求;
- 编写中断服务函数:为了初始化中断向量表,在启动文件中预先为每个中断都写了一个空的中断服务函数。实际的中断服务函数需要重新编写(中断服务函数的函数名必须跟启动文件里面预先设置的一样)。
二、EXTI——外部中断/事件控制器
EXTI(External interrupt/event controller)——外部中断/事件控制器,管理了控制器的20个中断/事件线。每个中断/事件线都对应有一个边沿检测器,可以实现输入信号的上升/下降沿的检测。EXTI可以实现对每个中断/事件线进行单独配置,可以单独配置为中断或者事件,以及触发事件的属性。

EXTI可分为两大部分功能,一个是产生中断,另一个是产生事件。
产生中断线路目的是把输入信号输入到 NVIC,进一步会运行中断服务函数实现功能是软件级的。产生事件线路目的就是传输一个脉冲信号给其他外设使用,并且是电路级别的信号传输,属于硬件级的。
1. 产生中断线路介绍(红色虚线):
- 编号1是输入线,EXTI控制器有19个中断/时间输入线,这些输入先可以通过寄存器设置为任意GPIO,也可以是一些外设的事件。输入线一般是存在电平变化的信号。
- 编号2 是一个边沿检测电路,它会根据上升沿触发选择寄存器 (EXTI_RTSR) 和下降沿触发选择寄存器 (EXTI_FTSR) 对应位的设置来控制信号触发。如果有边沿跳变就输出有效信号1给编号3 电路;
- 编号3电路 是一个或门电路,输入分别来自编号2电路和软件中断事件寄存器(EXTI_SWIER)。EXTI_SWIER允许我们通过程序控制就可以启动中断/事件线。两个输入随便一个有效就可以输出1给编号4 和 编号6 电路;
- 编号4 电路是一个与门电路,输入分别来自编号3电路和中断屏蔽寄存器(EXTI_IMR)。可以通过控制EXTI_IMR来实现是否产生中断的目的。如果确定编号4 电路输出为1就会把EXTI_PR对应位置置1;
- 编号5 是将EXTI_PR寄存器内容输出到NVIC内,从而实现系统中断事件控制。
2. 产生事件线路(绿色虚线):
- 编号1是输入线,EXTI控制器有19个中断/时间输入线,这些输入先可以通过寄存器设置为任意GPIO,也可以是一些外设的事件。输入线一般是存在电平变化的信号。
- 编号2 是一个边沿检测电路,它会根据上升沿触发选择寄存器 (EXTI_RTSR) 和下降沿触发选择寄存器 (EXTI_FTSR) 对应位的设置来控制信号触发。如果有边沿跳变就输出有效信号1给编号3 电路;
- 编号3电路 是一个或门电路,输入分别来自编号2电路和软件中断事件寄存器(EXTI_SWIER)。EXTI_SWIER允许我们通过程序控制就可以启动中断/事件线。
- 编号6电路 是一个与门电路,输入分别来自于编号3电路 和 事件屏蔽寄存器(EXTI_EMR)。可以简单的控制EXTI_EMR来实现是否产生事件的目的。
- 编号7 是一个脉冲发生器电路,当编号6输出有效信号1时就会产生一个脉冲。
- 编号8是一个脉冲信号,这个脉冲信号可以给其他外设电路使 用,比如定时器 TIM、模拟数字转换器 ADC 等等,这样的脉冲信号一般用来触发 TIM 或者 ADC 开始转换。
三、外部中断控制实验
实验流程:
- 初始化用来产生中断的GPIO;
- 初始化EXTI;
- 配置NVIC;
- 编写中断服务函数;