stm32学习总结:中断系统
一、 中断定义及相关概念
中断是处理器中的一种机制,用于响应和处理突发事件或紧急事件。当发生中断时,当前正在执行的程序会被暂时中止,处理器会跳转到中断处理程序(也称为中断服务例程),对中断事件进行处理。处理完中断后,处理器再返回到被中断的程序继续执行。
- 中断分类:
中断可以分为内部中断和外部中断。
a. 内部中断:由处理器内部的模块或事件引发,例如定时器溢出、串口接收缓冲区非空等。内部中断可以用于定期执行特定任务、检测状态变化等。
b. 外部中断:由外部设备或外部信号引发,例如按键按下、外部传感器信号变化等。外部中断用于响应外部事件,并及时处理相关任务。 - 中断向量表(Interrupt Vector Table):
中断向量表是一个存储中断处理程序地址的表格。每个中断都有一个特定的向量,当中断发生时,微控制器会根据中断向量表中相应中断的地址跳转到对应的中断处理程序。 - 中断请求(Interrupt Request):
也称为中断源或中断事件,是指外部设备或内部模块发出的信号,通知微控制器发生了一个特定的事件,例如按键按下、定时器溢出等。 - 中断控制器(Interrupt Controller):
中断控制器负责对中断请求进行管理和分配优先级。 - 中断优先级(Interrupt Priority):
每个中断都具有一个优先级,用于确定中断处理程序的执行顺序。较高优先级的中断会打断正在执行的较低优先级中断或主程序。 - 中断处理程序(Interrupt Service Routine,ISR):
也称为中断服务函数,是一段用于处理特定中断的代码。当中断发生时,微控制器会跳转到相应的中断处理程序执行相关操作,处理完毕后返回主程序。 - 中断使能(Interrupt Enable):
通过设置相应的中断使能位,可以启用或禁用特定的中断。禁用中断后,即使中断请求发生,微控制器也不会响应。 - 中断标志(Interrupt Flag):
中断标志用于指示特定中断是否已经发生。在处理完中断后,需要清除相应的中断标志,以便再次触发相同中断。
中断机制在计算机系统中起着至关重要的作用,它能够提高系统的实时性、并发处理能力、资源共享能力,并为系统的可靠性和可维护性提供支持。
二、 过程描述
具体过程分为进入中断和退出中断,其具体流程如下。
- 进入中断前:
a. 处理器自动保存现场到堆栈里:按照{PC, xPSR, R0-R3, R12, LR}的顺序压入堆栈;
b. 入栈结束,中断服务例程(ISR)便可开始执行;
c. 晚到的中断会重新取ISR地址,但无需再次保存现场。 - 退出中断后:
a. 中断前的现场被自动从堆栈中恢复;
b. 一旦出栈完成,继续执行被中断打断的指令;
c. 出栈的过程也可被打断,使得随时可以响应新的中断, 而不再进行;
d. 现场保存。
处理器根据中断事件的优先级来确定执行的顺序,这里举一个生活中的例子,比如学习STM32(主进程),此时狐朋狗友说英雄联盟的无限火力模式开始了(中断1请求),邀请你一起去玩,经过一番思想斗争后决定还是先放松一下,但为了回来后可以接着目前的进度继续学习,你插入了一个书签,将做的笔记在电脑上进行了保存(现场保存),打开英雄联盟开始玩(执行中断服务程序1);一个小时后,女朋友打电话让你陪她逛街(中断2请求),琢磨了一下还是女朋友比较重要(即中断2比中断1的优先级高),于是将狐朋狗友晾在了一边,去陪女朋友,哈哈哈,典型的重色轻友型。但如果考虑后觉得游戏比较重要,选择无视女朋友(即将中断1的优先级调高,使用NVIC,具体方法见下一节),这种情况怎么可能有女朋友。当两件邀约都执行完毕后,回来继续从书签位置学习(退出中断,恢复现场)。
注:
PC——程序计数器
xPSR——程序状态字寄存器组
R0-R3, R12——通用寄存器
LR——连接寄存器
三、 关于嵌套向量中断控制器(NVIC)
STM32(Cortex-M3)中有两个优先级的概念——抢占式优先级和响应优先级,有人把响应优先级称作“亚优先级”或“副优先级”,每个中断源都需要被指定这两种优先级。
具有高抢占式优先级的中断可以在具有低抢占式优先级的中断处理过程中被响应,即中断嵌套,或者说高抢占式优先级的中断可以嵌套低抢占式优先级的中断。
当两个中断源的抢占式优先级相同时,这两个中断将没有嵌套关系,当一个中断到来后,如果正在处理另一个中断,这个后到来的中断就要等到前一个中断处理完之后才能被处理。如果这两个中断同时到达,则中断控制器根据他们的响应优先级高低来决定先处理哪一个;如果他们的抢占式优先级和响应优先级都相等,则根据他们在中断表中的排位顺序决定先处理哪一个。
NVIC(Nested Vectored Interrupt Controller)是一种中断控制器,用于管理中断系统和中断请求在ARM Cortex-M处理器中的操作。通过使用NVIC,可以对中断系统进行灵活配置和管理,调整中断优先级、使能或禁用中断,并实现中断处理程序的跳转和嵌套。这样能够使处理器能够高效地响应和处理中断请求,提高系统的实时性和并发处理能力。
分组方式 | AIRCR[10:8] | Bit[7:4]分配情况 | 抢占优先级 | 响应优先级 |
---|---|---|---|---|
分组0 | 111 | 0:4 | 0位,取值为0 | 4位,取值为0~15 |
分组1 | 110 | 1:3 | 1位,取值为0~1 | 3位,取值为0~7 |
分组2 | 101 | 2:2 | 2位,取值为0~3 | 2位,取值为0~3 |
分组3 | 100 | 3:1 | 3位,取值为0~7 | 1位,取值为0~1 |
分组4 | 011 | 4:0 | 4位,取值为0~15 | 0位,取值为0 |
相关寄存器:
- 中断使能寄存器组(Interrupt set-enable registers,NVIC_ISERx),共8个32位的寄存器,但只用了前两个,ISER[0]的 bit0-bit31 分别对应中断 0-31,ISER[1]的 bit0-27 对应中中断32~59;这样总共 60 个中断就分别对应上了。你要使能某个中断,必须设置相应的 ISER 位为 1,使该中断被使能。
- 中断除能寄存器组(Interrupt Clear-Enable Registers,NVIC_ICERx): 8个32位寄存器来控制,同样只用到前两个,每个位控制一个中断,除能设置相应ICER位为1。
- 中断挂起控制寄存器组(Interrupt Set-Pending Registers,NVIC_ISPRx):8个32位寄存器来控制,每个位控制一个中断,中断挂起设置相应ISPR位为1。
- 中断解挂控制寄存器组(Interrupt Clear-Pending Registers,NVIC_ICPRx):8个32位寄存器来控制,每个位控制一个中断,中断解挂设置相应ICPR位为1。
- 中断激活标志位(Interrupt Active B