关注 + 点赞 不错过精彩内容
大家好,我是硬核王同学,最近在做免费的嵌入式知识分享,帮助对嵌入式感兴趣的同学学习嵌入式、做项目、找工作!
四、NVIC
(1)NVIC基本结构
外部中断的整体结构图如下:
这个NVIC的名字叫做嵌套中断向量控制器。在STM32中,它是用来统一分配中断优先级和管理中断的,NVIC是一个内核外设,是CPU的小助手。
我们已经知道了,STM32的中断非常多,如果把这些中断全都接到CPU上,那CPU还得引出很多线进行适配,设计上就很麻烦,并且如果很多中断同时申请,或者中断很多产生了拥堵,CPU也会很难处理,毕竟CPU主要是用来运算的,所以就把中断分配的任务就放到NVIC。
NVIC有很多输入口,你有多少个中断线路,都可以接过来,比如这里可以接到到EXTI、TIM、ADC、USART等等,在图中,左边中断和NVIC连接线上画了个斜杠加n,这个意思是一个外设可能会同时占用多个中断通道,所以这里有n条线,而NVIC只有一个输出口。
NVIC根据每个中断的优先级分配中断的先后顺序,之后通过右边这一输出口就告诉CPU该处理哪个中断,对于中断先后顺序分配的任务,CPU不需要知道。
举个例子:
-
比如CPU是医生,如果医院只有一个医生时,当看病人很多时,医生就得先安排一下先看谁后看谁,如果有紧急的病人,那还得让紧急的病人最先来,这个安排先后顺序的任务很繁琐会影响医生看病的效率,所以医院就安排了一个叫号系统(NVIC),来病人了统一取号并且根据病人的等级,分配一个优先级,然后叫号系统看一下现在在排队的病人,优先叫号紧急的病人,最后叫号系统给医生输出的就是一个一个排好队的病人,医生就可以专心看病了。(EXTI、TIM、ADC等就是病人)
(2)NVIC优先级分组
为了处理不同形式的优先级,STM32的NVIC可以对优先级进行分组,分为抢占优先级和响应优先级。
抢占优先级和响应优先级的区别,还是按照病人叫号的例子理解。
响应优先级:
上一个病人1在看病,外面排队了很多病人,当病人1看完后,外面排队中的紧急病人最先进去看病(即使这个紧急病人是最后来的),这种在排队中的插队的就叫响应优先级,响应优先级高的可以插队提前看病。
抢占优先级:
上一个病人1在看病,外面排队中的病人2比病人1更加紧急,病人2可以不等病人1看完,停止给病人1看病,直接先给病人2看病,病人2看完病接着病人1看病,然后外面排队的病人再进来,这种形式的优先级就是中断嵌套。
这种优先级就是我们之前讲的中断嵌套。抢占优先级高的,可以进行中断嵌套。
为了将优先级区分为抢占优先级和响应优先级,就需要对这16个优先级优先级进行分组,NVIC的中断优先级由优先级寄存器的4位(0~15,4位二进制,对应16个优先级)决定,优先级的数值越小,优先级越高,0就是最高优先级。这4位可以进行切分,分为高n位的抢占优先级和低4-n位的响应优先级
抢占优先级高的可以中断嵌套,响应优先级高的可以优先排队。抢占优先级和响应优先级均相同的按中断号排队(中断号是 中断表 的左边数字,数值小的优先响应),所以stm32的中断不存在先来后到的排队方式,在任何时候都是优先级高的先响应。
如上图表中的分组方式,因为优先级总共是4位,所以就有(0,4)、(1,3)、(2,2)、(3,1)、(4,0)这五种分组方式.
分组0,就是有0位的抢占等级,取值为0,有4位的响应等级,取值为0~15,分组1234雷同。这个分组方式是我们在程序中自己进行选择的,选好分组方式后,就要注意抢占优先级和响应优先级的取值范围了,不要超出这个表里规定的取值范围。
分组方式 | 抢占优先级 | 响应优先级 |
分组0 | 0位,取值为0 | 4位,取值为0~15 |
分组1 | 1位,取值为0~1 | 3位,取值为0~7 |
分组2 | 2位,取值为0~3 | 2位,取值为0~3 |
分组3 | 3位,取值为0~7 | 1位,取值为0~1 |
分组4 | 4位,取值为0~15 | 0位,取值为0 |
作 者 :硬核王同学
------- END ------
关注公众号回复“加群”按规则加入技术交流群 回复“1024”查看更多内容