NVIC 中断优先级管理详解
程序员文章站
2022-04-02 09:02:59
...
1.NVIC(内嵌向量中断控制器)
- STM32系列总共有84个中断,其中我用的STM32F103系列的板子也有60个中断,可想而知STM32一定有一个中断的管理机制来管理这么多中断,使能中断并且配置相关中断的优先级,这就是NVIC的工作
- 优先级高的中断可以打断优先级低的中断,这样一个中断执行的时候被另外中断给打断,这个中断执行完再执行上一个中断,形成中断之间的嵌套,或许这就是NVIC 名字为内嵌向量中断控制器来源
- NVIC中对于每个中断需要设置 抢占优先级 和 响应优先级(又称子优先级),很明显多个中断会先比较 抢占优先级,抢占优先级相同的比较响应优先级,这里值得注意的是 高抢占优先级能够打断低抢占优先级的,但是相同抢占优先级的高响应优先级不能打断低响应优先级。
- NVIC利用四个位来保存抢占优先级和响应优先级
我们可以*设置用几个位来保存抢占优先级和响应优先级,例如我们全部用这4个位 全部保存响应优先级,那么响应优先级可以设置为0~15中的任何一个值,这就是优先级分组0,这就是,抢占优先全部一样,我们也可以设置1个位来保存抢占优先级3个位保存响应优先级,这样抢占优先级就可以设置为0和1,响应优先级就可以设置为0至7,这就是优先级分组1,顺便一提,值越小代表优先级越高
中断优先级分组 | 分配结果 | 抢占优先级取值 | 响应优先级取值 |
---|---|---|---|
0 | 0位抢占优先级,4位响应优先级 | 0~0 | 0~15 |
1 | 1位抢占优先级,3位响应优先级 | 0~1 | 0~7 |
2 | 2位抢占优先级,2位响应优先级 | 0~3 | 0~3 |
3 | 3位抢占优先级,1位响应优先级 | 0~7 | 0~1 |
4 | 4位抢占优先级,0位响应优先级 | 0~15 | 0~0 |
提示:我们最好一个程序就用就只指定一个中断分组,否则容易混肴!
2.NVIC配置详情
这里利用定时器3举例
//定时器3中断初始化,指定抢占优先级与响应优先级
void MY_TIM3_Interrupt_Init(u8 preemptionPriority,u8 subPriority){
// 1.这里是配置允许定时器中断
NVIC_InitTypeDef NVIC_Initstructure;
//第一个参数指定具体是那种中断,定时器3(TIM3就是) TIM3_TRQn,例如串口1是USART1_IRQn
NVIC_Initstructure.NVIC_IRQChannel = TIM3_IRQn; //设置为定时器3中断
NVIC_Initstructure.NVIC_IRQChannelCmd = ENABLE; //中断使能
//指定抢占式优先级
NVIC_Initstructure.NVIC_IRQChannelPreemptionPriority = preemptionPriority;
//指定响应式优先级(子优先级)
NVIC_Initstructure.NVIC_IRQChannelSubPriority = subPriority;
NVIC_Init(&NVIC_Initstructure);
}
//我们这里只是允许TIM3中断,定时器有更新中断,输入捕获中断等
//所以我们还需要在配置定时器的时候指定定时器具体中断请求,这里其实和NVIC配置没关系了(题外话)
//例如:
TIM_ITConfig(TIM3,TIM_IT_Update,ENABLE);//允许更新中断
//另外最好在主函数配置中断优先级分组,设置完一次就不要再配置了!
NVIC_SetPriorityGrouping(NVIC_PriorityGroup_2);//后面的值不仅可以为2,还可以为0,1,3,4
//***************************************************
//***************************************************
/*中断处理函数*/
//每一种中断处理函数名字都是固定的!我们必须写对中断处理函数名才能让中断得到处理
void TIM3_IRQHandler(void){
//1.判断是什么中断
// 1.1 如果是定时器更新中断
if(TIM_GetITStatus(TIM3,TIM_IT_Update)){
//处理中断事件....
// 1.2 最后将中断标志位都清理掉
TIM_ClearITPendingBit(TIM3,TIM_IT_Update);
}
}
3.NVIC常用的中断请求名和中断函数处理名
这里就不一一列举所有的中断请求名和中断函数处理名,例如我的单片机是STM32F10系列,我就可以在stm32f10x.h中查看到所有的中断请求名,根据中断请求名就基本能写出中断处理函数,实在不行再到别的地方查查吧。。咳咳。。
上一篇: 中小企业如何建立商业智能
下一篇: 大数据慎行,数据管理要落实到KPI