1.STM32的中断和异常

STM32最多有32个中断源,大体上可分为两类,外部中断源与内部中断源(引起ARM芯片执行指令/内部功能模块),其中断优先级别可分为FIQ(快速中断请求)、向量IRQ、非向量IRQ,其级别依次递减.

Cortex内核具有强大的异常响应系统,它把能够打断当前代码执行流程的事件分为异常和中断,并将其用一个表管理,编号为0-15的称为内核异常,而16以上的则称为外部中断,这个表即为中断向量表。

中断向量表

protues stm32中断 stm32中断处理_stm32

protues stm32中断 stm32中断处理_中断请求_02


protues stm32中断 stm32中断处理_protues stm32中断_03


protues stm32中断 stm32中断处理_stm32_04


protues stm32中断 stm32中断处理_protues stm32中断_05


上述表可以从启动文件startup_stm32f10x_hd.s中查找,在启动文件中,已经有相应芯片可用的全部中断向量,而且在编写中断服务函数时,需要从启动文件中定义的中断向量表查找中断服务函数名。

2.NVIC中断控制器

因STM32有很多的中断,故配置起来并不容易,因此便需要一个强大而方便的中断控制器NVIC(Nested Veectored Interrupt Controller ),且其属于Cortex内核的器件。
嵌套向量中断控制器NVIC相关的中断管理工作主要有开放中断、关闭中断设置中断请求标志、读中断请求标志、清除中断请求标志和配置中断优先级等。

对于中断的配置,最重要即为配置其优先级,但STM32的同一个中断向量需要设置两个优先级,抢占优先级和响应优先级

抢占优先级和响应优先级

STM32的中断向量具有两个属性,一个为抢占属性,另一个为响应属性,其属性编号越小表明其优先级别越高。

抢占,是指打断其它中断的属性,即因为具有这个属性会出现嵌套中断(在执行中断服务函数A的过程中被中断B打断,执行完中断服务函数B再继续执行中断服务A)。

响应属性则应用在抢占属性相同的情况下,当两个中断向量的抢占优先级相同时,如果两个中断同时达到,则先处理响应优先级高的中断。

例如,现有三个中断向量

protues stm32中断 stm32中断处理_protues stm32中断_06


如内核正在执行C的中断服务函数,则它能被抢占优先级更高的中断A打断,由于B和C的抢占优先级相同,所以C不能被B打断。但如果B和C中断时同时到达的,内核就会首先响应 优先级别更高的B中断。

NVIC的优先级组

在配置优先级的时候,还要注意中断种类的数量。NVIC只可以配置16种中断向量的优先级,即为,抢占优先级和响应优先级的数量由一个4位的数字来决定,把这个4位数字的位数分配成抢占优先级部分和响应优先级部分,由5组分配方式。

protues stm32中断 stm32中断处理_优先级_07


注意:一个工程文件中NVIC的优先级组只需设置一次即可。

NVIC的优先级分组,只是为以后的中断程序设置了一个规则,例如,设置第1组,则表示,抢占优先级只能是0级或1级,响应优先级为0~7级。即,配置中断的优先级时,只能在这个范围中取值。