中断是指计算机运行过程中,出现某些意外情况需要主机干预时,机器能够自动停止正在运行的程序并转入处理新情况的程序,处理完毕后有返回原来被暂停的程序继续运行

STM32的中断和异常

(1)对于异常和外部中断的功能,对于STM32单片机而言,是由芯片内的Cortex-M内核提供支持,这部分功能时有ST公司在Cortex-M内核上拓展或修改而来的

(2)异常和中断概念相近,异常可以说是内核活动产生(比如执行指令出错),中断一般是指,有连接到内核的外部器件(外设)产生(比如外设产生中断,提示数据传输完成),它们的触发或者说处理机制相同,使用中并不严格区分二者

STM32异常和中断一览表

 可以看到,异常都是由编号表示的,并且中断类型也很多,中断存在优先级

中断优先级

(1)中断优先级分为两种,可编程和不可编程,可编程的表示可以自己修改中断优先级,不可编程的就不能修改

(2)对于STM32中断优先级,决定着内核优先响应谁的中断请求

(3)小值优先原则,中断优先级数值越小,中断就会被优先相应

(4)中断优先级按照优先级分组配置

中断优先级分组

以F103为例,STM32上只使用M3内核支持的8bit优先级中的高4位bit,也就是STM32支持2^4个优先级

bit7 bit6 bit5 bit4 bit3 bit2 bit1 bit0
用于表达优先级 未使用,读回为0

在F103上,使用这4个bit,组织成5组优先级分组,每组分为1个抢占组,1个子优先级组

优先级分组 抢占优先级 子优先级 描述
NVIC_PriorityGroup_0 0 0-15 主-0bit,子-4bit
NVIC_PriorityGroup_1 0-1 0-7 主-1bit,子-3bit
NVIC_PriorityGroup_2 0-3 0-3 主-2bit,子-2bit
NVIC_PriorityGroup_3 0-7 0-1 主-3bit,子-1bit
NVIC_PriorityGroup_4 0-15 0 主-4bit,子-0bit

对于组0,抢占优先级为0,表示他没有抢占优先级,4个bit全部用来表示子优先级。对于组1,抢占优先级为0-1,用1个bit表示抢占优先级,其余3个bit表示子优先级…

(1)通过优先级分组,可以管理中断的响应顺序

(2)只有抢占优先级才由抢占中断权限,发生中断嵌套,打断就发生中断嵌套,没有能力打断,那就被挂起

假如事件A抢占优先级为0,B的抢占优先级为10,在B执行过程中,A发出中断请求,则会抢过B中断的使用权,等A执行完毕再继续执行B(ps:如果A并不能打断事件B,A就会被挂起)

(3)如果中断抢占优先级相同,不发生抢占

(4)如果多个挂起的中断具有相同的抢占优先级,则子优先级高的先行,如果子优先级相同,则IRQ(通常指外部中断请求)编号小的先行(IRQ来源例如:stm32f103xe.h)

抢占优先级>子优先级>IRQ编号

 (5)可编程的优先级,通过嵌套向量中断控制器(NVIC)实现

NVIC库函数 描述
void NVIC_EnableIRQ(IRQn_Type IRQn) 使能中断
void NVIC_DisableIRQ(IRQn_Type IRQn) 失能中断
void NVIC_SetPendingIRQ(IRQn_Type IRQn) 设置中断悬起位(发起中断请求,硬件触发)
void NVIC_ClearPendingIRQ(IRQn_Type IRQn) 清除中断悬起位
uint_32t NVIC_GetPendingIRQ(IRQn_Type IRQn) 获取中断悬起编号
void NVIC_SetPriorityIRQ(IRQn_Type IRQn,uint32_t priorty) 设置中断优先级
uint_32t NVIC_GetPriorityIRQ(IRQn_Type IRQn) 获取中断优先级
void NVIC_SystemReset(void) 系统复位

物联沃分享整理
物联沃-IOTWORD物联网 » STM32中断优先级概览

发表评论