目录
一、中断的初探
概念:在程序运行过程中,出现了特定的中断触发条件(中断源),使得CPU暂停当前正在运行的程序,转而去处理中断程序,处理完成后又返回原来被暂停的位置继续运行。
中断优先级:当有多个中断源同时申请中断时,CPU会根据中断源的轻重缓急进行裁决,优先响应更加紧急的中断源。
中断嵌套:当一个程序运行时,又有新的更高优先级的中断源申请中断,CPU再次暂停当前中断程序,转而去处理新的中断程序,处理完成后依次进行返回。
STM32 有68个可屏蔽中断通道包含EXIT、TIM、ADC、USART、SPI、I2C、RTC等多个外设
使用NVIC统一管理中断,每个中断通道都拥有16个可编程的优先级,可对优先级进行分组,进一步设置抢占优先级和响应优先级
STM32(本课程使用的型号)中的中断资源如下表所示(表中灰色的部分是内核的中断资源,白色的部分是外设的中断资源)
STM32中,每一个中断资源都有对应的地址(如上表所示)。在编程实现中,我们将中断要执行的操作放在一个子函数中,但是这个中断函数的地址由编译器动态分配,并不是固定的。但是由于硬件电路的限制,中断跳转时必须跳转到固定的地址执行程序,所以为了使硬件能够跳转到一个不固定的中断函数里,就需要在内存中定义一个固定的地址列表,中断条件满足后,就跳转到对应的固定位置,然后由编译器和一句跳转到中断函数位置的代码,这样中断就能跳转到任意位置了。在上述过程中,我们将中断地址的列表成为中断向量表,相当于中断跳转的一个跳板。
应用C语言编程时,我们无需关心中断向量表的工作,这部分工作由编译器自动完成。
二、NVIC的结构
NVIC是一个内核外设,相当于CPU的一个“秘书”,也相当于医院中为医生和患者服务的叫号系统。STM32的中断种类非常多,如果将这些中断全部连接给CPU,在设计上的复杂度将难以估量;斌且如果很多中断同时申请,或者很多中断产生了拥堵,也会增大CPU的处理难度,变相降低了CPU的运算效率。
NVIC有很多输入口,可以连接不同外设的多条中断线路(通道)。上图中NVIC连接的每个外设线路上的 n nn 表示一个外设可能会同时占用多个中断通道。
NVIC只有一个输出口,连接到CPU。NVIC根据每个中断的优先级分配中断的先后顺序,然后通过输出口告知CPU应该处理哪个中断。对于中断先后顺序分配的任务,CPU不需要知道。
每个中断通道都拥有16个可编程的优先等级。 NVIC可以由此对优先级进行分组
三、NVIC优先级分组
NVIC的中断优先级由优先级寄存器的4位(0~15)决定,这四位可以进行切分、分为高n位的抢占优先级和低4-n位的响应优先级。
抢占优先级和响应优先级可以用医院看病的例子来解释,响应优先级高的,可以插队去看病,而抢占优先级不仅可以插队,还可以在上一个病人没看完病直接进去看病(中断嵌套)
这个优先级的数是值越小,优先级越高,0是最高优先级,抢占优先级和响应优先级相同的按照中断号排队
四、EXTI外部中断
1、简介
EXTI可以监测指定GPIO口的电平信号,当其指定的GPIO口产生电平变化时,EXTI立即向NVIC发出中断申请,经过NVIC裁决后即可中断CPU主程序,使CPU执行对应程序
支持的触发方式:上升沿、下降沿、双边沿、软件触发
支持的GPIO口:所有GPIO口,但相同的Pin不能同时触发中断(即PA1和PB1只能用一个当做触发中断的端口,如果有多个中断引脚,要选择不同pin的引脚)
通道数:16个GPIO_Pin,外加PVD输出,RTC闹钟,USB唤醒,以太网唤醒
触发响应方式:中断响应、事件响应
注:中断响应是正常的流程,引脚电平变化触发中断, 事件响应不会触发中断,而是触发别的外设操作,属于外设之间的联合工作
2、EXTI基本结构
注意:正常20路输入有20路的中断输出,但是ST公司觉得20个输出太多了