按照中断优先级来处理,一般硬中断之後是软中断
看一下参考手册的这一章
请百度下NVIC(嵌套向量终端控制),你会了解更多!
下面粗浅地说下吧!
STM32F103采用的是CM3内核。
据某个权威的ARM内核专家所写的《ARM Cortex-M3权威指南》所述: CM3支持256个中断,其中,这256个中断,包含16个内核中断和240个外部中断。可编程设置256级。
但是, STM32并没有完全使用ARM内核的全部,所以,STM32支持84个中断,含16个内核中断和68个可屏蔽中断,可编程设置变为了16级(寄存器SCB->AIRCR 中IP[7:4]占了4位,所以是2的4次方个优先级)。
具体到STM32F103,可用中断更少了,仅有60个可屏蔽中断,毕竟很便宜,还要什么自行车?
在ST公司出的《STM32产品参考手册》(搜索下载简体中文版)的搜索“中断和异常向量”,可以看到这60个中断。
STM32的中断,可分为5组,同时,每个中断,都可以设置一个抢占优先级和一个响应优先级。
抢占优先级高的中断,可以打断抢占优先级低的正在进行的中断。
比如说: 系主任正在开会,校长来了,系主任们是不是要停下来给校长找个合适的座位啊?为毛?因为校长的抢占优先级高啊!
具有相同抢占优先级的中断,高响应优先级的中断不能打断低响应优先级的中断。
比如:系主任们开会,进门或者坐座位,是按照先来后到坐就行,谁也不能抢位置,因为它们的抢占优先级相同。
具有相同抢占优先级的中断,同时发生时,谁的响应优先级高,谁先执行。
比如:系主任们开会,李教授曾是王教授的导师,那么,即使李教授紧挨着王教授后进会议室,王教授也应给李教授让座,因为李教授德高望重,具有更高的响应优先级。
具有相同的抢占优先级和响应优先级的中断,谁先到,谁先执行。
比如: 系主任们开会,同龄的李教授和王教授先后进会议室,那么,李教授就比王教授更有选择好位置的权利,假如李教授和王教授都想选择左面第5个位置的话。
下面以Keil和STM32库函数为例。
设置中断优先级分组为2,因为分组2的抢占优先级和响应优先级均有2位,相对来说,比较均衡,所以拿它来示例吧,注意:最好只设置一次中断优先级分组,以免STM32的中断管理混乱。
在main函数中确定中断优先级分组为组2:
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
设置好了中断优先级分组之后,可以设置抢占优先级和响应优先级了,以下为部分示例代码。
假装需要检测一个外部按键,按键按下时,触发中断,这个按键外接在PB9上,已初始化为上拉输入。
```c
void KEY_Init(void)
{
//GPIO_InitTypeDef GPIO_InitStruct; //GPIO结构体
EXTI_InitTypeDef EXTI_InitStruct; //外部中断结构体
NVIC_InitTypeDef NVIC_InitStruct;//NVIC结构体
//在main中启用GPIOB对应的时钟,在这里初始化GPIO,
EXTI_InitStruct.EXTI_Line=EXTI_Line9; //外部中断线9
EXTI_InitStruct.EXTI_LineCmd=ENABLE; //使能
EXTI_InitStruct.EXTI_Mode=EXTI_Mode_Interrupt;//触发为中断而不是事件
EXTI_InitStruct.EXTI_Trigger=EXTI_Trigger_Rising;//上升沿触发
EXTI_Init(& EXTI_InitStruct);//初始化外部中断
NVIC_InitStruct.NVIC_Channel = EXTI9_5_IRQn;//中断的通道
NVIC_InitStruct.NVIC_ChannelPreemptionPriority = 1;//抢占优先级为1
NVIC_InitStruct.NVIC_ChannelSubtionPriority = 2;//响应优先级为2
NVIC_InitStruct.NVIC_ChanneCmd = ENABLE;//中断使能
NVIC_Init(& NVIC_InitStruct);//初始化NVIC
}
```
然后,就要写对应的中断函数了:
```c
void EXTI9_5_IRQHandler(void)//判断中断来源,是按键,则改变自定义标志位的值
{
if(EXTI_GetITStatus(EXTI_Line9)!=RESET){
//确定按键被按下了,做点儿啥?
EXTI_ClearITPendingBit(EXTI_Line9);
}
}
```
先这样吧!
祝学业精进!