中断管理方法
STM32中断有0-4 5个分组,对每个中断设置一个抢占优先级和响应优先级。
分组配置是在寄存器SCB->AIRCR中配置:
AIRCR[10:8] IP[7:4]分配情况 分配结果
0 111 0:4 0位抢占优先级,4位响应优先级
1 110 1:3 1位抢占优先级,3位响应优先级
2 101 2:2 2位抢占优先级,2位响应优先级
3 100 3:1 3位抢占优先级,1位响应优先级
4 011 4:0 4位抢占优先级,0位响应优先级
抢占优先级,响应优先级的区别:
有A,B两个中断程序
1. A,B的抢占优先级一样 谁的响应优先级高先执行谁
A,B的抢占优先级一样 低的响应优先级程序执行时候,不会被高响应优先级打断。
2. A的抢占优先级大于B,B执行的时候,A可以打断B。
3. 两个中断 抢占优先级 响应优先级一样 哪个中断先发生就先执行哪个
数字小的级别高 比如 0级>1级
例:中断优先级分组为2
中断5的抢占优先级为2,响应优先级1
中断2的抢占优先级为3,响应优先级0
中断8的抢占优先级为2,响应优先级0
结论: 中断8>中断5>中断2
下面这幅图是 void NVIC_Init(NVIC_InitTypeDef* NVIC_InitStruct);函数
这个是中断参数初始化函数
typedef struct
{
uint8_t NVIC_IRQChannel;//设置中断通道
uint8_t NVIC_IRQChannelPreemptionPriority;//设置响应优先级
uint8_t NVIC_IRQChannelSubPriority;//设置抢占优先级
FunctionalState uint8_t NVIC_IRQChannelCmd;//使能、
}NVIC_InitTypeDef;
NVIC_InitTypeDef NVIC_InitStructure;
NVIC_InitStructure.NVIC_IRQChannel=USART1_IRQn;//串口1中断
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=1;//响应优先级1
NVIC_InitStructure.NVIC_IRQChannelSubPriority=2;//抢占优先级2
NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE;//IRQ通道使能
NVIC_Init(&NVIC_InitStructure);//根据上面制定的参数初始化NVIC寄存器
中断优先级设置步骤
1 void NVIC_PriorityGroupConfig(unit32_t NVIC_PriorityGroup);
整个系统执行过程中只设置一次
2 void NVIC_Init(NVIC_InitTypeDef* NVIC_InitStruct);
对每个中断设置对应的优先级
3 如果需要挂起解挂,查中断当前的激活状态,调用相关函数即可