OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 39120|回复: 77

关于STM32中断优先级分组的科普,初学者常见问题解答(Q&A)

  [复制链接]

31

主题

1953

帖子

3

精华

论坛元老

Rank: 8Rank: 8

积分
4451
金钱
4451
注册时间
2018-5-11
在线时间
930 小时
发表于 2018-7-22 14:06:47 | 显示全部楼层 |阅读模式
CM3内核集成了强大的NVIC(可嵌套的向量中断控制器),
权威指南中介绍它就花了大量篇幅,
要把整个NVIC完全搞懂也不容易,
我也只学习了一点皮毛,
对于初学者来说,中断优先级分组及中断优先级设定这种基本问题是绕不开的,
刚接触NVIC的同学对此常有疑问,
本帖仅仅针对STM32中断优先级分组这一个方面,
给初学者科普一下这方面的常见问题,
老手请绕道,不过欢迎进来交流。
也可以提新的问题,我所知道的尽量解答。
我的开源链接 https://github.com/ShuifaHe/STM32.git  请关注,点赞支持哦。
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

31

主题

1953

帖子

3

精华

论坛元老

Rank: 8Rank: 8

积分
4451
金钱
4451
注册时间
2018-5-11
在线时间
930 小时
 楼主| 发表于 2018-7-22 15:48:24 | 显示全部楼层
本帖最后由 warship 于 2018-7-22 16:45 编辑

问题五:优先级分组是如何定义的?
答:前面已经明确了优先级分组的意义。那么CM3具体是如何来规定优先级分组的呢?
我们说过,全集的CM3是用8位来配置优先级的,即:给每个中断配发8位的身份证
这8位中用几位来表示抢占级,用几位来表示响应级,就由分组来进行规定。
总共8位,分成两段,只须规定从第几位分界就可以了。显然一共有8种分界方法,方法n分别对应从这8BIT的BITn处作为分界起始点。具体如下:,
方法0:从BIT0处进行分组,即BIT0代表子优先级,BIT1-7代表抢占优先级
方法1:从BIT1处进行分组,即BIT0、1代表子优先级,BIT2-7代表抢占优先级
方法2:从BIT2处进行分组,即3位子优先级,5位抢占优先级
方法3:从BIT3处进行分组,即4位子优先级,4位抢占优先级
方法4:从BIT4处进行分组,即5位子优先级,3位抢占优先级
方法5:从BIT5处进行分组,即6位子优先级,2位抢占优先级
方法6:从BIT6处进行分组,即7位子优先级,1位抢占优先级
方法7:从BIT7处进行分组,即8位子优先级,0位抢占优先级
我的开源链接 https://github.com/ShuifaHe/STM32.git  请关注,点赞支持哦。
回复 支持 5 反对 0

使用道具 举报

31

主题

1953

帖子

3

精华

论坛元老

Rank: 8Rank: 8

积分
4451
金钱
4451
注册时间
2018-5-11
在线时间
930 小时
 楼主| 发表于 2018-7-22 16:25:45 | 显示全部楼层
本帖最后由 warship 于 2018-7-22 18:21 编辑

问题六:在一个系统(软件工程)中,可以有不同的优先级分组吗?
答:先明确地告诉初学者,不可以!!!
这是初学者疑惑最多的地方,从问题五中我们知道,所谓分组是定义中断系统给每个中断配发的8位身份证中,
哪几位代表抢先级,哪几位代表响应级的。全系统必须有且只有一套标准,否则就乱套了。
就像我们的身份证,一旦规定前6位代表地区,后8位代表生日后,大家都一样,否则就无法统一解读了。
之所以有很多人有此疑惑,就是顾名思义惹的祸,“优先级分组”不是把我们现有的中断按优先级进行分组,只是一种如何解释8位优先级比特含义的方法号,全系统只能规定一次,就像我们发身份证之前,先总体看看地区需要占几位,生日需要占几位,作出统一规定,然后就依此给每个人编身份证号了。中间不能再变。
前面说了,分组方法有8种,在CM3中用3BIT来表示,分别用000-111代表上楼中的方法0-方法7, 这3比特我们一般需要在主程序刚开始的时候进行设定,告诉系统我准备采用分组方法几,库函数中有一个函数叫做NVIC_PriorityGroupConfig()用来配置优先级分组,就是干这事儿的。如果采用寄存器编程,直接设置SCB->AIRCR的BIT10:8这3位就可以了。

只有一个优先级分组只有一个优先级分组只有一个优先级分组!!! 重要的事情说三遍。
一个程序中只设一次优先级分组!!! 当然,必须指出,技术上,程序中途是可以改变优先级分组的,但必须知道,这个改变是全局性的,后面的改变将清除前面的定义,所有的各个中断优先级设定都会按照新的分组设定进行重新解读,除非你是高手且有不得已的特殊需求,否则没有人这么做的。
我的开源链接 https://github.com/ShuifaHe/STM32.git  请关注,点赞支持哦。
回复 支持 4 反对 0

使用道具 举报

31

主题

1953

帖子

3

精华

论坛元老

Rank: 8Rank: 8

积分
4451
金钱
4451
注册时间
2018-5-11
在线时间
930 小时
 楼主| 发表于 2018-7-22 15:09:13 | 显示全部楼层
本帖最后由 warship 于 2018-7-22 18:12 编辑

问题三: 中断优先级设置是如何表示优先级的?
答:问题二中我们说,每个外部中断由8比特来表示自己的中断优先级。
那么,这8比特的表示范围就是0-255即共有256种取值,可以表达256种不同的优先级。
ARM规定,优先级的取值越小,优先级别越高。 即0最高(系统内部还有级别更高的几个负数优先级的,这是特殊情况,本帖不讨论),255最低。
如果只是简单这么定义的话,就比较好理解了,初学者也不会有种种的疑问了。
这种表示方法总体是对的,但太粗线条了。它只是简单把中断分成了256级,级数太多,没有主次,不方便使用和管理。
就像社会上有256个人,每个人都不同级别一样,估计你会眼花缭乱。
怎么办?那就是先分阶层,阶层内再分子级的分层管理。 如先分统治阶层、奴隶主、奴隶等,同一阶层再区分小级别。
这样,就引入了分组的概念,先规定一下,这8比特怎么用? 用几比特表示阶层,用几比特来表示小级别。
就像我们的身份证一样,规定几位表示地区,几位表示生日等等。
我的开源链接 https://github.com/ShuifaHe/STM32.git  请关注,点赞支持哦。
回复 支持 2 反对 0

使用道具 举报

31

主题

1953

帖子

3

精华

论坛元老

Rank: 8Rank: 8

积分
4451
金钱
4451
注册时间
2018-5-11
在线时间
930 小时
 楼主| 发表于 2018-7-22 14:42:06 | 显示全部楼层
问题二: 每个中断都有优先级设置, 它是什么样的? 存放在什么地方?
答:每个中断都有优先级设置,除了系统内核的中断外,STM32还可以有多达240个外部中断。
这240个外部中断,都可以由用户自由设置优先级,由8位即一个字节来表示。
由系统内核中的240个寄存器来存放,每个寄存器宽度为8比特。
NVIC->IP[240]可以理解是一个以中断通道号为下标索引的240个元素的u8寄存器数组。(没学之前,我还真不知道内核中有这么多的寄存器)。
由于用户的需求不同,ARM可以允许具体的芯片对中断级数进行简化,只实现这8位中的高几位。
比如:我们常用的STM32芯片,就只实现了一半,即高4位。
所以,在我们常用的STM32芯片中,这240个宽度为一个字节的寄存器都只有高4位有效! (没学之前,我还真不知道内核中的寄存器还这么浪费!哈哈)
我的开源链接 https://github.com/ShuifaHe/STM32.git  请关注,点赞支持哦。
回复 支持 2 反对 0

使用道具 举报

0

主题

3

帖子

0

精华

新手上路

积分
32
金钱
32
注册时间
2018-5-7
在线时间
7 小时
发表于 2018-12-26 15:00:02 | 显示全部楼层
warship 发表于 2018-12-24 22:11
实际上问题13已经讲得很清楚了,
复位后,000代表分组方法0,不是分组0,
参考问题七,方法0表示从BIT0 ...

明白清楚了,谢谢楼主耐心赐教。我把概念理解错了,谢谢又get明白一个点
回复 支持 1 反对 0

使用道具 举报

31

主题

1953

帖子

3

精华

论坛元老

Rank: 8Rank: 8

积分
4451
金钱
4451
注册时间
2018-5-11
在线时间
930 小时
 楼主| 发表于 2018-7-22 17:23:44 | 显示全部楼层
本帖最后由 warship 于 2018-7-22 17:31 编辑

问题八:如何设置系统的优先级分组?
答:一个系统,优先级分组只须设定一次,那么应该如何设定呢?
当然是根据整个系统的需求来综合考虑了。
还是以身份证为例,在发放身份证之前,我们要总体考虑全国要分多少个区域,然后确定地区需要设置几位数才够。
在4位的优先级系统中,给每个中断的身份证只有4个有效位,我们需要在这4位中,需要分成用几位表达抢占优先级,用几位表达响应优先级。总体来看,各个中断需要拉开层次,等级分化多,就让抢占位多配一些;各个中断彼此都差不多,无须分三六九等,就让抢占位少配一些;一般原子的例程中是取了折中,统一采用分组2,即抢占和响应各占2位,这里就有0-3共四级抢占,0-3共四级响应,总体设定后,对于每个具体的中断,则根据实际需要,在可选范围内分配抢占级和响应级。
我的开源链接 https://github.com/ShuifaHe/STM32.git  请关注,点赞支持哦。
回复 支持 1 反对 0

使用道具 举报

31

主题

1953

帖子

3

精华

论坛元老

Rank: 8Rank: 8

积分
4451
金钱
4451
注册时间
2018-5-11
在线时间
930 小时
 楼主| 发表于 2018-7-22 15:29:10 | 显示全部楼层
本帖最后由 warship 于 2018-7-22 18:14 编辑

问题四:优先级分组是什么意思?
答:首先,你必须先明白了上楼的问题三,分组的引入需求。
说白一点,就是给每人发了一张身份证,所谓分组就是一个规定:如何去解释这身份证号码的含义,比如哪几位表示地区,哪几位表示生日。
每一个中断的优先级就是它在中断系统中的身份证,这个身份证有8位,要分成两段,一段用来表示自己的阶层,一段用来表示自己在同一阶层中的小级别。用STM32的说法,分别叫做抢占优先级和响应优先级(后者常称为子优先级),当你申请中断时,系统要查验你的身份证,看人下菜碟,抢占优先级高的,顾名思义可以有权打断正在享受服务的抢占优先级低的中断,抢占优先级一样的,才去看响应优先级,虽然不能强行打断,但大家都在排队等待服务时,可以插队,即优先得到响应。
这个所谓的“优先级分组”就是明确规定这8位中,用哪几位表示抢占,哪几位表示子优先级别的。
我的开源链接 https://github.com/ShuifaHe/STM32.git  请关注,点赞支持哦。
回复 支持 1 反对 0

使用道具 举报

31

主题

1953

帖子

3

精华

论坛元老

Rank: 8Rank: 8

积分
4451
金钱
4451
注册时间
2018-5-11
在线时间
930 小时
 楼主| 发表于 2018-8-11 13:19:38 | 显示全部楼层
问题十三:系统复位后,STM32中断优先分组是什么样的?
系统复位之后,会将NVIC内核寄存器SCB->AIRCR的BIT10:8这三位变成000,也就是说默认采用分组方法0:从BIT0处进行分组,即BIT0代表子优先级,BIT1-7代表抢占优先级。具体在实际为4位的优先级系统中,则4位全都是抢占优先级,没有子优先级。

这样的话,抢占优先级范围为0-15共16级,0级响应优先级,所以开机不设定优先级分组也是可以工作的。此时,任意两个中断之间都是抢占关系(当然只有数值低的中断才能抢占数值高的中断了,注意数值越低越优先),你后面在给每个中断分配优先级时,抢占优先级可以在0-15内选择,无须设置响应优先级,假如这种优先级分组可以满足你全系统的实际要求,开机不设置优先级也无妨的。

这个是全局性的系统分组,至于各个中断通道,其代表自身优先级的4BIT都被复位为0,包括我们常用的系统嘀哒SYSTICK也是0,即都是最高优先级。
我的开源链接 https://github.com/ShuifaHe/STM32.git  请关注,点赞支持哦。
回复 支持 1 反对 0

使用道具 举报

31

主题

1953

帖子

3

精华

论坛元老

Rank: 8Rank: 8

积分
4451
金钱
4451
注册时间
2018-5-11
在线时间
930 小时
 楼主| 发表于 2018-7-23 08:34:15 | 显示全部楼层
筑梦233 发表于 2018-7-22 17:58
顶顶顶,好贴,解决了我的好多疑惑。

谢谢支持,有用就行。
我的开源链接 https://github.com/ShuifaHe/STM32.git  请关注,点赞支持哦。
回复 支持 1 反对 0

使用道具 举报

31

主题

1953

帖子

3

精华

论坛元老

Rank: 8Rank: 8

积分
4451
金钱
4451
注册时间
2018-5-11
在线时间
930 小时
 楼主| 发表于 2018-7-23 20:49:15 | 显示全部楼层
问题十一:两个不同的中断,优先级可以设置完全一样吗?
答:可以。
实际上,我们常用的STM32是用4位来区分优先级的。共可设16种不同的优先级,而我们可用的中断远不止16种,
所以当系统用到的中断数多于16种时,也不得不重复了。这时候,完全相同优先级的两个中断根据硬件的排序来决定谁先得到服务,具体查阅有关手册。
如果真的优先级数不够用时,我们可以把无所谓谁先谁后的两个中断设置为完全相同的优先级。
我的开源链接 https://github.com/ShuifaHe/STM32.git  请关注,点赞支持哦。
回复 支持 1 反对 0

使用道具 举报

31

主题

1953

帖子

3

精华

论坛元老

Rank: 8Rank: 8

积分
4451
金钱
4451
注册时间
2018-5-11
在线时间
930 小时
 楼主| 发表于 2018-7-22 14:17:59 | 显示全部楼层
本帖最后由 warship 于 2018-7-22 14:24 编辑

问题一、为什么要设置中断优先级?
答:中断,在STM32中也称之为异常,就是说程序必须中断正常的执行流程,处理各种临时发生的异常情况。
当同时发生几种不同的异常情况时,先去响应哪个? 需要设置优先级。
当正在处理异常时,又发生了情况更紧急的异常时,需要设置优先级,使更高级的中断可以打断正在执行的低优先级服务。
种种需求,必须把各个中断分出三六九等,这就是中断优先级。每一个中断都有自己的优先级设定,这个相当于它在整个中断系统中的身份证,服务卡。
我的开源链接 https://github.com/ShuifaHe/STM32.git  请关注,点赞支持哦。
回复 支持 1 反对 0

使用道具 举报

31

主题

1953

帖子

3

精华

论坛元老

Rank: 8Rank: 8

积分
4451
金钱
4451
注册时间
2018-5-11
在线时间
930 小时
 楼主| 发表于 2018-7-22 16:38:48 | 显示全部楼层
本帖最后由 warship 于 2018-7-22 17:05 编辑

问题七:我们常用的4BIT优先级,分组是如何定义的?
答:前面提到过,CM3的内核是规划了用8位来表示优先级。但又允许具体的厂家可以部分实现,
这样就出现了我们常用的STM32芯片都打了对折,即只用4位来表示优先级为了最大限度的方便移植,ARM为了各系列芯片能够兼容并蓄,
定义了具体芯片的裁减原则,
可以从LSB(最低位BIT0)开始进行裁减,即:可以不实现低位,但高位必须实现。
比如只实现4位,则只有BIT7-4有用,其它位无用
但分组定义方法仍套用8位全集的,即如下:

方法0:从BIT0处进行分组,即BIT0代表子优先级,BIT1-7代表抢占优先级
方法1:从BIT1处进行分组,即BIT0、1代表子优先级,BIT2-7代表抢占优先级
方法2:从BIT2处进行分组,即3位子优先级,5位抢占优先级
方法3:从BIT3处进行分组,即4位子优先级,4位抢占优先级
方法4:从BIT4处进行分组,即5位子优先级,3位抢占优先级
方法5:从BIT5处进行分组,即6位子优先级,2位抢占优先级
方法6:从BIT6处进行分组,即7位子优先级,1位抢占优先级
方法7:从BIT7处进行分组,即8位子优先级,0位抢占优先级
由于BIT0-BIT3厂家没有实现功能,这个时候以上方法3-方法0的实际效果是一样的,
都是BIT4-7为抢占级,
只有从方法4 开始才会体现出区别,
小于等于方法3,子优先级实际位数都是0(如:方法3理论上是定义了4位子优先级,参见上面的定义),
因这些位不存在(厂家没有实现功能),可看作理论上有,实际上没有
方法4:从BIT4开始表示子优先级,即1位(理论上是5位)子优先级,3位抢占优先级
方法5:从BIT5开始表示子优先级,即2位(理论上是6位)子优先级,2位抢占优先级
方法6:从BIT6开始表示子优先级,即3位(理论上是7位)子优先级,1位抢占优先级
方法7:从BIT5开始表示子优先级,即4位(理论上是8位)子优先级,0位抢占优先级



这样,对于4位优先级的系统,则实际退化成只有五种分组:
分组4:从BIT4开始表示子优先级,即0位子优先级,4位抢占优先级(对应上面的方法3,设置SCB->AIRCR的BIT10:8为011
分组3:从BIT4开始表示子优先级,即1位子优先级,3位抢占优先级(对应上面的方法4,设置SCB->AIRCR的BIT10:8为100
分组2:从BIT5开始表示子优先级,即2位子优先级,2位抢占优先级(对应上面的方法5,设置SCB->AIRCR的BIT10:8为101
分组1:从BIT6开始表示子优先级,即3位子优先级,1位抢占优先级(对应上面的方法6,设置SCB->AIRCR的BIT10:8为110
分组0:从BIT5开始表示子优先级,即4位子优先级,0位抢占优先级(对应上面的方法7,设置SCB->AIRCR的BIT10:8为111







我的开源链接 https://github.com/ShuifaHe/STM32.git  请关注,点赞支持哦。
回复 支持 反对

使用道具 举报

31

主题

1953

帖子

3

精华

论坛元老

Rank: 8Rank: 8

积分
4451
金钱
4451
注册时间
2018-5-11
在线时间
930 小时
 楼主| 发表于 2018-7-22 17:32:07 | 显示全部楼层
本帖最后由 warship 于 2018-7-22 18:26 编辑

问题九:在设置具体的中断优先级时,如果超出了设置范围会如何?
答:一个系统,优先级分组设定之后,其抢占优先级及响应优先级的数值范围也就确定了。
比如在4位的优先级系统中,如果设定了采用分组2,即抢占和响应各占2位,就有0-3共四级抢占,0-3共四级响应,对于每个具体的中断,则根据实际需要,在可选范围内分配抢占级和响应级,不要超出范围。如果超出会怎样呢?比如我设某中断的抢占级为5,响应级为7,调用库函数时,一般会根据优先级分组设定的位数要求,从最低位开始进行截取,由于抢占和响应各占2位,如果设置抢占级为5,即0101截取低两位为01即=1;如果设置响应级为7,即0111截取低两位为11即=3 。这样的结果,不知道是不是符合你的预期就不得而知了。
我的开源链接 https://github.com/ShuifaHe/STM32.git  请关注,点赞支持哦。
回复 支持 反对

使用道具 举报

31

主题

1953

帖子

3

精华

论坛元老

Rank: 8Rank: 8

积分
4451
金钱
4451
注册时间
2018-5-11
在线时间
930 小时
 楼主| 发表于 2018-7-22 17:47:14 | 显示全部楼层
本帖最后由 warship 于 2018-7-22 18:28 编辑

问题十:如果我不设置优先级分组会如何?
答:一般程序会在时钟初始化之后就设定一个优先级分组,如果不设置,会如何呢?
系统复位之后,会将NVIC内核寄存器SCB->AIRCR的BIT10:8这三位变成000,也就是说默认采用分组方法0:从BIT0处进行分组,即BIT0代表子优先级,BIT1-7代表抢占优先级。具体在实际为4位的优先级系统中,则4位全都是抢占优先级,没有子优先级。

这样的话,抢占优先级范围为0-15共16级,0级响应优先级,所以开机不设定优先级分组也是可以工作的。此时,任意两个中断之间都是抢占关系(当然只有数值低的中断才能抢占数值高的中断了,注意数值越低越优先),你后面在给每个中断分配优先级时,抢占优先级可以在0-15内选择,无须设置响应优先级,假如这种优先级分组可以满足你全系统的实际要求,开机不设置优先级也无妨的。

我的开源链接 https://github.com/ShuifaHe/STM32.git  请关注,点赞支持哦。
回复 支持 1 反对 0

使用道具 举报

0

主题

8

帖子

0

精华

新手上路

积分
41
金钱
41
注册时间
2018-7-15
在线时间
5 小时
发表于 2018-7-22 17:58:53 | 显示全部楼层
顶顶顶,好贴,解决了我的好多疑惑。
回复 支持 1 反对 0

使用道具 举报

31

主题

1953

帖子

3

精华

论坛元老

Rank: 8Rank: 8

积分
4451
金钱
4451
注册时间
2018-5-11
在线时间
930 小时
 楼主| 发表于 2018-7-24 17:43:37 | 显示全部楼层
本帖最后由 warship 于 2018-7-28 22:16 编辑

问题十二: STM32有多少个中断?
答:CM3内核中断有16个,实际芯片大概实现了8个左右,这些中断一般是系统级的中断,优先级较高(也有优先级低的,如Systick),没有在本帖前述问题的讨论范围之列。
除此之外的,通称为外部中断(注意不要与EXTI外部线中断搞混了),最大外部中断数可达240个之多。
但实际的芯片没有实现这么多,根据具体芯片的不同,大约在68个(有的是60个)左右。
我的开源链接 https://github.com/ShuifaHe/STM32.git  请关注,点赞支持哦。
回复 支持 反对

使用道具 举报

31

主题

1953

帖子

3

精华

论坛元老

Rank: 8Rank: 8

积分
4451
金钱
4451
注册时间
2018-5-11
在线时间
930 小时
 楼主| 发表于 2018-7-25 22:09:28 | 显示全部楼层
还有新的问题吗?
我的开源链接 https://github.com/ShuifaHe/STM32.git  请关注,点赞支持哦。
回复 支持 反对

使用道具 举报

31

主题

1953

帖子

3

精华

论坛元老

Rank: 8Rank: 8

积分
4451
金钱
4451
注册时间
2018-5-11
在线时间
930 小时
 楼主| 发表于 2018-7-28 19:44:28 | 显示全部楼层
本帖最后由 warship 于 2018-7-28 20:47 编辑

关于SYSTICK中断优先级的讨论
http://www.openedv.com/forum.php ... =1&extra=#pid862314
SCB->SHP[11]即为SYSTICK的中断优先级
其它系统异常的优先级寄存器为:
存储器管理 fault 的优先级:   SCB->SHP[0]  
总线 fault 的优先级:SCB->SHP[1]
用法 fault 的优先级:SCB->SHP[2]
SVC 优先级:SCB->SHP[7]
调试监视器的优先级:SCB->SHP[8]
PendSV 的优先级:SCB->SHP[10]

我的开源链接 https://github.com/ShuifaHe/STM32.git  请关注,点赞支持哦。
回复 支持 反对

使用道具 举报

0

主题

8

帖子

0

精华

新手上路

积分
41
金钱
41
注册时间
2018-7-15
在线时间
5 小时
发表于 2018-7-29 20:44:42 | 显示全部楼层
感谢楼主
回复 支持 反对

使用道具 举报

1

主题

8

帖子

0

精华

初级会员

Rank: 2

积分
63
金钱
63
注册时间
2018-5-16
在线时间
11 小时
发表于 2018-8-1 23:08:23 | 显示全部楼层
谢谢楼主精心列举解答问题,解决了我许多困惑。
回复 支持 反对

使用道具 举报

31

主题

1953

帖子

3

精华

论坛元老

Rank: 8Rank: 8

积分
4451
金钱
4451
注册时间
2018-5-11
在线时间
930 小时
 楼主| 发表于 2018-8-2 19:34:18 | 显示全部楼层
嘀嗒 发表于 2018-8-1 23:08
谢谢楼主精心列举解答问题,解决了我许多困惑。

感谢支持,欢迎来提问,知无不言,哈哈。
我的开源链接 https://github.com/ShuifaHe/STM32.git  请关注,点赞支持哦。
回复 支持 反对

使用道具 举报

3

主题

35

帖子

0

精华

初级会员

Rank: 2

积分
173
金钱
173
注册时间
2018-6-1
在线时间
20 小时
发表于 2018-8-3 10:09:48 | 显示全部楼层
谢谢谢谢·
回复 支持 反对

使用道具 举报

26

主题

355

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1770
金钱
1770
注册时间
2017-4-1
在线时间
432 小时
发表于 2018-8-3 11:41:57 | 显示全部楼层
哇 感谢楼主 讲得很详细
回复 支持 反对

使用道具 举报

0

主题

4

帖子

0

精华

初级会员

Rank: 2

积分
56
金钱
56
注册时间
2016-11-10
在线时间
13 小时
发表于 2018-8-11 20:15:29 | 显示全部楼层
warship 发表于 2018-7-23 20:49
问题十一:两个不同的中断,优先级可以设置完全一样吗?
答:可以。
实际上,我们常用的STM32是用4位来区 ...

感谢搂主,正在努力学习中。
回复 支持 反对

使用道具 举报

31

主题

1953

帖子

3

精华

论坛元老

Rank: 8Rank: 8

积分
4451
金钱
4451
注册时间
2018-5-11
在线时间
930 小时
 楼主| 发表于 2018-8-11 20:43:27 | 显示全部楼层
本帖最后由 warship 于 2018-8-11 21:23 编辑

问题十四:最高的优先级是0吗?
答:我们前面说了,STM32常见芯片是以4位来表达优先级的,所以共有16个不同的优先级。
其值越小则优先级越高,那么最高优先级就是0了。对于240个外部中断来说就是如此,但是
系统内核为自己留了后手,其中有几个比0的优先级还高,是负值,并且这些为负值的优先级还是固定的,
用户无法对此进行重新设置。分别是复位的优先级最高,为-3, 不可屏蔽中断次之,为-2,
硬件故障再次之,为-1
详见下表:


int_vtor.png
我的开源链接 https://github.com/ShuifaHe/STM32.git  请关注,点赞支持哦。
回复 支持 反对

使用道具 举报

31

主题

1953

帖子

3

精华

论坛元老

Rank: 8Rank: 8

积分
4451
金钱
4451
注册时间
2018-5-11
在线时间
930 小时
 楼主| 发表于 2018-8-11 21:30:01 | 显示全部楼层
本帖最后由 warship 于 2018-8-12 13:19 编辑

问题十五:如何读懂楼上的这张表?
答:楼上的这张表,又称为中断向量表,我们在编程手册中可以看到,不同的芯片可能略有不同。
表中列出了系统可用的所有中断(楼上的图只截取了前面的局部,后面的略去了),
其中最靠前的深色部分,是CM3系统内核保留的内部异常;
后面浅色部分(“位置”一栏从0开始)就是我们用户使用的外部中断(外部中断是相对内部中断而言的,请注意我们常说的外部中断EXTI应该称之为外部线中断)了。



下面我逐栏讲解一下:
第一栏:“位置” 是系统的中断通道编号值IRQn,我们见到是从0开始的,最大可达239(实际芯片实现了大约60多个)
            0之前上表没有标示,实际可以依序填写-1、-2、-3、-4等等。
            这个IRQn是严格排序的,系统对各中断优先级寄存器的检索,中断向量的查表就是以此为索引的。
第二栏:“优先级” 就是我们本帖所讲的重点了,每一个中断都有其优先级,
            不过,此表中只有为负数的三个中断的优先级是真实值(并且是固定不可改变的)。其它从0开始的优先级并不表示真正的优先级值,
            因为0以上的优先级值范围只能有0到15,这里全表列到了好几十。所以本表中优先级一栏0以上的值仅表示各中断的优先级排序,
            其唯一的意义是: 当优先级设置完全相同时,序号小的会更优先一些而已。
第三栏:“优先级类型” 显示优先级值是否可变。 这一栏比较简单,只有三个负数优先级是固定值,其它各中断都可由用户编程进行调整。
第四栏:“名称” 这个不用解释了。我们采用库函数时一般对应名称为“????_IRQn”,前面的?是名称对应的字母,如:外部线1中断为“EXTI1_IRQn”
第五栏:“说明” 这个也不用再说明了。
第六栏:“地址” 这个就是大名鼎鼎的所谓中断向量了,是各中断的中断服务函数入口地址。当发生中断时,系统就查这个表进入相应的中断服务程序。

我的开源链接 https://github.com/ShuifaHe/STM32.git  请关注,点赞支持哦。
回复 支持 反对

使用道具 举报

0

主题

6

帖子

0

精华

初级会员

Rank: 2

积分
53
金钱
53
注册时间
2016-9-13
在线时间
11 小时
发表于 2018-8-12 09:00:07 | 显示全部楼层
感谢分享
回复 支持 反对

使用道具 举报

8

主题

40

帖子

0

精华

初级会员

Rank: 2

积分
151
金钱
151
注册时间
2018-1-31
在线时间
49 小时
发表于 2018-9-17 21:52:11 | 显示全部楼层
warship 发表于 2018-7-22 16:38
问题七:我们常用的4BIT优先级,分组是如何定义的?
答:前面提到过,CM3的内核是规划了用8位来表示优先级 ...

感谢楼主的解惑,
一直有几个问题让我困扰,望楼主解答
第一各问题  SCB->AIRCR(楼主的意思是这个是设置优先级分组寄存器)
这个寄存器楼主是怎么找到的,我在STM32中文参考手册没找到  在CM3技术手册中也没有找到这个寄存器
第二个问题   中断优先级序号在那个寄存器设置,同样在SCB->AIRCR这个寄存器设置吗?设置的的是4  5  6  7位吗,可我还是回到第一个问题了,我找不到手册中的SCB->AIRCR 寄存器描述



以下是我的理解:
设置好了优先级分组,但是还没有设置好优先级序号,  
如:分组2,即2位子优先级,2位抢占优先级(对应上面的方法5,设置SCB->AIRCR的BIT10:8为101),这里我也能看懂,2位抢占优先级和2位子优先级  也就是抢占优先级可以设置成 00的时候,子优先级还可以设置成00 01 10 11四种模式  
同时抢占式优先级设置成01的时候 同样子优先级同样还可以设置成00 01 10 11四种模式,
回复 支持 反对

使用道具 举报

31

主题

1953

帖子

3

精华

论坛元老

Rank: 8Rank: 8

积分
4451
金钱
4451
注册时间
2018-5-11
在线时间
930 小时
 楼主| 发表于 2018-9-17 22:09:45 | 显示全部楼层
xiao19344859 发表于 2018-9-17 21:52
感谢楼主的解惑,
一直有几个问题让我困扰,望楼主解答
第一各问题  SCB->AIRCR(楼主的意思是这个是设置 ...

http://www.openedv.com/forum.php ... 8%CD%FE%D6%B8%C4%CF
我的开源链接 https://github.com/ShuifaHe/STM32.git  请关注,点赞支持哦。
回复 支持 反对

使用道具 举报

31

主题

1953

帖子

3

精华

论坛元老

Rank: 8Rank: 8

积分
4451
金钱
4451
注册时间
2018-5-11
在线时间
930 小时
 楼主| 发表于 2018-9-17 22:16:01 | 显示全部楼层
xiao19344859 发表于 2018-9-17 21:52
感谢楼主的解惑,
一直有几个问题让我困扰,望楼主解答
第一各问题  SCB->AIRCR(楼主的意思是这个是设置 ...

有一本书叫做CM3权威指南,链接见楼上。
对分组的理解你是对的,在SCB->AIRCR的BIT10:8这3位中设置,并且只有这一处。
对于优先级,你的理解也是对的,但不是在4  5  6  7位,
每一个具体的中断都要设置独立的优先级,光这4位怎么够。
内核中有一群庞大的寄存器组,就是用来干这事儿的,参见本主题的问题二(在第3楼)。

我的开源链接 https://github.com/ShuifaHe/STM32.git  请关注,点赞支持哦。
回复 支持 反对

使用道具 举报

3

主题

29

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
299
金钱
299
注册时间
2018-8-18
在线时间
67 小时
发表于 2018-10-13 09:33:45 | 显示全部楼层
亲,请问SCB->AIRCR的BIT10:8 ,3位。但是分组为什么说4位,另一位在哪里?
回复 支持 反对

使用道具 举报

3

主题

29

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
299
金钱
299
注册时间
2018-8-18
在线时间
67 小时
发表于 2018-10-13 09:36:19 | 显示全部楼层
agelarui 发表于 2018-10-13 09:33
亲,请问SCB->AIRCR的BIT10:8 ,3位。但是分组为什么说4位,另一位在哪里?

The PRIGROUP field indicates the position of the binary point that splits the PRI_n fields in
the Interrupt Priority Registers into separate group priority and subpriority fields.
回复 支持 反对

使用道具 举报

3

主题

29

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
299
金钱
299
注册时间
2018-8-18
在线时间
67 小时
发表于 2018-10-13 09:38:04 | 显示全部楼层
agelarui 发表于 2018-10-13 09:36
The PRIGROUP field indicates the position of the binary point that splits the PRI_n fields in
the ...

SCB->AIRCR的BIT10:8 设置分割点的位置,而设置寄存器在 PRI_n field里面 ,请问PRI_n field在哪里
回复 支持 反对

使用道具 举报

31

主题

1953

帖子

3

精华

论坛元老

Rank: 8Rank: 8

积分
4451
金钱
4451
注册时间
2018-5-11
在线时间
930 小时
 楼主| 发表于 2018-10-13 21:29:18 | 显示全部楼层
agelarui 发表于 2018-10-13 09:38
SCB->AIRCR的BIT10:8 设置分割点的位置,而设置寄存器在 PRI_n field里面 ,请问PRI_n field在哪里

看问题二
我的开源链接 https://github.com/ShuifaHe/STM32.git  请关注,点赞支持哦。
回复 支持 反对

使用道具 举报

31

主题

1953

帖子

3

精华

论坛元老

Rank: 8Rank: 8

积分
4451
金钱
4451
注册时间
2018-5-11
在线时间
930 小时
 楼主| 发表于 2018-10-13 21:34:33 | 显示全部楼层
本帖最后由 warship 于 2018-10-13 21:35 编辑
agelarui 发表于 2018-10-13 09:36
The PRIGROUP field indicates the position of the binary point that splits the PRI_n fields in
the ...

Please read the answer for question No.2 carefully.
我的开源链接 https://github.com/ShuifaHe/STM32.git  请关注,点赞支持哦。
回复 支持 反对

使用道具 举报

3

主题

288

帖子

0

精华

高级会员

Rank: 4

积分
865
金钱
865
注册时间
2018-8-28
在线时间
130 小时
发表于 2018-10-16 13:00:57 | 显示全部楼层
顶一下
回复 支持 反对

使用道具 举报

0

主题

11

帖子

0

精华

初级会员

Rank: 2

积分
159
金钱
159
注册时间
2018-10-21
在线时间
135 小时
发表于 2018-10-29 22:22:19 | 显示全部楼层
必须顶一下!!!
回复 支持 反对

使用道具 举报

0

主题

22

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
223
金钱
223
注册时间
2018-6-2
在线时间
65 小时
发表于 2018-10-30 14:51:24 | 显示全部楼层
顶一个
回复 支持 反对

使用道具 举报

0

主题

3

帖子

0

精华

新手入门

积分
12
金钱
12
注册时间
2018-10-2
在线时间
2 小时
发表于 2018-11-30 20:47:46 | 显示全部楼层
楼主很强,
顶一下
回复 支持 反对

使用道具 举报

7

主题

49

帖子

0

精华

初级会员

Rank: 2

积分
152
金钱
152
注册时间
2018-7-18
在线时间
37 小时
发表于 2018-12-6 13:50:47 | 显示全部楼层
warship 发表于 2018-7-22 15:29
问题四:优先级分组是什么意思?
答:首先,你必须先明白了上楼的问题三,分组的引入需求。
说白一点,就 ...

请问:抢占优先级相同、子优先级不同时,没有强行打断的情况下,子优先级数值越小的先执行吧?
回复 支持 反对

使用道具 举报

31

主题

1953

帖子

3

精华

论坛元老

Rank: 8Rank: 8

积分
4451
金钱
4451
注册时间
2018-5-11
在线时间
930 小时
 楼主| 发表于 2018-12-6 15:05:06 | 显示全部楼层
satine 发表于 2018-12-6 13:50
请问:抢占优先级相同、子优先级不同时,没有强行打断的情况下,子优先级数值越小的先执行吧?

是的。
我的开源链接 https://github.com/ShuifaHe/STM32.git  请关注,点赞支持哦。
回复 支持 反对

使用道具 举报

0

主题

3

帖子

0

精华

新手上路

积分
32
金钱
32
注册时间
2018-5-7
在线时间
7 小时
发表于 2018-12-20 11:23:01 | 显示全部楼层
warship 发表于 2018-7-22 17:47
问题十:如果我不设置优先级分组会如何?
答:一般程序会在时钟初始化之后就设定一个优先级分组,如果不设 ...

楼主讲解的非常详细准确,但是我对这楼有一点有一点疑问。内核寄存器SCB->AIRCR的BIT10:8这三位变成000,其实就是该寄存器的reset value为0xFA05 0000。但是查阅PM0056手册page135,默认值为000时 没有标明分组为0的方式。 请求楼主大大解惑一下。。。。
搜狗截图20181220112243.png
回复 支持 反对

使用道具 举报

21

主题

151

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
423
金钱
423
注册时间
2017-4-1
在线时间
73 小时
发表于 2018-12-20 23:43:21 | 显示全部楼层
的确是好贴。我还有2个疑问,
1   假如几个中断需要设置优先级,前面几个设置为一个分组,后面一个输入出现失误选了另一个分组,会出现什么情况;
2   接上面,中间设错了分组,后面的是正确的分组,又会是什么情况。
回复 支持 反对

使用道具 举报

31

主题

1953

帖子

3

精华

论坛元老

Rank: 8Rank: 8

积分
4451
金钱
4451
注册时间
2018-5-11
在线时间
930 小时
 楼主| 发表于 2018-12-21 22:28:21 | 显示全部楼层
SGDH666 发表于 2018-12-20 11:23
楼主讲解的非常详细准确,但是我对这楼有一点有一点疑问。内核寄存器SCB->AIRCR的BIT10:8这三位变成000, ...

复位后的情况,请认真看问题13的解答。
我的开源链接 https://github.com/ShuifaHe/STM32.git  请关注,点赞支持哦。
回复 支持 反对

使用道具 举报

31

主题

1953

帖子

3

精华

论坛元老

Rank: 8Rank: 8

积分
4451
金钱
4451
注册时间
2018-5-11
在线时间
930 小时
 楼主| 发表于 2018-12-21 22:33:02 | 显示全部楼层
本帖最后由 warship 于 2018-12-21 22:34 编辑
bucker 发表于 2018-12-20 23:43
的确是好贴。我还有2个疑问,
1   假如几个中断需要设置优先级,前面几个设置为一个分组,后面一个输入出 ...

1、所谓分组是对优先级ID的一种解释方式,任一时刻只能有一种解释方式,也就是分组的设置只能有一次,如果后面再误设一次,则按新的解释方式来解释所有的优先级ID
2、以最后一次的分组设置解释一切。请认真看问题六
我的开源链接 https://github.com/ShuifaHe/STM32.git  请关注,点赞支持哦。
回复 支持 反对

使用道具 举报

8

主题

293

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1001
金钱
1001
注册时间
2018-8-16
在线时间
327 小时
发表于 2018-12-22 00:03:14 | 显示全部楼层
warship 发表于 2018-7-22 15:29
问题四:优先级分组是什么意思?
答:首先,你必须先明白了上楼的问题三,分组的引入需求。
说白一点,就 ...

谢谢科普。
是否就是这样理解:

1,抢占优先级相同的两个中断A和B,如果A已进入中断服务函数,而B发生中断,这时即使B的子优先级高于A的子优先级,B也不能打断A的中断服务函数。

2,假如B的抢占优先级高于A,则B就可以打断A的中断服务函数,运行B的中断服务函数。

对吗?
回复 支持 反对

使用道具 举报

31

主题

1953

帖子

3

精华

论坛元老

Rank: 8Rank: 8

积分
4451
金钱
4451
注册时间
2018-5-11
在线时间
930 小时
 楼主| 发表于 2018-12-22 10:54:49 | 显示全部楼层
brucewoo 发表于 2018-12-22 00:03
谢谢科普。
是否就是这样理解:

理解正确。
我的开源链接 https://github.com/ShuifaHe/STM32.git  请关注,点赞支持哦。
回复 支持 反对

使用道具 举报

0

主题

3

帖子

0

精华

新手上路

积分
32
金钱
32
注册时间
2018-5-7
在线时间
7 小时
发表于 2018-12-24 20:32:16 | 显示全部楼层
warship 发表于 2018-12-21 22:28
复位后的情况,请认真看问题13的解答。

我的疑问就是复位后BIT为000后,对应的分组为默认分组方式,但是000对应的就是分组0的方式吗?求指教
回复 支持 反对

使用道具 举报

31

主题

1953

帖子

3

精华

论坛元老

Rank: 8Rank: 8

积分
4451
金钱
4451
注册时间
2018-5-11
在线时间
930 小时
 楼主| 发表于 2018-12-24 22:11:31 | 显示全部楼层
本帖最后由 warship 于 2018-12-24 22:13 编辑
SGDH666 发表于 2018-12-24 20:32
我的疑问就是复位后BIT为000后,对应的分组为默认分组方式,但是000对应的就是分组0的方式吗?求指教

实际上问题13已经讲得很清楚了,
复位后,000代表分组方法0,不是分组0,
参考问题七,方法0表示从BIT0处进行分组,即BIT0代表子优先级,BIT1-7代表抢占优先级
接着看问题七下面的详细描述,
我们现用的芯片实际只有4BIT优先级位,方法0-方法3都退化成了分组4
分组4:就是从BIT4开始表示子优先级,即0位子优先级,4位抢占优先级这个分组4就是芯片复位后的优先级分组定义, 4个BIT全部被解释成抢占优先级。
我的开源链接 https://github.com/ShuifaHe/STM32.git  请关注,点赞支持哦。
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-1-19 02:32

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表