配置抢占优先级和子优先级,它们合并成的4bit数字的数值越小,优先级越高。
子优先级不支持中断嵌套,就是排队。
高抢占式优先级的中断可以在具有低抢占式优先级的中断服务程序执行过程中被响应,即中断嵌套,优先权高的先执行。
Cortex-M3允许具有较少中断源时使用较少的寄存器位指定中断源的优先级,因此STM32把指定中断优先级的寄存器位减少到4位(AIRCR高四位),这4个寄存器位的分组方式如下:
第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组
中断优先级分组是为了给抢占式优先级和响应优先级在中断优先级寄丛器的高四位分配各个优先级数字所占的位数。在一个程序中只能设定一次。
管脚在一组的中断,如何设置呢?
EXTI0~EXTI4这5个外部中断有着自己的单独的中断响应函数,EXTI5-9共用一个中断响应函数,EXTI10-15共用一个中断响应函数。
例如,外部中断5-9的中断优先级设置是没办法单独给外部中断5或者外部中断7设置,这几个是统一设置,也就是说,当有外部中断5-9其中的一个引起触发时,就会进入中断函数EXTI9_5_IRQHandler(),进入该函数之后再判断到底是哪个触发,然后再做相应的处理。
在使用外部中断的时候,首先确保GPIO处于输入状态,只有输入状态才能保证外部信号进入CPU,从而引发中断。
中断处理在哪呢?这个其实在stm32f1xx_it.c里。但是里边啥也没有,用到哪个中断处理程序,就在it这个文件里自己写一个函数。例如:
void KeyCol1_EXTI_IRQHandler(void)
{
HAL_GPIO_EXTI_IRQHandler(Matrx_keyCol1);//该语句是新加入的,但真正的处理需要编写回调函数。
}
KEY1_EXTI_IRQHandler 函数分别对应 KEY1 的中断 服 务 函 数 ,该 函 数 内 容 都 只 是 调 用 HAL_GPIO_EXTI_IRQHandler 函 数 。
而HAL_GPIO_EXTI_IRQHandler 函数是 HAL 库内部函数,结构一系列处理之后会执行
中断回调函数。我们的代码处理就放在回调函数里。