文章目录
前言
提示:本文主要用作在学习江科大自化协STM32入门教程后做的归纳总结笔记,旨在学习记录,如有侵权请联系作者
本文主要探讨STM32中断系统、NVIC以及EXTI外部中断相关概念。中断系统是管理和执行中断的逻辑结构,外部中断是众多能产生中断的外设之一,本章节就借助外部中断来学习一下中断系统。
一、中断系统
1.1 中断系统简介
所谓的中断就是在主程序运行过程中,出现了特定的中断触发条件(中断源),使得CPU暂停当前正在运行的程序,转而去处理中断程序,处理完成后又返回原来被暂停的位置继续运行。
中断有优先级之分,当有多个中断源同时申请中断时,CPU会根据中断源的轻重缓急进行裁决,优先响应更加紧急的中断源。中断还能嵌套,当一个中断程序正在运行时,又有新的更高优先级的中断源申请中断,CPU再次暂停当前中断程序,转而去处理新的中断程序,处理完成后依次进行返回。
1.2 中断的执行流程
正常情况下,程序就是在主程序中不断循环执行,当中断条件满足时,主程序就会暂停,然后自动跳转到中断程序里运行,中断程序执行完之后,再返回主程序执行。一般中断程序都是在一个子函数里,这个函数不需要我们调用,当中断来临时,由硬件自动调用这个函数,这就是在c语言中中断的执行流程。
1.3 STM32中断
在STM32中一共有68个可屏蔽的中断通道,包含EXTI、TIM、ADC、USART、SPI、I2C、RTC等多个外设。STM32使用NVIC统一管理中断,每个中断通道都拥有16个可编程的优先等级,可对优先级进行分组,进一步设置为抢占优先级和响应优先级。
下图为STM32的中断资源,上面灰色的是内核中断(我们一般不用,了解即可),下面不是灰色的部分就是STM32外设的中断了。
图中最右边是中断的地址,因为程序中的中断函数的地址是由编译器来分配的,是不固定的,但是我们的中断跳转由于硬件的限制只能跳到固定的地址执行程序,所以为了硬件能够跳转到一个不固定的中断函数里,这里就需要在内存中定义一个地址的列表。这个列表的地址是固定的,中断发生后,就跳到这个固定位置,然后在这个固定位置,由编译器,再加上一个跳转到中断函数的代码,这样中断跳转就可以跳转到任意位置了。这个中断地址的列表,就叫中断向量表,相当于中断跳转的一个跳板,不过我们用c编程是不需要管这个中断向量表的,因为编译器都帮我们做好了。
二、NVIC(Nested Vectored Interrupt Controller) 嵌套向量中断控制器
2.1 NVIC简介
在STM32中,NVIC(Nested Vectored Interrupt Controller,嵌套向量中断控制器)是用来统一分配中断优先级和管理中断的。NVIC是一个内核外设,是CPU的小助手。我们刚才看到了,STM32的中断非常多,如果把这些中断全都接到CPU上,那CPU还得引出很多线进行适配,设计上就很麻烦。并且如果很多中断同时申请,或者中断很多,产生了拥堵,CPU也会很难处理,毕竟CPU主要是用来运算的,那这样的话中断分配的任务就放到别的地方吧,所以NVIC就出现了。
2.2 NVIC基本结构
NVIC有很多输入口,你有多少个中断线路都可以接过来。比如这里可以接EXTI、TIM、ADC、USART等等。这里线上画了个斜杠,上面写了个n,这个意思是一个外设可能会同时占用多个中断通道,所以这里有n条线。然后NVIC只有一个输出口,NVIC根据每个中断的优先级分配中断的先后顺序,最后通过右边这一个输出口告诉CPU,你该处理哪个中断。