文章目录
一、异常与中断
(1)基本概念
- 所有能打断正常执行流的事件都称为异常
- 异常指在正常执行流程中发生暂时的停止并转向相应的处理,包括ARM内核产生复位,取值或存储器访问失败,遇到未定义指令,执行软件中断,或者出现外部中断等
- 大多数异常都对应一个软件的异常处理程序,也即在异常发生时执行的软件程序
(2)二者的区别
- 中断往往来自于内核的外部,是内核来说一个突发事件,异步事件。
- 异常(系统异常)是由于内核活动产生的,是内核在执行指令或访问存储器时产生的,对CM3核是“同步”的
(3)中断与外部中断
- 在内核的层次讨论问题时,“中断”都是内核以外产生的,都叫做“外部中断”;
- 在芯片的级别来说,例如针对STM32芯片,通过EXTI控制的那几个中断(来自引脚、RTC闹钟、USB唤醒、PVD输出),叫做“外部中断”。
- 也就是说,如果和系统异常进行比较,我们都叫外部中断。但是中断之间相互比较的话又有新的层次,片上外设相对于中断引脚反而是比较内部的,
(4)异常的优先级
- 有三个异常:复位(-3),NMI(-2)、硬件fault(-1)的优先级是负的,最高的,软件不能编程,比其他任何异常都高
- 其他异常:随着编号的增大而降低,优先级都可以编程
- 可编程的软件优先级权限高于默认硬件优先级(默认优先级即随着编号增大而降低)
- 软件优先级数字越大优先级越低,当两个中断的软件优先级一样时我们才查看他们的硬件优先级。
前三个优先级不可以通过软件来更改,优先级即硬件默认优先级,对于可设置优先级的异常而言,软件设置的优先级会覆盖原来的硬件优先级。注意-3:6是异常,是没有位置的,从中断开始才有位置
二、相关设备与中断/异常处理
1:嵌套向量中断控制器(Nested Vectored Interrupt Controller, NVIC)
每个寄存器组有240位(一个寄存器只有32位,但是他们都是寄存器组),例如:中断使能设置寄存器组,ISER[0]对应中断源0~31
,ISER[1]对应中断源32~63
,STM32只有60个中断源,所以没有用到ISER[2:7]
。定义NVIC_TypeDef的结构体在库文件core_cm3.h文件。
NVIC中的每个寄存器组都有8个寄存器
2:系统控制寄存器(SCB):中断配置
3:中断和异常处理
STM32芯片的中断和系统异常是分别处理的,其内部处理结构也是分开的:
(1)中断
我们可以通过中断激活位寄存器来知道现在正在执行的中断是哪个
(2)异常
三、STM32中断优先级
如何对系统优先级进行一个设置?
1:中断优先级为何?
也就是说总是先看抢占是优先级,再看响应优先级,如果这两个都相等,就按照硬件优先级(也就是中断表的排位顺序)。
2:中断优先级分组设定
3:NVIC配置过程
(中断初始化结构体):
4:EXTI(外部中断/事件控制器)
在STM32F103XX处理器中,外部中断/事件控制器由用于产生事件/中断请求的19个边沿检测器组成,其中16个中断通道EXTI0-EXTI15对应GPIOx_Pin0-GPIOx_Pin15,另外3个是EXTI16连接PVD(Programmable Votage Detector 可编程电压监测器,作用是监视供电电压)输出,EXTI17连接到RTC(Real Time Clock,实时时钟)和EXTI18连接到USB唤醒事件。
每根外部中断输入线也均可以被单独屏蔽,并且处理器通过一个挂起寄存器保存中断请求的状态。外部中断/事件控制器EXTI的主要特性如下所示:
(1)每根外部中断/事件输入线上均可独立触发和屏蔽
(2)每根外部中断/事件输入线都具有专门的状态标志位
(3)最多可产生19个软件事件/中断请求
(4)可捕获脉宽频率低于APB时钟的外部信号
上图中看出来好像exit对中断和事件的处理没有差别,其实是有的,主要就是事件最终由硬件自动完成,而中断需要CPU参与处理。
EXIT只是对NVIC提供一个辅助的作用,并不是取代了NVIC。60个中断,EXIT只能管理19个,而且每一个的运行最终也都是要回到NVIC。
EXIT的寄存器: