观前提醒:本文简要回顾了EXTI及NVIC相关知识点,分析了stm32f1系列单片机外部中断回调机制
开始之前,先温习一下有关EXTI和NVIC的知识点
外部中断/事件控制器(EXTI)
对于互联型产品(105、107系列),外部中断/事件控制器由20个产生事件/中断请求的边沿检测器组成,对于其它
型号,则有19个能产生事件/中断请求的边沿检测器。
每个输入线可以独立地配置输入类型(脉冲或挂起)和对应的触发事件(上升沿或下降沿或者双边沿都触发)。每个输入线都可以独立地被屏蔽。挂起寄存器保持着状态线的中断请求
简而言之:EXTI是一个检测器,检测到符合条件的边沿,即向NVIC发送中断请求(此处仅讨论中断)
外部中断/事件控制器框图:
嵌套向量中断控制器(NVIC)
NVIC英文全称是Nested Vectored Interrupt Controller,中文意思就是嵌套向量中断控制器,它属于M3内核的一个外设,控制着芯片的中断相关功能。由于ARM给NVIC预留了非常多的功能,但对于使用M3内核设计芯片的公司可能就不需要这么多功能,于是就需要在NVIC上裁剪。ST公司的STM32F103芯片内部中断数量就是NVIC裁剪后的结果。中断控制相关寄存器在固件库core_cm3.h文件NVIC结构体内。可打开任意库函数工程即可查看到。NVIC和处理器核的接口紧密相连,可以实现低延迟的中断处理和高效地处理晚到的中断。
STM32F103芯片支持60个可屏蔽中断通道,并且每个中断通道都具有自己的中断优先级控制字节。这些中断优先级控制字节由8位组成,但在STM32F103芯片中,只使用其中的高4位,即4位优先级。
在STM32F103芯片中,中断优先级分为抢占式优先级和响应优先级(亚优先级或副优先级)两部分。抢占式优先级用于决定中断事件是否能够打断当前正在执行的主程序或中断程序,而响应优先级用于确定同一抢占式优先级下,中断的相对优先级。
当两个中断的抢占式优先级相同时,高响应优先级的中断会先被响应和处理。也就是说,如果两个中断同时到达,具有更高响应优先级的中断将先被处理。
当两个中断的抢占式优先级不同时,具有较高抢占式优先级的中断可以打断正在执行的较低抢占式优先级中断。这种情况下,中断嵌套发生,高抢占式优先级的中断会打断当前正在执行的较低抢占式优先级中断,并开始执行自己的中断服务程序。
当两个中断的抢占式优先级相同时,如果一个中断正在处理,而另一个中断到达,后到达的中断需要等待前一个中断处理完毕后才能被处理。如果两个中断同时到达,中断控制器会根据它们的响应优先级来决定先处理哪个中断。如果它们的抢占式优先级和响应优先级都相等,则根据它们在中断表中的排位顺序决定先处理哪个。
简而言之:NVIC的功能是管理和控制中断的优先级和中断服务程序的执行。
当然这都是形而上的解释,最通俗易懂的说,NVIC应该是“厕所管理员”,它用于控制中断优先缓急以及嵌套中断和打扫“厕所”。
说起来很复杂,但是在实际操作中,复杂操作都被封装好了,我们只需要几行代码就能完成设置。
就比如上篇中配置NVIC的代码: