一、STM32(Cortex-M3)优先级分类:
STM32分为抢占式优先级和响应优先级,每个中断源都需要被指定这两种优先级。
二、 优先顺序如下:
1、抢占优先级不同,会涉及到中断嵌套,抢占优先级高的会优先抢占优先级低的,优先得到执行。(注意:优先级数字越小,优先级越高)
2、抢占优先级相同,不涉及到中断嵌套,响应优先级不同,响应优先级高的先响应。(例如:两个中断同时响应,这里就会先执行响应优先级高的那个中断)(注意:优先级数字越小,优先级越高)
3、抢占优先级和响应优先级都相同,则比较它们的硬件中断编号,中断编号越小,优先级越高。(硬件中断编号从中断向量表当中查看)
三、优先级寄存器
优先级使用寄存器使用四位,分别用于定义抢占优先级及相应优先级,定义分组如下:
优先级分组 | 抢占优先级 | 响应优先级 | 描述 | bit4 | bit3 | bit2 | bit1 |
NVIC_PriorityGroup_0 | 0 | 0到15的取值 | 高4位全部是响应优先级 无抢占优先级 | 响应 | 响应 | 响应 | 响应 |
NVIC_PriorityGroup_1 | 0到1的取值 | 0到7的取值 | 抢占优先级为1位 响应优先级为3位 | 抢占 | 响应 | 响应 | 响应 |
NVIC_PriorityGroup_2 | 0到3的取值 | 0到3的取值 | 抢占优先级为2位 响应优先级为2位 | 抢占 | 抢占 | 响应 | 响应 |
NVIC_PriorityGroup_3 | 0到7的取值 | 0到1的取值 | 抢占优先级为3位 响应优先级为1位 | 抢占 | 抢占 | 抢占 | 响应 |
NVIC_PriorityGroup_4 | 0到15的取值 | 0 | 高4位全部是抢占优先级 无响应优先级 | 抢占 | 抢占 | 抢占 | 抢占 |
四、使用方法
1、 选择优先级分组:
通过调用STM32的固件库中的函数NVIC_PriorityGroupConfig()选择使用哪种优先级分组方式,例如:NVIC_PriorityGroupConfig( NVIC_PriorityGroup_0 ); 表示选择为分组0,则全部为响应优先级。它在程序中只能调用一次。
2、定义中断源优先级别:
通过 NVIC_Init(&NVIC_InitStructure); 函数具体设置为断优先级别,可以在中断源硬件初始化阶段完成定义。
NVIC_InitTypeDef NVIC_InitStructure;
NVIC_InitStructure.NVIC_IRQChannel = CAN2_RX0_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1; // 主优先级为1
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 2; // 次优先级为0
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);