STM32外部stm32f030 中断优先级~怎么理解子优先级和抢先级?看手册看不懂~大神讲解

STM32中断优先级相关概念与使用笔记一、基本概;下还可以有4个不同级别的子优先级;,它们也必须排队等待,只是可以插队,当正在执行的;
STM32中断优先级相关概念与使用笔记一、基本概念1.ARM cortex_m3内核支持256个中断(16个内核+240外部)和可编程256级中断优先级的设置,与其相关的中断控制和中断优先级控制寄存器(NVIC、SYSTICK等)也都属于cortex_m3内核的部分。STM32采用了cortex_m3内核,所以这部分仍旧保留使用,但STM32并没有使用cortex_m3内核全部的东西(如内存保护单元MPU等),因此它的NVIC是cortex_m3内核的NVIC的子集。2.STM32目前支持的中断共为84个(16个内核+68个外部),和16级可编程中断优先级的设置(仅使用中断优先级设置8bit中的高4位,见后面解释)。《参考最新101xx-107xx STM32 Reference manual, RM0008》。3.以下主要对“外部中断通道”进行说明。对于cortex_m3内核所支持的240个外部中断,我在这里使用了“中断通道”这个概念,因为尽管每个中断对应一个外围设备,但该外围设备通常具备若干个可以引起中断的中断源或中断事件。而该设备的所有的中断都只能通过该指定的“中断通道”向内核申请中断。因此,下面关于中断优先级的概念都是针对“中断通道”的。当该中断通道的优先级确定后,也就确定了该外围设备的中断优先级,并且该设备所能产生的所有类型的中断,都享有相同的通道中断优先级。至于该设备本身产生的多个中断的执行顺序,则取决于用户的中断服务程序。4. STM32可以支持的68个外部中断通道,已经固定的分配给相应的外部设备。每个中断通道都具备自己的中断优先级控制字节PRI_n(8位,但在STM32中只使用4位,高4位有效),每4个通道的8位中断优先级控制字(PRI_n)构成一个32位的优先级寄存器(Priority Register)。68个通道的优先级控制字至少构成17个32位的优先级寄存器,它们是NVIC寄存器中的一个重要部分。5.对于这4bit的中断优先级控制位还必须分成2组看:从高位开始,前面是定义抢先式优先级的位,后面用于定义子优先级。4bit的分组组合可以有以下几种形式:编 号分配情况70:4无抢先式优先级,16个子优先级61:32个抢先式优先级,8个子优先级52:24个抢先式优先级,4个子优先级43:18个抢先式优先级,2个子优先级3/2/1/04:016个抢先式优先级,无子优先级6.在一个系统中,通常只使用上面5种分配情况的一种,具体采用哪一种,需要在初始化时写入到一个32位寄存器AIRC(Application Interrupt and Reset Control Register)的第[10:8]这3个位中。这3个bit位有专门的称呼:PRIGROUP(具体写操作后面介绍)。比如你将0x05(即上表中的编号)写到AIRC的[10:8]中,那么也就规定了你的系统中只有4个抢先式优先级,相同的抢先式优先级
下还可以有4个不同级别的子优先级。7.AIRC中PRIGROUP的值规定了设置和确定每个外部中断通道优先级的格式。例如,在上面将0x05写入了AIRC中PRIGROUP,也就规定了当前系统中只能有4个抢先式优先级,相同的抢先式优先级下还可以有4个不同级别的子优先级,他们分别为:位[7:6]位[5:4]位[3:0]000号抢先优先级000号子优先级无效011号抢先优先级011号子优先级无效102号抢先优先级102号子优先级无效113号抢先优先级113号子优先级无效8.如果在你的系统中使用了TIME2(中断通道28)和EXTI0(中断通道6)两个中断,而TIME2中断必须优先响应,而且当系统在执行EXIT0中断服务时也必须打断(抢先、嵌套),就必须设置TIME2的抢先优先级比EXTI0的抢先优先级要高(数目小)。假定EXTI0为2号抢先优先级,那么TIME2就必须设置成0或1号抢先优先级。这些工作需要在AIRC中的PRIGROUP设置完成,确定了整个系统所具有的优先级个数后,再分别对每个中断通道(设备)进行设置。9.具体优先级的确定和嵌套规则。ARM cortex_m3(STM32)规定a/ 只能高抢先优先级的中断可以打断低抢先优先级的中断服务,构成中断嵌套。b/ 当2(n)个相同抢先优先级的中断出现,它们之间不能构成中断嵌套,但STM32首先响应子优先级高的中断。c/ 当2(n)个相同抢先优先级和相同子优先级的中断出现,STM32首先响应中断通道所对应的中断向量地址低的那个中断(见ROM0008,表52)。具体一点:0号抢先优先级的中断,可以打断任何中断抢先优先级为非0号的中断;1号抢先优先级的中断,可以打断任何中断抢先优先级为2、3、4号的中断;……;构成中断嵌套。如果两个中断的抢先优先级相同,谁先出现,就先响应谁,不构成嵌套。如果一起出现(或挂在那里等待),就看它们2个谁的子优先级高了,如果子优先级也相同,就看它们的中断向量位置了。10.上电Reset后,寄存器AIRC中PRIGROUP[10:8]的值为0(编号0),因此此时系统使用16个抢先优先级,无子优先级。另外由于所有外部中断通道的优先级控制字PRI_n也都是0,所以根据上面的定义可以得出,此时68个外部中断通道的抢先优先级都是0号,没有子优先级的区分。故此时不会发生任何的中断嵌套行为,谁也不能打断当前正在执行的中断服务。当多个中断出现后,则看它们的中断向量地址:地址越低,中断级别越高,STM32优先响应。注意:此时内部中断的抢先优先级也都是0号,由于它们的中断向量地址比外部中断向量地址都低,所以它们的优先级比外部中断通道高,但如果此时正在执行一个外部中断服务
,它们也必须排队等待,只是可以插队,当正在执行的中断完成后,它们可以优先得到执行。了解以上基本概念还是不够的,还要了解具体中断的控制有那些途径,中断服务程序如何正确的编写。下面的描述主要以TIME2通道为例。二、中断控制1.对于STM32讲,外部中断通道位置28(35号优先级)是给外部设备TIME2的,但TIME2本身能够引起中断的中断源或事件有好多个,比如更新事件(上溢/下溢)、输入捕获、输出匹配、DMA申请等。所有TIME2的中断事件都是通过一个TIME2的中断通道向STM32内核提出中断申请,那么STM32中如何处理和控制TIME2和它众多的、不同的、中断申请呢?(题外话:STM32中的一个通用定时计数器,就比8位控制器(如AVR,MCS-51就更不必说了)中TIME要复杂多了。学过AVR的,可能对输入捕获、输出匹配等还有概念,但如果你学的标准架构的MCS-51,那么上手32位可能困难就更多了。所以我一直推荐学习8位机应该认真的从AVR开始。尽管51有很大的市场,价格也相对便宜,但从长远的眼光看问题,从后续掌握32位的使用,考虑到学生的可持续发展,AVR应该是比较好的选择。)2.cortex_m3内核对于每一个外部中断通道都有相应的控制字和控制位,用于单独的和总的控制该中断通道。它们包括有:
三亿文库包含各类专业文献、中学教育、应用写作文书、幼儿教育、小学教育、专业论文、各类资格考试、高等教育、生活休闲娱乐、17我的 stm32中断 笔记等内容。 
 STM32学习笔记之二_中断_计算机软件及应用_IT/计算机_专业资料。介绍了中断、中断服务程序、中断向量、中断向量号、中断向量地址、中断向量表的基本概念,并举例说明了...  FInder自学stm32笔记之IO口中断_计算机硬件及网络_IT/计算机_专业资料。通用和复用...那个端口 PIN:选着那个引脚 额原来他是一个寄存器,我是真的 2 啊。 看着个...  STM32外部中断学习笔记 只是自己学习的总结罢了。只是自己学习的总结罢了。隐藏&& 2013 年 10 月 19 日 自己的总结: 1. 每一个 GPIO 触发一个外部中断; 2...  STM32 中断优先级分组
10:58 STM32 中断优先级分组 Cortex-M3 ...我的stm32中断 笔记 3页 1下载券
STM32中断优先级与相关使... 8页 免费...  STM32学习笔记--使用TIM5-TIM8中断_信息与通信_工程科技_专业资料。这是本人学习STM32时候遇到问题,放在这里作为自己的学习资料。STM...  手把手教你STM32笔记_计算机硬件及网络_IT/计算机_...设置需要自己配置寄存器(自己测试) RCC_CFGR 寄存器...外部中断使用: 外部中断分两部分,初始化与中断服务...  每个中断 通道都具备自己的中断优先级控制字节 PRI_n(8 位, 但是 STM32 中...相应的 函数在 GPIO 的学习笔记中有了详细了解释。详细代码如下: void RCC_...  每个中断 通道都具备自己的中断优先级控制字节 PRI_n(8 位, 但是 STM32 中...具体 位置可以查看关于 GPIO 的笔记。这段代码编译起来没有任何问题,但是在链接...  然后,中断初始化函数 NVIC_InitTypeDef NVIC_InitS NVIC_InitStructure...Stm32 学习笔记1--时钟 5页 1下载券
5 我的基于STM32的USB学... 4页 ...温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!&&|&&
LOFTER精选
网易考拉推荐
用微信&&“扫一扫”
将文章分享到朋友圈。
用易信&&“扫一扫”
将文章分享到朋友圈。
阅读(17868)|
用微信&&“扫一扫”
将文章分享到朋友圈。
用易信&&“扫一扫”
将文章分享到朋友圈。
历史上的今天
loftPermalink:'',
id:'fks_',
blogTitle:'STM32外部中断详解',
blogAbstract:'&&&&一、基本概念
&ARM Coetex-M3内核共支持256个中断,其中16个内部中断,240个外部中断和可编程的256级中断优先级的设置。STM32目前支持的中断共84个(16个内部+68个外部),还有16级可编程的中断优先级的设置,仅使用中断优先级设置8bit中的高4位。&&&& STM32可支持68个中断通道,已经固定分配给相应的外部设备,每个中断通道都具备自己的中断优先级控制字节PRI_n(8位,但是STM32中只使用4位,高4位有效),每4',
blogTag:'',
blogUrl:'blog/static/',
isPublished:1,
istop:false,
modifyTime:3,
publishTime:3,
permalink:'blog/static/',
commentCount:3,
mainCommentCount:2,
recommendCount:7,
bsrk:-100,
publisherId:0,
recomBlogHome:false,
currentRecomBlog:false,
attachmentsFileIds:[],
groupInfo:{},
friendstatus:'none',
followstatus:'unFollow',
pubSucc:'',
visitorProvince:'',
visitorCity:'',
visitorNewUser:false,
postAddInfo:{},
mset:'000',
remindgoodnightblog:false,
isBlackVisitor:false,
isShowYodaoAd:false,
hostIntro:'',
hmcon:'0',
selfRecomBlogCount:'0',
lofter_single:''
{list a as x}
{if x.moveFrom=='wap'}
{elseif x.moveFrom=='iphone'}
{elseif x.moveFrom=='android'}
{elseif x.moveFrom=='mobile'}
${a.selfIntro|escape}{if great260}${suplement}{/if}
{list a as x}
推荐过这篇日志的人:
{list a as x}
{if !!b&&b.length>0}
他们还推荐了:
{list b as y}
转载记录:
{list d as x}
{list a as x}
{list a as x}
{list a as x}
{list a as x}
{if x_index>4}{break}{/if}
${fn2(x.publishTime,'yyyy-MM-dd HH:mm:ss')}
{list a as x}
{if !!(blogDetail.preBlogPermalink)}
{if !!(blogDetail.nextBlogPermalink)}
{list a as x}
{if defined('newslist')&&newslist.length>0}
{list newslist as x}
{if x_index>7}{break}{/if}
{list a as x}
{var first_option =}
{list x.voteDetailList as voteToOption}
{if voteToOption==1}
{if first_option==false},{/if}&&“${b[voteToOption_index]}”&&
{if (x.role!="-1") },“我是${c[x.role]}”&&{/if}
&&&&&&&&${fn1(x.voteTime)}
{if x.userName==''}{/if}
网易公司版权所有&&
{list x.l as y}
{if defined('wl')}
{list wl as x}{/list}牛人对STM32的NVIC_PriorityGroupConfig使用及优先级分组方式理解 – 漫无目的丶
STM32有43个channel的settable的中断源;AIRC(Application Interrupt and Reset Register)寄存器中有用于指定优先级的4 bits。这4个bits用于分配preemption优先级和sub优先级,在STM32的固件库中定义如下
/* Preemption Priority Group -------------------------------------------------*/
#define NVIC_PriorityGroup_0
((u32)0x700) /* 0 bits for pre-emption priority
4 bits for subpriority */
#define NVIC_PriorityGroup_1
((u32)0x600) /* 1 bits for pre-emption priority
3 bits for subpriority */
#define NVIC_PriorityGroup_2
((u32)0x500) /* 2 bits for pre-emption priority
2 bits for subpriority */
#define NVIC_PriorityGroup_3
((u32)0x400) /* 3 bits for pre-emption priority
1 bits for subpriority */
#define NVIC_PriorityGroup_4
((u32)0x300) /* 4 bits for pre-emption priority
0 bits for subpriority */
1234567891011
/* Preemption Priority Group -------------------------------------------------*/#define NVIC_PriorityGroup_0
((u32)0x700) /* 0 bits for pre-emption priority
4 bits for subpriority */#define NVIC_PriorityGroup_1
((u32)0x600) /* 1 bits for pre-emption priority
3 bits for subpriority */#define NVIC_PriorityGroup_2
((u32)0x500) /* 2 bits for pre-emption priority
2 bits for subpriority */#define NVIC_PriorityGroup_3
((u32)0x400) /* 3 bits for pre-emption priority
1 bits for subpriority */#define NVIC_PriorityGroup_4
((u32)0x300) /* 4 bits for pre-emption priority
0 bits for subpriority */
形象化的理解是:
你是上帝,
造了43个人,这么多人要分社会阶级和社会阶层了;
因为“阶级”的词性比较重;”阶层”比较中性,
所以preemption优先级-&阶级;每个阶级内部,有一些阶层,sub优先级-&阶层;
如果按照NVIC_PriorityGroup_4这么分,就分为了16个阶级(1个阶层就是1个preemption优先级),0个阶层;高阶级的人,可以打断低阶级的正在做事的人(嵌套),最多可以完成1个中断和15级嵌套。
每个阶级(每个preemption优先级),你来指定这43人中,谁进入该阶级;一个人叫EXTI0_IRQChannel,你指定他进入“阶级8”,则
NVIC_InitStructure.NVIC_IRQChannel = EXTI0_IRQC
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 8; // 指定抢占式优先级别1,可取0-15
NVIC_InitStructure.NVIC_IRQChannel = EXTI0_IRQChannel;NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 8; // 指定抢占式优先级别1,可取0-15
另外,在同一阶级内部,一个人在做事的时候,另外一个人不能打断他;(preemption优先级别相同的中断源之间没有嵌套关系)
还有,如果他们两个同时想做事,因为没有阶层,那么就根据Vector table中的物理排序,让排名靠前的人去做;
又有1个人SPI1_IRQChannel,设定如下
NVIC_InitStructure.NVIC_IRQChannel = SPI1_IRQC
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0; // 指定抢占式优先级别1,可取0-15
NVIC_InitStructure.NVIC_IRQChannel = SPI1_IRQChannel;NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0; // 指定抢占式优先级别1,可取0-15
SPI1_IRQChannel的阶级高,EXTI0_IRQChannel做事的时候可以打断(嵌套)。
如果按照NVIC_PriorityGroup_3这么分,就分为了8个阶级(1个阶级是1个preemption优先级),每个阶级内有2个阶层(sub优先级);高阶级的人,可以打断低阶级的正在做事的人(嵌套),最多可以完成1个中断和7级嵌套。
每个阶级(每个preemption优先级),你来指定这43人中,谁进入该阶级;一个人叫EXTI0_IRQChannel,你指定他进入“阶级3”,则:
NVIC_InitStructure.NVIC_IRQChannel = EXTI0_IRQC
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 3; // 指定抢占式优先级别1,可取0-7
NVIC_InitStructure.NVIC_IRQChannel = EXTI0_IRQChannel;NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 3; // 指定抢占式优先级别1,可取0-7
还需要指定他的阶层:
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; // 指定响应优先级别0,可取0-1
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; // 指定响应优先级别0,可取0-1
另有1个人叫EXTI9_5_IRQChannel,他的阶级和阶层设定如下
NVIC_InitStructure.NVIC_IRQChannel = EXTI9_5_IRQC
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 3; // 指定抢占式优先级别0,可取0-7
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1; // 指定响应优先级别1
NVIC_InitStructure.NVIC_IRQChannel = EXTI9_5_IRQChannel;NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 3; // 指定抢占式优先级别0,可取0-7NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1; // 指定响应优先级别1
那么这两个人是同一阶级的兄弟,一个人在做事的时候,另外一个人不能打断他;(preemption优先级别相同的中断源之间没有嵌套关系)
如果他们两个同时想做事,因为前者的阶层高,所以前者优先。
还有一个人叫USART1_IRQChannel,他的阶级和阶层设定如下
NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQC
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 2; // 指定抢占式优先级别0,可取0-7
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1; // 指定响应优先级别1
NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQChannel;NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 2; // 指定抢占式优先级别0,可取0-7NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1; // 指定响应优先级别1
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文件中有详细定义。
基础了解了就可以对中断进行操作了。
第一步:使用void NVIC_PriorityGroupConfig(uint32_t NVIC_PriorityGroup)函数对优先级分组配置。NVIC_PriorityGroup可以配置为
NVIC_PriorityGroup_0 =& 选择第0组
NVIC_PriorityGroup_1 =& 选择第1组
NVIC_PriorityGroup_2 =& 选择第2组
NVIC_PriorityGroup_3 =& 选择第3组
NVIC_PriorityGroup_4 =& 选择第4组
例如:NVIC_PriorityGroupConfig(NVIC_PriorityGroup_0)配置为0组。
第二步:中断初始化结构体配置,结构体类型定义如下:
typedef struct
uint8_t NVIC_IRQC
uint8_t NVIC_IRQChannelPreemptionP
//抢断优先级
uint8_t NVIC_IRQChannelSubP
//响应优先级
FunctionalState NVIC_IRQChannelC
} NVIC_InitTypeD
12345678910111213
typedef struct&{&
uint8_t NVIC_IRQChannel;
uint8_t NVIC_IRQChannelPreemptionPriority;
//抢断优先级&
uint8_t NVIC_IRQChannelSubPriority;
//响应优先级
FunctionalState NVIC_IRQChannelCmd;
&} NVIC_InitTypeDef;
例如:STM32外部中断0配置如下
EXTI_NVIC_InitStructure.NVIC_IRQChannel = EXTI0_IRQn;
EXTI_NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;
//抢占优先级别(0~1)
EXTI_NVIC_InitStructure.NVIC_IRQChannelSubPriority = 7;
//响应优先级别(0~7)
EXTI_NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
EXTI_NVIC_InitStructure.NVIC_IRQChannel = EXTI0_IRQn;&
EXTI_NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;
//抢占优先级别(0~1)&
EXTI_NVIC_InitStructure.NVIC_IRQChannelSubPriority = 7;
//响应优先级别(0~7)&
EXTI_NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
第三步:中断初始化结构体初始化操作如下
NVIC_Init(&EXTI_NVIC_InitStructure);
NVIC_Init(&EXTI_NVIC_InitStructure);
第四步:开关总中断操作。在STM32中是通过改变CPU优先级来允许和禁止中断的。
下面两个函数等效关闭总中断
void NVIC_SETPRIMASK(void);
void NVIC_SETFAULTMASK(void);
void NVIC_SETPRIMASK(void); void NVIC_SETFAULTMASK(void);
下面两个函数等效开放总中断
void NVIC_RESETPRIMASK(void);
void NVIC_RESETFAULTMASK(void);
void NVIC_RESETPRIMASK(void); void NVIC_RESETFAULTMASK(void);
常用操作是先关后开中断
NVIC_SETPRIMASK();
// Disable Interrupts
NVIC_RESETPRIMASK(); // Enable Interrupts
NVIC_SETPRIMASK();
// Disable Interrupts NVIC_RESETPRIMASK(); // Enable Interrupts
两种类型函数要成对使用
共享此文章:
发送到您的邮件地址
您的邮件地址
文章未发送,请检查您的电子邮件地址!
电子邮件检查失败,请重试
抱歉,您的博客无法通过电子邮件共享文章。STM32中断优先级(默认和不默认情况)
可能对于刚接触抢占式优先级和响应优先级的人来说学习STM32的中断优先级有点障碍,这里先介绍下优先级:
具有高抢占式优先级的中断可以在具有低抢占式优先级的中断处理过程中被响应,即中断嵌套,或者说高抢占式优先级的中断可以嵌套低抢占式优先级的中断。
当两个中断源的抢占式优先级相同时,这两个中断将没有嵌套关系,当一个中断到来后,如果正在处理另一个中断,这个后到来的中断就要等到前一个中断处理完之后才能被处理。如果这两个中断同时到达,则中断控制器根据他们的响应优先级高低来决定先处理哪一个;如果他们的抢占式优先级和响应优先级都相等,则根据他们在中断表中的排位顺序决定先处理哪一个。
STM32 可以支持的 68 个外部中断通道,已经固定的分配给相应的外部设备。每个中断
通道都具备自己的中断优先级控制字节 PRI_n(8 位,但在 STM32 中只使用 4 位,高 4 位有
效),每 4 个通道的 8 位中断优先级控制字(PRI_n)构成一个 32 位的优先级寄存器(Priority
Register)。68 个通道的优先级控制字至少构成 17 个 32 位的优先级寄存器,它们是 NVIC
寄存器中的一个重要部分。
5.对于这 4bit 的中断优先级控制位还必须分成 2 组看:从高位开始,前面是定义抢先式优
先级的位,后面用于定义子优先级。4bit 的分组组合可以有以下几种形式:
第0组:所有4位用于指定响应优先级
第1组:最高1位用于指定抢占式优先级,最低3位用于指定响应优先级
第2组:最高2位用于指定抢占式优先级,最低2位用于指定响应优先级
第3组:最高3位用于指定抢占式优先级,最低1位用于指定响应优先级
第4组:所有4位用于指定抢占式优先级
由于我们使用STM32的库函数,所以这里介绍如何使用库函数设置需要的优先级
可以通过调用STM32的固件库中的函数NVIC_PriorityGroupConfig()选择使用哪种优先级分组方式
这个函数在帮助文件的标准外设驱动的CMSIS\CMSIS_Expord_Function下;
这个函数的参 数有下列5种:
NVIC_PriorityGroup_0 =& 选择第0组
NVIC_PriorityGroup_1 =& 选择第1组
NVIC_PriorityGroup_2 =& 选择第2组
NVIC_PriorityGroup_3 =& 选择第3组
NVIC_PriorityGroup_4 =& 选择第4组
这里要注意的是
,在系统复位初始化之后,默认使用的是第0组优先级分组
接下来就是指定中断源的优先级,下面以一个简单的例子说明如何指定中断源的抢占式优先级和响应优先级:
如果应用程序储存在ROM中,并且不需要改变异常服务程序,则我们可以把整个向量表
编码到ROM的起始区域(从0
地址开始的那段)。在这种情况下,向量表的偏移量将一直为
0, 并且中断向量一直在ROM中,因此上例可以大大简化,只需3
1. 建立优先级组
2. 为该中断指定优先级
3. 使能该中断
// 选择使用优先级分组第1组
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);
// 使能EXTI0中断 初始化采用和GPIO一样的结构体形参
NVIC_InitStructure.NVIC_IRQChannel = EXTI0_IRQC
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1; //
指定抢占式优先级别1
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; //
指定响应优先级别0
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
// 使能EXTI9_5中断
NVIC_InitStructure.NVIC_IRQChannel =
EXTI9_5_IRQC//这里指的是外部中断9-5线
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0; //
指定抢占式优先级别0
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1; //
指定响应优先级别1
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
要注意的几点是:
1)如果指定的抢占式优先级别或响应优先级别超出了选定的优先级分组所限定的范围,将可能得到意想不到的结果;
这里的范围是指第4组抢占式优先级0~15, 第二组抢占式优先级范围0~3,响应优先级0~3;剩下几组同理
2)抢占式优先级别相同的中断源之间没有嵌套关系;
3)如果某个中断源被指定为某个抢占式优先级别,又没有其它中断源处于同一个抢占式优先级别,则可以为这个中断源指定任意有效的响应优先级别。也就是说抢占式优先级高的一定可以中断中断优先级低的
二,开关总中断:
在STM32/Cortex-M3中是通过改变CPU的当前优先级来允许或禁止中断。
PRIMASK位:只允许NMI和hard fault异常,其他中断/异常都被屏蔽(当前CPU优先级=0)。
FAULTMASK位:只允许NMI,其他所有中断/异常都被屏蔽(当前CPU优先级=-1)。
在STM32固件库中(stm32f10x_nvic.c和stm32f10x_nvic.h)
定义了四个函数操作PRIMASK位和FAULTMASK位,改变CPU的当前优先级,从而达到控制所有中断的目的。
新库中下面两个函数等效于关闭总中断:
void__disable_irq (void);
void __disable_fault_irq (void);
下面两个函数等效于开放总中断:
void __enable_irq (void);
void __enable_fault_irq (void);
上面两组函数要成对使用,不能交叉使用。
第一种方法:
PRIMASK 用于除能在NMI 和硬fault
之外的所有异常,它有效地把当前优先级改为0(可编程优先级中的最高优先级)。
void__disable_irq (void);//关闭总中断
void __enable_irq (void);//开放总中断
__set_PRIMASK(1);
__set_PRIMASK(0);&
第二种方法:
FAULTMASK 更绝,它把当前优先级改为‐ 1 。这么一来,连硬fault 都被掩蔽了。使用方案与PRIMASK
的相似。但要注意的是,FAULTMASK 会在异常退出时自动清零。
void __disable_fault_irq (void); //关闭总中断
void __enable_fault_irq (void);//开放总中断
__set_FAULTMASK(1);
__set_FAULTMASK(0);&
void__disable_irq (void);//关闭总中断
void __enable_irq (void);//开放总中断
上面说的可能大家看完之后第一感觉就是一头雾水,可能有点绕,下面我就结合自己的经验直白的谈谈STM32的中断优先级的、
含义和结合库函数的使用方法
库函数中提到的PreemptionPriority含义是抢占式优先级,subPriority含义是响应优先级,也叫亚优先级。何为抢占式优先级?
顾名思义,是指在抢占式优先级不同时,抢占式优先级高的可以中断抢占式优先级低的,也就是所谓的嵌套!相同的抢占式优先级之间是不可以中断嵌套的。打个比方,如果系统采用的是第4组优先级分组方式,就意味着所有的4位都被用来指定抢占式优先级,也就是说,这样一来抢占式优先级就有16个等级,通过你对需要的中断源进行中断优先级赋值,就可以实现你所希望的高优先级中断函数在低优先级中断函数未执行完之前就开始执行,即中断嵌套,该分组方式最多可以完成1个中断和15级嵌套。
通过上面我们知道抢占式优先级高的可以中断优先级低的,但是响应优先级跟抢占式优先级有什么联系呢?这里我就
打个可能不太形象的比喻,帮助大家理解一下,如果说抢占式优先级是某个等级的政府机关的话,那响应优先级就是这个政府机关里面的部门,政府机关权力有高低之分,同样每个部门之间也有权力大小之分。
下面的话语言我组织不好可能有点绕,但是大家一定要仔细看:
不同的政府机关(抢占式优先级)之间可以相互中断,但是同一个政府机关里面的不同部门(即抢占式中断优先级相同,响应优先级不同)之间不能相互中断,因为内部不能相互打架,即使响应优先级高的来了,如果此时有响应优先级低的中断服务程序正在执行,他一定要等到对方执行完之后才可以执行,但是要注意一点,虽然他不可以打断比他响应优先级低的中断服务函数,但是他有“插队”的特权,即当有多个相同抢占式优先级同时到来的时候,响应优先级高的虽然中断来的比较迟,但是他有优先执行的特权!问题又来了,如果抢占式优先级和响应优先级都相同的中断同时中断或是排队时孰先孰后呢,这就要看他们在中断向量表中的位置了,也就是说中断入口地址低的优先。
下面的问题大家就很容易理解了,不同的响应优先级不影响抢占式优先级,打个比喻就是权力高的政府机关中最烂部门说话都比权力低的政府机关中最好的部门说话好使。即权力高,可以抢断,嵌套
刚刚发现有些人把STM32的中断通道数和外部单片机引脚数混为一谈,中断通道数跟单片机引脚个数没有任何关系,目前M3内核无论多少引脚的单片机中断通道数都是84个,而无论引脚有多少个,这些引脚只占用6个通道,即0~4线分别占用一个通道,5~9线10~15线占用两个中断通道,一个中断通道可能对应很多外设
以上内容是在网上找的~
已投稿到:
以上网友发言只代表其个人观点,不代表新浪网的观点或立场。

我要回帖

更多关于 stm32f030 中断优先级 的文章

 

随机推荐