一、中断是什么?
1.1 中断的含义
说道中断,首先需要对中断这个概念有所了解。中断是指计算机运行过程中,出现某些意外情况需主机干预时,机器能自动停止正在运行的程序并转入处理新情况的程序,处理完毕后又返回原被暂停的程序继续运行。举个例子就比如你在工作的时候,突然打进来一个电话,这时你放下手中的针线活,接了电话,挂断电话之后再继续之前的工作,这就是一次中断,而打断你工作状态的电话就是中断源。而且有的中断还能被更高优先级的中断打断,就比如你上班接领导电话的时候,突然火灾警报响了,这是你必须要尽快离开,这就涉及到中断嵌套和优先级的问题了。
1.2 中断的作用(了解即可)
1.速度匹配,提高机器系统效率。 系统中处理机的工作速度远高于外围设备的工作速度。通过中断可以协调它们之间的工作。当外围设备需要与处理机交换信息时,由外围设备向处理机发出中断请求,处理机及时响应并作相应处理。不交换信息时,处理机和外围设备处于各自独立的并行工作状态。 2. 分时操作,维持系统可靠正常工作。现代计算机中,程序员不能直接干预和操纵机器,必须通过中断系统向操作系统发出请求,由操作系统来实现人为干预。主存储器中往往有多道程序和各自的存储空间。在程序运行过程中,如出现越界访问,有可能引起程序混乱或相互破坏信息。为避免这类事件的发生,由存储管理部件进行监测,一旦发生越界访问,向处理机发出中断请求,处理机立即采取保护措施。 3. 实时响应,满足实时处理要求。 在实时系统中,各种监测和控制装置随机地向处理机发出中断请求,处理机随时响应并进行处理。 4. 提供故障现场处理手段,可靠性高。 处理机中设有各种故障检测和错误诊断的部件,一旦发现故障或错误,立即发出中断请求,进行故障现场记录和隔离,为进一步处理提供必要的依据。
1.3 中断的流程
一个完整的中断流程应该包含以下步骤: 1.中断源发生中断请求/内核参数异常信号; 2.判断是否允许中断和该中断源是否被屏蔽; 3.优先权排队; 4.保护现场,关闭中断,保护断点; 5.根据中断向量表找到相应中断服务入口地址; 6.执行中断服务函数; 7.恢复现场; 8.打开中断。
二、中断资源
2.1 NVIC中断控制器
NVIC英文全称是Nested Vectored Interrupt Controller,中文意思就是嵌套向量中断控制器,它属于M3内核的一个外设,控制着芯片的中断相关功能。 中断向量就是中断处理函数的入口地址,在stm32fxxx.s文件中已经定义好了,所有中断向量在一起就构成了中断向量表。NVIC把所有的外设中断和系统异常用一张向量表来管理,每个系统异常和外设中断都被分配相应的地址,除了一些系统异常的优先级不能改变外,其余的系统异常和中断的优先级都可变化。 STM32F10x芯片有84个中断通道,包括 16 个内核中断和 68 个可屏蔽中断,这些中断通道已按照不同优先级顺序固定分配给相应的外部设备。大家可以在《STM32F10x参考手册》第九章查找详细数据。
2.2 NVIC寄存器
在NVIC中定义了以下寄存器:
typedef struct
{
__IO uint32_t ISER[8];
uint32_t RESERVED0[24];
__IO uint32_t ICER[8];
uint32_t RSERVED1[24];
__IO uint32_t ISPR[8];
uint32_t RESERVED2[24];
__IO uint32_t ICPR[8];
uint32_t RESERVED3[24];
__IO uint32_t IABR[8];
uint32_t RESERVED4[56];
__IO uint8_t IP[240];
uint32_t RESERVED5[644];
__O uint32_t STIR;
} NVIC_Type;
在配置中断的时候我们一般只用到ISER、ICER、IP这三个寄存器,ISER寄存器用来使能中断,ICER寄存器用来清除中断,IP用来设置中断优先级。
三、优先级的概念
当我们接到了两个电话,两个电话都安排你去做别的事,这时你需要先完成比较急的事,然后再完成不是太急的事,这就是优先级的问题。当有多个中断时,我们需要根据中断优先级判断先响应优先级高的中断,然后再响应优先级低的中断。 在NVIC中有一个专门的寄存器:中断优先级寄存器NVIC_IPRx,用来配置外部中断的优先级。IPR有8位,如果8位全使用,则可配置的优先级为0-255,数值小的优先级越高,但在STM32F373中,只是使用了高4位,可配置的优先级为0-15。 STM32 将中断分为 5 个组,组 0 ~ 4,该分组的设置是由 SCB->AIRCR 寄存器的 bit10 ~ 8 来定义的对这4位有5种搭配方式: 第0组:所有4位用于指定响应优先级 第1组:最高1位用于指定抢占式优先级,最低3位用于指定响应优先级 第2组:最高2位用于指定抢占式优先级,最低2位用于指定响应优先级 第3组:最高3位用于指定抢占式优先级,最低1位用于指定响应优先级 第4组:所有4位用于指定抢占式优先级
可以通过调用STM32的固件库中的函数NVIC_PriorityGroupConfig()选择使用哪种优先级分组方式,这个函数的作用是对中断的优先级进行分组,这个函数在系统中只能被调用一次,一旦分组确定就最好不要更改,其参数有下列5种: NVIC_PriorityGroup_0 => 选择第0组 NVIC_PriorityGroup_1 => 选择第1组 NVIC_PriorityGroup_2 => 选择第2组 NVIC_PriorityGroup_3 => 选择第3组 NVIC_PriorityGroup_4 => 选择第4组 其实现如下:
void NVIC_PriorityGroupConfig(uint32_t NVIC_PriorityGroup)
{
assert_param(IS_NVIC_PRIORITY_GROUP(NVIC_PriorityGroup));
SCB->AIRCR = AIRCR_VECTKEY_MASK | NVIC_PriorityGroup;
}
例如组设置为 3,那么此时所有的 60 个中断,每个中断的中断优先寄存器的高四位中的最高 3 位是抢占优先级,低 1 位是响应优先级。每个中断,你可以设置抢占优先级为 0 ~ 7,响应优先级为 1 或 0。抢占优先级的级别高于响应优先级。而数值越小所代表的优先级就越高。
关于中断的相关库函数都在库文件misc.c和misc.h中。
优先级分为抢占式优先级和响应式优先级。 1、具有高抢占式优先级的中断可以在低抢占式优先级中断处理过程中被响应,即中断嵌套。 2、当两个中断源的抢占式优先级相同时,这两个中断将没有嵌套关系,当一个中断到来后,如果正在处理另一个中断,这个后到来的中断就要等到前一个中断处理完之后才能被处理。 3、如果两同等优先级的中断同时到达,则中断控制器根据他们的响应优先级高低来决定先处理哪一个; 4、如果他们的抢占式优先级和响应优先级都相等,则根据他们在中断表中的排位顺序决定先处理哪一个。 每一个中断源都必须定义2个优先级。
四、中断编程
在配置每个中断的时候,一般有三个编程要点: 1、使能外设某个中断,这个具体由每个外设的相关中断使能位控制。比如串口有发送完成中断,接收完成中断,这两个中断都是串口控制寄存器的相关中断使能位控制。 2、初始化NVIC_InitTypeDef结构体,配置中断优先级分组,设置抢占优先级和和子优先级,是能中断请求。NVIC_InitTypeDef结构体在固件库头文件misc.h中定义,具体代码如下:
typedef struct
{
uint8_t NVIC_IRQChannel;
uint8_t NVIC_IRQChannelPreemptionPriority;
uint8_t NVIC_IRQChannelSubPriority;
FunctionalState NVIC_IRQChannelCmd;
} NVIC_InitTypeDef;
3、编写中断服务函数。
|