STM32中断
中断基本概念
中断指主程序运行过程中,某个特定事件或条件发生时,CPU会暂停当前程序执行,去处理中断事件,当中断事件处理完毕后,CPU恢复原来的程序
中断优先级
在STM32中有各种各样的中断,这些中断可能会同时发生,这时候就需要根据预设的优先级来确定哪个中断优先处理
中断嵌套
当处理中断过程中,如果有更高优先级的中断发生,CPU会暂停当前中断,去处理新的更优先级的中断,处理完后再处理当前中断的中断,这种现象就叫中断嵌套

STM32中断
STM32有68个可屏蔽中断通道(F1系列最多的中断数量,实际以手册为准,如:F103C8只有60个),包含EXTI, TIM, ADC, USART, SPI, I2C, RTC等多个外设。这些中断使用NVIC统一管理。每个中断通道有16个可编程的优先级,可以对优先级分组,进一步设置抢占优先级和响应优先级

NVIC基本结构
NVIC(Nested Vectored Interrupt Controller),嵌套向量中断控制器,负责中断的统一管理和优先级分配, 是一个内核外设,帮助CPU处理大量中断请求。NVIC作为中断管理单元,承担了中断优先级的划分和管理任务


NVIC中断优先级分组
NVIC有优先级配置寄存器,寄存器宽度为8位(bit)(理论上可以配置优先级0-255), 但是STM32只使用了其中的高四位,因为大量优先级会增加NVIC的复杂度,从而增加功耗降低速度。使用4位最多可以配置0-16个中断优先级

这4位在进行切分,可切分为高n位的抢占优先级和低4-n位的响应优先级,两个优先级都是数值越小,优先级越高
其中,抢占优先级高的可以中断嵌套,响应优先级高的可以优先排队,但无法中断嵌套。如果抢占优先级和响应优先级都一样,则按中断号排队(中断向量表图在本节首)

EXTI外部中断
EXTI外部中断用于监控和响应GPIO端口的电平变化,当指定的GPIO口发生电平变化时,EXTI会立即项NVIC发出中断请求。EXTI的基本功能就是通过监控引脚电平的变化,触发中断并中断CPU的主程序,执行特定的中断处理程序
EXTI四种触发方式:
1、上升沿触发:GPIO电平0->1,产生中断请求
2、下降沿触发:GPIO电平1->0, 产生中断请求
3、双边沿触发:GPIO电平发生上升沿或下降沿时,都会触发中断请求
4、软件触发:可以通过软件手动触发一个中断,而不依赖引脚电平的变化
EXTI支持几乎所有的GPIO口,但是同一个引脚不能同时用于多个中断源例如:PA0,PB0,PC0,虽然是不同的端口,但是引脚编号相同,所以不能同时作为中断引脚,而PA0, PB1,引脚编号不同,可以同时用作中断源。
STM32的EXTI支持16个GPIO引脚, 以及4个特定的外设信号,分别为:
PVD(电源电压检测)输出
RTC(实时时钟)闹钟
USB唤醒信号
以太网唤醒信号
外部中断的触发响应方式:
1、中断响应:CPU暂停当前程序并执行中断程序
2、事件响应:不会触发中断,触发其他外设的操作,不一定需要中断CPU程序
基本结构

EXTI只有16个GPIO通道,但是每组GPIO外设都有16个引脚,所以EXTI的16个通道无法同时满足所有GPIO引脚,为了解决这个问题,STM32引入了AFIO中断引脚选择模块,可以在每组GPIO的16个引脚中选择一个通过AFIO在接入EXTI通道
因此,EXTI的输入信号由16个GPIO通道,加上4个特定外设通道(PVD(电源电压检测)、RTC(实时时钟)、USB唤醒以及以太网唤醒信号),一共20个输入信号。
AFIO作用
AFIO模块的核心作用是为每个GPIO外设引脚选择一个特定的中断通道,相同的引脚(Pin)不能同时触发多个中断。
STM32中AFIO主要完成两个任务:1、复用功能引脚重映射、2、中断引脚选择
中断与事件响应
EXTI分为两种输出:
1、接入NVIC触发中断:中断响应
需要注意的是,其中一部分(如外部中断5-9号和10-15号)可能会触发相同中断,这些中断被STM32整合为共用一个NVIC通道,在使用时,需要根据标志位来区分哪个具体的中断请求被触发。
2、接入其他外设,触发外设操作:事件响应