中断是所有单片机的核心,也是单片机中比较难掌握的一块内容,正好我学完中断以后,来做一个总结。
中断一般的类型有两种,第一个是系统异常,是属于内核级别的中断,第二个是外部中断,这是体现在外设方面。管理中断的一个很重要的寄存器是NVIC(嵌套向量中断寄存器)。
对于M3和M4内核的MCU,每个中断的优先级都是用寄存器中的8位来设置的。那就可以产生2^8 = 256个中断,但实际上是用不到这么多的,所以一般的芯片厂商都会做出自己的调制。其中用到最多的ST公司是用了高4位作为中断优先级的配置,这样就可以产生16级的中断。
在NVIC中,其中很重要的就是中断优先级的配置,一般来说,优先级分为抢占优先级和子优先级两种,其中抢占优先级的地位是大于子优先级的,也就是说如果我们配置A中断的抢占优先级大于B中断,那么不管A中断和B中断的子优先级谁高,都先执行A中断。但如果A中断和B中断的抢占优先级是一样的,那么才会比较他们的子优先级,子优先级谁高,那就先执行那一条中断。这样需要阐述一下,优先级的数字越低,优先级越高,也就说如果A的优先级是0,B的优先级的1,那么A的优先级是高于B的优先级的。
那可能有人会问,如果A和B的抢占优先级和子优先级都是一样的,那单片机会先执行哪一个中断呢。这时候就要设计到硬件优先级的概念,前面我们所说的抢占优先级和子优先级都是我们自己在软件上面配置的,其实在单片机上,每个设备都存在自己的硬件优先级,如果当配置的软件优先级完全相同的时候,单片机就会自己首先执行硬件优先级高的中断。关于硬件优先级的查找,我们可以在寄存器手册(当中的嵌套向量中断控制器)里面查看。(下面是我一部分的截图)
这时候肯定会有人觉得,那是不是内核的中断就一定优先于外设的中断呢,其实不是的,中断的优先级判断还是要通过我们设置的抢占优先级和子优先级来判断,如果一样的话,我们会发现在硬件优先级上面,内核的优先级是高于外设的,所以也只有当我们配置的软件优先级相同的时候,内核的优先级才会高于外设。
前面笔者写到,在STM32里面是控制NVIC_CR寄存器的高四位来设定优先级的。
这就是STM32的优先级配置的分组,一共分为5类,每一类的区别就是可以设定的抢占优先级和子优先级的个数不一样,比如0类15个数据都是用来设置子优先级的,而4类15个数据都用来设定抢占优先级。
在利用STM32F10X的固件库编程的时候,配置中断的步骤是这样的。
1.先选择优先级的分组
/* 用的是void NVIC_PriorityGroupConfig(uint32_t NVIC_PriorityGroup);/
这个函数的声明时在misc.h的文件下
2.通过结构体NVIC_InitTypeDef来初始化NVIC
3.在stm32f10x_it.c中编写相应在中断函数
/ 这里需要注意的是中断函数的函数名是固定的,是不能更改的,具体的函数名称可以在startup_stm32f1ox_md.s这个文件中找到 */