目录
一、认识中断
1.理解
STM32中断非常强大,每个外设都可以产生中断。异常就是中断,中断就是异常,二者相同。
2.异常类型
F103在内核水平上搭载了一个异常响应系统,支持为数众多的系统异常和外部中断。其中系统异常有8个(如果把 Reset 和Hard Faut 也算上的话就是10个)。外部中断有60个。除了个别异常的优先级被定死外,其他异常的优先级都是可编程的。有关具体的系统异常和外部中断可在标准库文件 stm32f10x.h头文件中查询到,在IRQn_Type这个结构体里面包含了 F103系列全部的异常声明。
3.NVIC简介
NVIC是嵌套向量中断控制器,控制着整个芯片中断相关的功能,它跟内核紧密耦合,是内核里面的一个外设。但是各个芯片厂商在设计芯片的时候会对 Cortex-M3 内核里面的NVIC 进行裁剪,把不需要的部分去掉,所以说STM32中的NVIC是 Cortex-M3的NVIC的一个子集。
在固件库中,NVIC的结构体定义给每个寄存器都预留了很多位,为的是日后扩展功能。在配置中断的时候一般只用ISER、 ICER和IP这3个寄存器,ISER用来使能中断,ICER 用来清除中断,IP用来设置中断优先级。
二、中断优先级
1.定义
在NVIC中有一个专门的寄存器:中断优先级寄存器NVIC_IPRx,用来配置外部中断的优先级,IPR宽度为8位,原则上每个外部中断可配置的优先级为0~255,数值越小,优先级越高。但是绝大多数CM3芯片都会精简设计,以致实际上支持的优先级数减少,在F103中,只使用了高4位。
用于表达优先级的这4位,又被分成抢占优先级和子优先级两组。如果有多个中断同时响应,抢占优先级高的就会先于抢占优先级低的,优先得到执行,如果抢占优先级相同,就比较子优先级。如果抢占优先级和子优先级都相同的话,就比较它们的硬件中断编号,编号越小,优先级越高。
2.优先级分组
优先级的分组由内核外设 SCB的应用程序中断及复位控制寄存器AIRCR的PRIGROUP[10:8]位决定。F103分为了5组(主优先级=抢占优先级)。
3.中断服务函数
在启动文件 startup_stm32f10x_hd.s中,以预先为每个中断都写了一个中断服务函数,只是这些中断函数都为空,为的只是初始化中断向量表。实际的中断服务函数都需要我们重新编写,为了方便管理把中断服务函数统一写在stm32f10x_it.c这个库文件中。
注意:中断服务函数的函数名必须与启动文件里面预先设置的一样,如果写错,系统就在中断向量表中找不到中断服务函数的入口,直接跳转到启动文件里面预先写好的空函数,并且在里面无限循环,实现不了中断。