一、前言
《ARM MCU嵌入式开发 | 基于国产GD32F10x芯片》覆盖的知识点非常全面,中断在嵌入式开发中是必不可少的,尤其是裸板程序,也就是前后台系统的项目开发。中断是一种外设和处理器之间进行通信的机制,外部通过中断的方式来通知处理器有事情发生了,而处理器有专门的模块根据发生的事情的紧急程序来决定是否要暂停正在执行的程序来响应中断事件。由于中断机制的存在,正在执行的应用不用理会中断的发生和处理,中断响应程序也不用关心应用程序的执行状态,所有这些都交给中断控制器来处理,使程序开发变得更简单、处理器的执行更高效。
二、中断的详情
书籍中,作者从中断的概念谈起,然后引出“嵌套向量中断控制器NVIC”,然后讲解了“NVIC工作机制”,“NVIC配置”,EXTI中断,EXTI是属于MCU的外部中断,书籍描述内容如下图所示:
![1.jpg](//file1.elecfans.com/web2/M00/04/DB/wKgZombUcneAFZXCADEUgMLE0oc999.jpg)
在处理器中,所谓中断就是一个过程,即CPU正在执行程序过程中,遇到更加紧急的事件(内部的或外部的)需要处理。暂时中止当前程序的执行转而去为紧急事件服务,待服务完毕,再返回暂停处(断点)继续执行原来的程序。为事件服务的程序称为中断服务程序或中断处理程序,能引发中断的事件称为中断源。
按照事件发生的顺序,整个中断过程包括:①中断源发生中断请求;②判断当前处理机是否允许中断和该中断源是否被屏蔽;③按照优先权对当前发生的中断排队;④处理机执行完当前指令或当前指令无法执行完,立即停止当前程序,保护断点地址和处理机的当前状态,转入相应的中断服务程序;⑤执行中断服务程序;⑥恢复被保护的状态,执行“中断返回”指令后回到被中断的程序或转入其他程序。
基于Cortex-M3的GD32F10x有两个优先级的概念:抢占式优先级、响应式优先级。响应式优先级也叫“亚优先级”或“副优先级”,每个中断源都需要事先指定这两种优先级。抢占式优先级要高于响应式优先级,也就是说一个低抢占式优先级的中断程序正在执行时发生了一个高抢占式优先级的中断,则第1个中断要暂停,以此来响应这个新的中断,即所谓的中断嵌套。
在嵌入式系统中,中断嵌套是指当系统正在执行一个中断服务程序时,又有新的中断事件发生而产生了新的中断请求。此时,CPU对中断的响应式取决于这两个中断的优先级。如果两个中断的抢占式优先级相同,则再比较响应式优先级。值得注意的是,只要抢占式优先级相同,则不论它们的响应式优先级如何都是要等正在响应的中断程序执行完才会响应新的中断信号。只有当两个抢占式优先级相同的中断信号同时到达时,中断控制器才会根据它们的响应式优先级高低来决定先处理哪一个。
中断系统的另一个重要功能是中断屏蔽,即程序员可以通过设置相应的中断屏蔽位,禁止CPU响应某个中断,从而实现中断屏蔽。中断屏蔽的目的是保证在执行一些关键程序时不响应中断,以免造成延时而引起错误。
关于NVIC,即嵌套向量中断控制器(Nested Vectored Interrupt Controller,NVIC)。它是属于Cortex内核的器件,是非常强大、方便的嵌套向量中断控制器,不可屏蔽中断(Non-Maskable Interrupt,NMI)和外部中断都由它来处理。
NVIC的主要功能是管理和分配中断请求,每个中断源都有一个独立的中断处理器。在发生中断请求时,NVIC会在中断优先级表中寻找相应的中断处理器,并按照优先级顺序响应中断请求。NVIC可以处理外部中断,内部异常、直接数据存储中断等多种类型的中断请求,并且支持优先级分组、中断控制状态的查询与设置及中断嵌套等高级功能。
在GD32中,NVIC的相关寄存器和功能都被集成在NVIC外设中,用户可以使用NVIC的相关API实现中断的配置、使能、禁止和优先级设置的操作。
Cortex-M3的NVIC是一种嵌套向量中断控制器,它支持多种优先级中断和快速响应中断,能够在多种嵌入式系统中实现高效的中断处理。作者接着对中断向量表、中断请求、中断优先级、中断嵌套、中断处理进行详细得介绍。
NVIC的一般工作流程可以分解成以下6步:
①、中断请求发生
②、中断向量表查找
③、中断优先级判断
④、中断处理
⑤、中断嵌套和优先级恢复
⑥、中断处理结束
NVIC配置响应某些中断的过程一般分成5步:
①、选择中断优先级分组
②、使能特定中断
③、配置中断优先级
④、编写中断服务子程序
⑤、设置中断向量表
EXTI外部中断及事件控制器
作者采用示意图,结构框图,图文并茂的方式讲解,有助于阅读者更高效的理解EXTI中断特性。
![2.jpg](//file1.elecfans.com/web2/M00/05/C6/wKgaombUe5eAUTc2ADG7L93kpGY026.jpg)
EXIT使用方法,使用GD32的EXIT通用IO映像进行外部中断响应,需要执行以下四个步骤:
①、将GPIO端口配置为中断输入模式,并设置中断触发方式。
②、配置EXIT通用IO映像中断线,将GPIO口连接到相应的中断线
③、配置NVIC中断向量表,使中断服务程序能够响应中断。
④、重写中断响应函数,将中断处理任务代码写入中断响应函数,任务完成后清除中断挂起标识。
关于EXTI处理外部中断处理的常用库函数,书籍中也概括的非常详细。介绍完相关的中断响应处理函数,作者趁热打铁,通过触摸按键控制LED案例,案例代码具体详细。
![3.jpg](//file1.elecfans.com/web2/M00/05/C6/wKgaombUhyKAX6oXACy0lpAh8sY278.jpg)
案例结果分析可验证理论知识。
按键A:按下后LED1可能没有反应,但如果按下的时间足够长,则LED1的亮灭状态被改变的概率会提高。造成这一现象的原因是main函数的while(1)循环中有3000ms的延时,若按键A按下的时间段在延时期间,则CPU查询函数并没有被执行,因此无法获取按键A的状态变化。
按键B:按键按下的瞬间LED1的亮灭状态发生变化,因为与按键B相连的PA1被配置为下降沿触发的中断,所以按键刚一按下时产生的下降沿会触发EXTI1_IRQHandler函数被响应。因为与PA1相连的EXTI_1被打开,当PA1输入的下降沿触发中断时,CPU会转向执行中断响应函数,因此main的while(1)中的延时函数并不会对按键B产生影响。
作者用上升沿和双边沿触发的中断实验,按键C实现了上升沿触发中断效果,按键D实现了双边沿触发中断效果。
总之,通过该章节的品读,进一步丰富了对中断和事件的认识与理解,章节介绍的非常详细,代码中都有必要的中文注释,推荐一起品读学习。