STM32中断优先级
一、中断优先级的核心概念
- 中断优先级分为两种:可编程和不可编程;
- 对于STM32的中断优先级,决定着内核优先响应谁的中断请求;
- 小值优先原则,中断优先级数值越小,中断会被优先响应(包括后续所提到的抢占优先级与子优先级);
- 中断优先级按照优先级分组配置。
二、中断的优先级分组
- 以F103为例,STM32上只使用了M3内核支持的8bit优先级的高4位bit。也就是说STM32支持2*4个优先级(16个)
- 在F103上,使用这个4bit,组织成五组优先级分组。这五组中,每组分为1个抢占组、1个子优先级组。
三、优先级分组
例如:B中断正在执行,A中断抢占优先级数值比B中断小(小值优先原则:A抢占优先级比B高),A中断则抢过B中断的使用权,响应A的中断服务函数,A中断执行完再交回B。
IRO编号:芯片公司固定好的一个编号,不会有重复的,编号介绍在“stm32f103xc.h”里有介绍
- 通过优先级分组,可以管理中断的响应顺序。
- 只有抢占优先级才有抢占中断权限,发生中断嵌套。
- 如果中断抢占优先级相同,不发生抢占行为。
- 如果多个挂起的中断具有相同的抢占优先级,则子 优先级高的先行,如果子优先级相同,则IRO编号小的先行。
- 可编程的优先级,通过嵌套向量中断控制器(NVIC)实现。
四、嵌套向量中断控制器(NVIC)功能
注:
- 最重要的函数是设置中断优先级的函数,但是一般不直接使用上方表格中的设置中断优先级的函数,因为它没有体现优先级分组的思想,可以在官方给出的头文件“core_cm3.h”中查看(“core_cmx.h”中F103的x为3;H7xx的x为7)
- 设置中断优先级函数的HAL库思想:
- 利用HAL库思想设置中断优先级的使用例子:
五、中断优先级的总结
- 已经有中断在工作。根据抢占优先级决定,新来的中断打不打断原有中断,打断就发生中断嵌套,不打断就挂起等着。
- 中断都在挂起等待的状态,先按抢占优先级排序,抢占优先级高的先行,抢占优先级相同,就按子优先级排序,子优先级高的先行,子优先级还相同,那就按IRQ编号小的先行。
- 所以:抢占优先级>子优先级>IRQ编号。