中断系统
中断
在主程序运行中,出现了特定的中断触发条件(中断源),使得CPU暂停当前正在运行的程序,转而去处理中断程序,处理完成后又返回原来被暂停的位置继续运行
中断优先级
当有多个中断源同时申请中断时,CPU会根据中断源的轻重缓急进行裁决,优先响应更紧急的中断源
中断嵌套
当一个中断程序正在执行时,又有新的更优先级的中断源申请中断,CPU再次暂停当前中断程序,转而去处理新的中断程序,处理完成后一次进行返回
STM32的中断
68个可屏蔽中断通道,包含EXIT、TIM、ADC、USART、SPI、I2C、RTC等多个外设。使用NVIC统一管理中断,每个中断通道都拥有16个可编程的优先等级,可对优先级进行分组,进一步设置抢占优先级和响应优先级。STM32F103C8T6的中断向量表在参考手册9.1.2节。
NVIC
嵌套向量中断控制器(Nested Vectored Interrupt Controller),这是用来统一分配和管理中断的
这里涉及到中断的外设非常的多,如果每个中断都接在CPU上,那么会很麻烦,内核外设NVIC就能减轻CPU的负担。比如CPU是负责看病的医生,那么NVIC就是叫号系统,在一般情况下,病人(中断源)会根据优先级来看病,但有时候会有更紧急的病人(抢占优先级高),这时候哪怕已经有病人在看病,也要暂停来给更紧急的病人看病。
响应优先级
当有多个中断源向CPU申请中断时,那么会处理响应优先级更高的中断。
抢占优先级
当抢占优先级更高的中断源响应时,即使CPU正在处理其他中断,CPU也要先去处理抢占优先级更高的中断,假如这时候有抢占优先级更高的中断响应时,会处理那个中断,这样就形成了中断嵌套。在通讯过程中如果没有即使响应中断,那么这次的数据会被下一次的数据覆盖掉。
NVIC优先级分组
EXIT外部中断
EXIT(Extern Interrupt)简介
EXTI基本结构
中断引脚只能选择16个,例如GPIOA1和GPIOB0可以作为外部中断触发的引脚,但是GPIOA1和GPIOB1不能同时作为外部中断的引脚。EXTI的通道5~9和10~15被分配到了两个通道,也就是说5~9引脚会触发同一个中断函数,使用这些引脚的时候要判断中断源。
EXTI框图
触发方式
上升沿触发:低电平到高电平触发
下降沿触发:高电平到低电平触发
软件触发:在程序特定位置触发中断
双边沿触发:上升和下降沿均可触发
工作过程
边沿检测电路检测引脚电平变化,软件也可以触发中断最后可以选择进入上面的NVIC中,也可已选择下面来触发其他外设工作。
AFIO选择
另外四个EXTI线的连接方式如下:
● EXTI线16连接到PVD输出
● EXTI线17连接到RTC闹钟事件
● EXTI线18连接到USB唤醒事件
● EXTI线19连接到以太网唤醒事件(只适用于互联型产品)
AFIO是外设,使用前要先开启相应时钟
相关寄存器
中断屏蔽寄存器
事件屏蔽寄存器
上升沿触发选择寄存器
下降沿触发选择寄存器
软件中断事件寄存器
挂起寄存器
函数分析
EXTI函数
EXTI_DeInit
该函数是把EXTI寄存器恢复成上电状态
EXTI_Init
EXIT_InitTypeDef结构体
EXTI_StructurtInit
EXTI_GenerateSWInterrupt![](https://img-blog.csdnimg.cn/8f80acbb2da649b483102e633cc549f9.png)
NVIC函数
NVIC_PriorityGroupConfig
这是进行中断优先级的分组
配置的参数是中断优先级的分组
NVIC_Init
配置NVIC的函数也是结构体指针的方式
NVIC_InitTypeDef结构体
第一是通道的选择,在IRQn_Type结构体里面有很多条件编译,这里要根据自己芯片型号来选择参数。第二个是配置抢占优先级,第三个变量是响应优先级。 最后一个是使能。
中断函数
中断函数的向量表在启动文件里面,中断函数都是以IRQHandler结尾,根据自己配置的中断通道来选择中断函数。
程序实例
硬件配置
先开启GPIOB和复用IO的时钟,将14引脚配置成上拉输入模式,选择GPIOB为通道14,再配置线路和中断有限级