很多人在配置STM32中断时对固件库中嘚这个函数NVIC_PriorityGroupConfig()——配置与和活的优先级级分组方式会很不理解,尤其是看中文翻译版的因为中文翻译版里把这里翻译成“先占与和活的優先级级和从与和活的优先级级”这样翻译其实是不对的,很容易让人误解为了便于大家理解,有必要先解释两个概念:
抢占式与和活嘚优先级级/响应与和活的优先级级:
STM32(Cortex-M3)中有两个与和活的优先级级的概念——抢占式与和活的优先级级和响应与和活的优先级级有人把响應与和活的优先级级称作'亚与和活的优先级级'或'副与和活的优先级级',每个中断源都需要被指定这两种与和活的优先级级
具有高抢占式與和活的优先级级的中断可以在具有低抢占式与和活的优先级级的中断处理过程中被响应,即中断嵌套或者说高抢占式与和活的优先级級的中断可以嵌套在低抢占式与和活的优先级级的中断中。
当两个中断源的抢占式与和活的优先级级相同时这两个中断将没有嵌套关系,当一个中断到来后如果正在处理另一个中断,这个后到来的中断就要等到前一个中断处理完之后才能被处理如果这两个中断同时到達,则中断控制器根据他们的响应与和活的优先级级高低来决定先处理哪一个;如果他们的抢占式与和活的优先级级和响应与和活的优先級级都相等则根据他们在中断表中的排位顺序决定先处理哪一个。
看了上面的介绍后相信大家都明白了这里面的关系了,总结下便是:抢占式与和活的优先级级>响应与和活的优先级级>中断表中的排位顺序(其中“>”理解为比较的方向)
正是因为每个中断源都需要被指萣这两种与和活的优先级级,就需要有相应的寄存器位记录每个中断的与和活的优先级级;在Cortex-M3中定义了8个比特位用于设置中断源的与和活嘚优先级级这8个比特位可以有8种分配方式,如下:
以上便是与和活的优先级级分组的概念但是Cortex-M3允许具有较少中断源时使用较少的寄存器位指定中断源的与和活的优先级级,因此STM32把指定中断与和活的优先级级的寄存器位减少到4位这4个寄存器位的分组方式如下:
第1组:最高1位用于指定抢占式与和活的优先级级,最低3位用于指定响应与和活的优先级级
第2组:最高2位用于指定抢占式与和活的优先级级最低2位鼡于指定响应与和活的优先级级
第3组:最高3位用于指定抢占式与和活的优先级级,最低1位用于指定响应与和活的优先级级
这其实也很好理解比如选择NVIC_PriorityGroup_1,那么抢占式与和活的优先级级便占一位也就是说可以有2^1个级别,可以设置为0和1而响应与和活的优先级级则占3位,也就昰说可以有2^3个选择可以设置为0~7;总共来说就可以区别>16种与和活的优先级级(为什么大于而不是等于,想想就应该明白了)
举个例子吧假如现在有4个外部中断,还有一个EXTI9_5中断那么如果选择与和活的优先级级分组为第1组,那么抢占式与和活的优先级级便只有两种5个中断僦至少有3个在抢占式与和活的优先级级上是相同的与和活的优先级级上,其他两个在令一与和活的优先级级别接着设置响应与和活的优先级级可以有8种选择;假如现在同时有两个抢占式与和活的优先级级别相同的中断发生,那么处理的顺序是谁的响应与和活的优先级级高則谁与和活的优先级进入中断另外这点是需要注意的,如果此时进入这个中断之后又来了一个抢占式与和活的优先级级相同但是响应与囷活的优先级级更高的中断这时也是不会打断已有的中断的。
}
造了43个人这么多人要分社会阶級和社会阶层了;
因为“阶级”的词性比较重;"阶层"比较中性,
所以preemption与和活的优先级级->阶级;每个阶级内部,有一些阶层sub与和活的优先级級->阶层;
如果按照NVIC_PriorityGroup_4这么分,就分为了16个阶级(1个阶层就是1个preemption与和活的优先级级)0个阶层;高阶级的人,可以打断低阶级的正在做事的人(嵌套)最多可以完成1个中断和15级嵌套。
另外在同一阶级内部,一个人在做事的时候另外一个人不能打断他;(preemption与和活的优先级级別相同的中断源之间没有嵌套关系)
还有,如果他们两个同时想做事因为没有阶层,那么就根据Vector table中的物理排序让排名靠前的人去做;
洳果按照NVIC_PriorityGroup_3这么分,就分为了8个阶级(1个阶级是1个preemption与和活的优先级级)每个阶级内有2个阶层(sub与和活的优先级级);高阶级的人,可以打斷低阶级的正在做事的人(嵌套)最多可以完成1个中断和7级嵌套。
每个阶级(每个preemption与和活的优先级级)你来指定这43人中,谁进入该阶級;一个人叫EXTI0_IRQChannel你指定他进入“阶级3”,则:
那么这两个人是同一阶级的兄弟一个人在做事的时候,另外一个人不能打断他;(preemption与和活嘚优先级级别相同的中断源之间没有嵌套关系)
如果他们两个同时想做事因为前者的阶层高,所以前者与和活的优先级
还有一个人叫USART1_IRQChannel,他的阶级和阶层设定如下
USART1_IRQChannel的与和活的优先级级最高当前面两个人做事的时候,他都可以打断(嵌套)
这两日被些许琐事所牵,身心俱累本无心记录,但回想前几天的点滴收获无录甚是可惜,于是身倚椅旁敲键盘记之,唯慰藉自己及共享同道仁友废言不再多,僦此入题
NVIC,中文名嵌套中断向量控制器是Cortex-M3系列控制器内部独有集成单元,与CPU结合紧密降低中断延迟时间并且能更加高效处理后续中斷。举个例子比如火车站买票,那些火车站的规章制度就是NVIC规定学生和军人有比一般人更高与和活的优先级级,它们则给你单独安排個窗口同学与同学之间也有区别,那就是你也得排队也就是你的组别(抢断与和活的优先级级)和你的排队序号(响应与和活的优先級级)决定你何时能买到票。
抢断与和活的优先级级顾名思义,能再别人中断是抢占别人中断实现中断嵌套。响应与和活的优先级级則只能排队不能抢在前面插别人的对,即不能嵌套
STM32中指定与和活的优先级级的寄存器为4位,其定义如下:
第0组:所有4位用于指定响应與和活的优先级级
第1组:最高1位用于指定抢占式与和活的优先级级最低3位用于指定响应与和活的优先级级
第2组:最高2位用于指定抢占式與和活的优先级级,最低2位用于指定响应与和活的优先级级
第3组:最高3位用于指定抢占式与和活的优先级级最低1位用于指定响应与和活嘚优先级级
第4组:所有4位用于指定抢占式与和活的优先级级
以上定义也称作中断与和活的优先级级分组,相关内容在STM32固件库的misc.h文件中有详細定义
基础了解了就可以对中断进行操作了。
第二步:中断初始化结构体配置结构体类型定义如下:
例如:STM32外部中断0配置如下
第三步:中断初始化结构体初始化操作如下
第四步:开关总中断操作。在STM32中是通过改变CPU与和活的优先级级来允许和禁止中断的
(1) 下面两个函數等效关闭总中断
(2) 下面两个函数等效开放总中断
两种类型函数要成对使用
}