STM32的中断
中断:由于中断源的触发,常规程序被打断,CPU转 而运行中断响应函数,而后又回到常规程序的执行, 这一过程叫做中断
**中断响应函数 **:由于中断源触发而被调用的程序
中断处理的四个阶段
中断优先级
中断优先级:中断处理的紧急程度叫做中断优先级
基本概念
中断优先级表示方法
中断现象
-
中断排队(甲):在中断响应的过程中又有新的中断到来,新到来的中断需要排队,根据中断优先级决定排队的顺序
-
中断嵌套 (乙):中断处理过程被更紧急的中断源打断,于是处理更紧急的指令
外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传
规则
- 高抢占优先级可以打断正在执行的低抢占优先级
- 中断当抢占优先级相同时响应优先级高的先执行,但是不能相互打断
- 抢占和响应相同的情况下自然优先级越高的先执行
- 数值越小优先级越高
简言之,
1.对于指令的执行:先比较抢占优先级,抢占优先级高的先执行;抢占优先级相同则比较响应优先级,响应优先级高的先执行;若抢占优先级和响应优先级都相等,则比较自然优先级,自然优先级高的先执行。
2.遇到抢占优先级更高的中断会发生“中断嵌套。
但遇到抢占优先级相等,响应优先级更高时不发生中断嵌套,即响应优先级间不发生打断。
3.未发生中断嵌套时会发生“中断排队” ,总优先级更高的中断排在前面。
中断优先级分组
**特别提示:一个工程中一般只能设置一次中断优先级分组。**若设置多次则以最后一次为准。
中断源
“脉冲型”中断源&“电平型”中断源
“脉冲型”中断源(罕见):中断提示信号一闪而过。
“电平型”中断源(常见):中断提示信号持续,直到手 动关闭,因此必须在中断响应函数结束前清除中断。
中断源的4种状态
- 不活动(Inactive):中断没有被触发或已响应结束
- 活动(Active):中断正在被响应
- 挂起(Pending):中断正在排队等待处理
- 活动且挂起(Active and Pending):中断处理的过程中再次触发(仅脉冲型)【图4的B】
GPIO外部中断简图
NVIC
Nested vectored interupt controller 嵌套向量中断控制器 属于内核 负责管理中断
NVIC支持:256个中断(16内核 + 240外部),支持:256个优先级,允许裁剪!
中断协作模型
大致分为片上外设(左)、NVIC(中)、Flash三部分。
工作过程:片上外设产生中断源,传输到NVIC中 -> NVIC管理处理中断信号,传输到flash -> flash通过中断向量表找到中断响应函数并执行。
中断向量表
什么是中断向量表:Flash存储器内部从地址0开始的一 段区域,每4个字节存储一个中断响应函数的地址。(用于搜索中断响应函数相当于他的目录)
e.g.
中断向量表定义在启动文件,当发生中断,CPU会自动执行对应中断服务函数。
NVIC相关寄存器介绍
NVIC相关寄存器 | 作用 | 位数 | 寄存器个数 | 备注 |
---|---|---|---|---|
中断使能寄存器(ISER) | 给中断使能 | 32 | 8 | 每个为控制一个中断 |
中断除能寄存器(ICER) | 解除中断 | 32 | 8 | 每个位控制1个中断 |
应用程序中断及复位控制寄存器(AIRCR) | 可以进行系统复位、向量复位和清除当前活动的中断请求 | 32 | 1 | 位[10:8]控制优先级分组 |
中断优先级存储寄存器(IPR) | 用于控制中断优先级的分组和位数设置,以便进行中断优先级的管理和调度 | 8 | 240 | 8个位对应一个中断而STM32只使用高4位 |
NVIC还有挂起、解挂、激活标志等非常功能,在此作简单介绍:
挂起中断(Pending Interrupt):
- 设置挂起标志(Pending Flag):通过设置NVIC_ISPR寄存器的对应位,可以将中断的挂起标志置位,表示该中断处于挂起状态。
- 清除挂起标志(Clear Pending Flag):通过设置NVIC_ICPR寄存器的对应位,可以清除中断的挂起标志,表示该中断不再处于挂起状态。
解挂中断(Unpending Interrupt):
- 解挂中断(Unpend Interrupt):通过设置NVIC_IABR寄存器的对应位,可以解挂中断,使其从挂起状态转为非挂起状态。
激活中断(Enable Interrupt):
- 使能中断(Enable Interrupt):通过设置NVIC_ISER寄存器的对应位,可以使中断处于使能状态,即允许中断请求触发相应的中断服务程序。
- 禁止中断(Disable Interrupt):通过设置NVIC_ICER寄存器的对应位,可以禁止中断,即阻止中断请求触发相应的中断服务程序。
NVIC工作原理
补充SHPR:
简言之SHPR是专门配置系统处理器优先级的寄存器。只控制内部不控制外部。
SHPR(System Handler Priority Register)是一个特殊的寄存器,用于配置系统处理器的优先级。它是NVIC(Nested Vectored Interrupt Controller)的一部分。
SHPR寄存器用于设置系统处理器的优先级,这些处理器包括:
- SysTick异常处理器
- PendSV异常处理器
- SVCall(Supervisor Call)异常处理器
该寄存器被分为三个字节,每个字节对应一个处理器的优先级。较低的数值表示较高的优先级(0是最高优先级)。当多个异常同时发生时,优先级较高的异常将被优先处理。【关于优先级下一部分会讲】
请注意,SHPR寄存器只控制系统处理器的优先级,而不是外部中断的优先级。对于外部中断(如GPIO中断),您需要使用其他寄存器(例如NVIC_IPR)来配置它们的优先级。
NVIC的初始化
1.设置中断分组 : AIRCR[10:8],HAL_NVIC_SetPriorityGrouping
2.设置中断优先级 : IPRx bit[7:4],HAL_NVIC_SetPriority
3.使能中断 : ISERx,HAL_NVIC_EnableIRQ
总述:
了解寄存器:SCB_AIRCR NVIC_IPRx NVIC_ISER
编写中断响应函数
如何让中断向量表找到自己写的函数:
在.s文件中找到中断响应函数 -> 写一个同名函数覆盖它
e.g.
EXTI
**EXTI(External Interrupt/Event Controller) ** : 外部中断/事件控制器
stm32的众多片上外设之一,能够检测外部输入信号的变化边沿并由此产生中断
EXTI的内部结构
中断&事件
-
中断:要进入NVIC,有相应的中断服务函数,需要CPU处理
-
事件:不进入NVIC,仅用于内部硬件自动控制的。事件指突发事件本身,一般是一个脉冲信号,事件的处理过程不需要CPU介入。 (如:TIM、DMA、ADC)