STM32 的中断解析

中断定义及其执行过程

中断是指在主程序运行过程中,出现了特定的中断触发条件(中断源),使得CPU暂停当前正在运行的程序,转而去处理中断程序,处理完成后又返回原来被暂停的位置继续运行。
STM32微控制器有68个可屏蔽中断通道(包含EXTI、TIM、ADC、USART、SPI、I2C、RTC等多个外设)和16个可编程的优先等级(使用了4位中断优先级)。
这里需要解释两个词“可屏蔽中断”和“优先等级”。
按照是否可以被屏蔽,中断分为两大类:不可屏蔽中断、可频闭中断。不可屏蔽中断是指一旦发生了这种中断,CPU必须无条件进行相应;而可屏蔽中断是指发生了这种中断后,CPU可以对该中断进行响应也可以不进行响应。
优先等级指的是CPU响应中断的先后次序,如果同一时刻有两个中断被触发,那么CPU会根据优先等级按先后顺序对中断进行响应,先响应优先等级高的,然后再响应优先等级低的。其可能存在嵌套过程,当一个中断程序正在运行时,又有新的更高优先级的中断源申请中断,CPU再次暂停当前中断程序,转而去处理新的中断程序,处理完成后依次进行返回。中断的执行过程如下所示。
在这里插入图片描述

嵌套中断向量控制器NVIC

STM32微控制器的中断响应以及中断优先级配置均由NVIC控制,NVIC支持中断嵌套,即优先级高的中断可以抢占低优先级的中断,导致低优先级中断挂起,挂起是指暂停正在进行中的中断,转而执行跟高级别或同级别中断。如中断执行过程图右侧的第一个中断就是被挂起。
在这里插入图片描述
NVIC的结构如图所示,所有的中断都是先经过NVIC的处理后才到达CPU,CPU先响应哪个中断都是由NVIC决定。所以在程序的编写过程中如果有用到中断就一定要对NVIC进行配置。 使用NVIC统一管理中断,每个中断通道都拥有16个可编程的优先等级,可对优先级进行分组,进一步设置抢占优先级和响应优先级。
在这里插入图片描述
如图STM32共有5种中断优先级的分配方式。不同的分组方式其抢占优先级和响应优先级的位数和取值范围不一样。抢占优先级高的可以中断嵌套,响应优先级高的可以优先排队,抢占优先级和响应优先级均相同的按中断号排队。简单的说就是抢占优先级高的可以打断抢占优先级低的中断响应,而同一抢占优先级下的响应优先级按其优先级排队,但是不能打断正在进行的中断。

外部中断/事件控制器(EXTI)

EXTI是外部中断/事件控制器,可以监测指定GPIO口的电平信号,当其指定的GPIO口产生电平变化时,EXTI将立即向NVIC发出中断申请,经过NVIC裁决后即可中断CPU主程序,使CPU执行EXTI对应的中断程序。
支持的触发方式:上升沿、下降沿、双边沿和软件触发。
支持的GPIO口:所有GPIO口,但相同的Pin不能同时触发中断(因为其所对应中断线相同)
触发响应方式:中断响应/事件响应
在这里插入图片描述
EXTI支持所有的I/O触发中断,但I/O口的数量很多,若每一个I/O口用一个中断线的的话,中断线的数量将会很多,所以为了易于管理,STM32采用I/O口与中断线映像的方式以此减少中断线的数量。
如上图,PA0、PB0、PC0…PG0均映像到EXTI0中断线,PA1、PB1、PC1…PG1均映像到EXTI1中断线,后续映像以此类推至EXTI15。所以相同的Pin不能同时触发中断,因为一个中断线只能映像到一个端口,例如若PA0已经作为了EXTI0的外部中断输入,那么PB0、PC0…PG0就不能作为EXTI0的外部中断输入。但需要注意的是,在程序的编写时,EXTI0~ EXTI4中断线均有其单独的输入通道,但是EXTI5~ EXTI15中断线没有其单独的通道,EXTI5~ EXTI9的通道合并为了EXTI9_5,EXTI10~ EXTI15通道合并为了EXTI15_10,需要通过标志位来区分是哪一个中断线的中断。
在这里插入图片描述
EXTI结构框图如图所示。从右下角开始,外部中断信号经过输入线后到达边沿检测电路,边沿检测电路由上升沿触发选择寄存器和下升沿触发选择寄存器控制,通过这两个寄存器相应位的配置可以实现上升沿触发、下降沿触发和双边沿触发。边沿检测电路过后是一个或门,或门两个的输入分别是软件中断事件寄存器信号和边沿检测电路信号,也就是EXTI触发方式中的边沿触发和事件触发。或门过后又分为两路,向上进入请求挂起寄存器就是进入到中断响应,若直接输入到与门就是进入到事件响应,这两路也就是EXTI触发响应方式中的中断响应和事件响应。 具体进入到哪一种响应方式由请求挂起寄存器和事件屏蔽寄存器的响应位控制。若是中断响应,信号经由或门出来后再通过请求挂起寄存器和中断屏蔽寄存器相应位设置允许后到达NVIC中断控制器,由NVIC处理后交由CPU处理;若是事件中断,信号经由或门出来后通过事件屏蔽寄存器相应位设置允许后激活脉冲发生器,脉冲发生器产生脉冲使能相应内置外设进行工作。
框图的上半部分APB总线连接外设接口,然后外设接口再连接各个寄存器,这表示CPU可通过APB总线访问各个寄存器,对寄存器进行相应的操作。
从EXTI结构框图中我们可以看出EXTI的触发方式和触发响应。
注意:在使用外部中断时必须开启AFIO时钟。 AFIO时钟只有在将GPIO用于EXTI外部中断或者在使用重映射功能时使用。

总结

中断是STM32的一个重要应用,理清中断的过程和配置方法更有利于后续的系统学习。
在这里插入图片描述
STM32中断过程大致可如图所示,各中断源将中断信号交NVIC处理后送入CPU,CPU响应各个中断源。

猜你喜欢

转载自blog.csdn.net/Tao_9/article/details/129927831