开发工具:
文件大小: 242kb
下载次数: 0
上传时间: 2019-07-15
详细说明:STM32的中断优先级,非常实用的手册。可以收藏查阅STⅥ32的NVIC优先级
如果用分组(7)来分配这8个优先级的话则[7:5表示子优先级。
表11
用3位来表达优先级,
Bit7 Bit6 Bit5 Bit4 Bit3 Bit2 Bitl BitO
采用分组7的情况
子优先级
未使用
如果用分组(6)来分配这8个优先级的话则[7表示抢占优先级,[6:5表示子优先级。
表12
用3位来表达优先级,
Bit7 Bit6 Bit5 Bit4 Bit3 Bit2 Bitl BitO
采用分组6的情况
抢占优子优先级
未使用
先级
如果用分组(5)来分配这8个优先级的话则[7:6表示抢占优先级,而[5则表示了优先级
表13
用3位来衣达优先级,
Bi7 BiL6 Bits Bil4 Bit3 Bil2 Bitl Bilo
采用分组5的情况
抢占优先级子优
未使用
先级
如果用分组(40)来分配这8个优先级的话则[7:5都表示抢占优先级
表14:
用3位来表达优先级,
Bit7 Bit6 Bit5 Bit4 Bit3 Bit2 Bit1 Bito
采用分组4的情况
抢占优先级
未使用
到这里已经很清晰了,其实STM32用4位来表示优先级,则有16个优先级。如下:
在NVCH文件中有
e Preemption Priority Group
#define nvic Priority Group 0
((u32 )0x700)/0 bits for pre-emption priority
4 bits for subpriority *
#define nvic priority Group 1
((u32)0x600)/*1 bits for pre-emption priority
3 bits for subpriority o/
tdefine NVIC Priority Group 2
((u32)0x500)/2 bits for pre-emption priority
2 bits for subpriority */
#deline nvic Priority Group 3
((u32)0x400)/3 bits for pre-emption priority
I bits for subpriority *
#define n vic Priority Group 4
((u32 )0x300)/*4 bits for pre-emption priority
0 bits for subpriority
注意: NVIC.里这个定义的顺序是跟CM3里 PRIGROUP的顺序刚好相反的,就是说
define NvIc_ Priority Group_0—对应 PRIGROUP7
# define NviC Priority Group1—对应 PRIGROUP6
#define nvic priority Group 2
对应 PRIGROUP5
# define nvic Priority Group3—对应 PRIGROUP4
# define NvIC Priority Group4—对应 PRIGROUP3
STⅥ32的NVIC优先级
下面的分析将按照CM3实际的 PRIGROUP进行,而不是 NVIC.H里定义的
NVIC Priority Group x
分组(3)则16个优先级都表示抢占优先级
表15
分组寄存器中[10:8]的配置情况:优先缴寄存器的配置情况:
采用分组3的情况
采用分组3的情况
PRIGROUP BIT10 BIT9 BIT8 Bit7 Bit6 Bits Bit4 Bit3 Bit2 Bitl Bito
抢占优先级
未使用
分组(4)则16个优先级表现为8个抢占优先级,每个抢占优先级里包含2个子优先级
表16:
分组寄存器中[10:8]的配置情况
优先级寄存器的配置情况:
采用分组4的情况
采用分组4的情况
PRIGROUP BIT10 BIT9 BIT8 Bit7 Bito Bits Bit4 Bit3 Bit2 BitI bito
抢占优先级
子优先级
未使用
分组(5)则16个优先级表现为4个抢占优先级,每个抢占优先级里包含4个子优先级
表17:
分组寄存器[0:8的配置情况:优先级寄存器的配置情况:
采用分组5的情况
采用分组5的情况
PRIGROUP BITI0 BIT9 BIT8 Bit7 Bit6 Bits Bit4 Bit3 Bit2 Bitl bito
5
抢占优先级子优先级
未使用
分组(6)则16个优先级表现为2个抢占优先级,每个抢占优先级里包含8个子优先级
表18:
分组寄存器中0:8的配置情况:
优先级寄存器的配置情况:
采用分组6的情况
采用分组6的情况
PRIGROUPBIT10 BIT9 BIT8 Bit7 Bit6 Bits Bit4 Bit3 Bit2 Bitl Bito
6110抢优子优先级
未使用
分组(7)则16个优先级表小子优先级
表19:
分组寄存器中[10:8]的配置情况:
优先级寄存尜的配置情况:
采用分组7的情况
采用分组7的情况
PRIGROUP BIT10 BIT9 BIT8 Bit7 Bit6 Bit5
Bit4
Bit3 Bit2 Bitl BitO
子优先级
未使用
SIM32的64个中断,除了那3个CM3固定的异常外,每个中断都可以分配优先级,如果
有N个中断的优先级相冋则按中断号最低的那个最先等到响应。
为了判断你使用的芯片到底使用了多少位来表达优先级,可以使用下面的方法:往某个优先
级寄存器里写入0XFF,再读回来。则从MSB开始,有多少位是1就有多少位表达优先级,
最少要使用3个位
STⅥ32的NVIC优先级
第二篇优先级的实现方法
以下红色字体为 NVIC INIT这个函数的内容以及一位网友对这些内容的解释。在此对这位网友表示感谢!
NVIC INIT
tmppriority=(0x700-(SCB-AiRC &(u32)0x700))>>0x08;
∥算出来得到的就是抢占优先级的位数占四位中的几位
tmppre=(0x4-tmppriority)
∥算出来得到的就是了优先级的位数占四位中的几位
例如:结合上面对STM32的分组我们可以得到
分组(3)0x300: Lmpprionity=(0x700-0×300)>>0x08-0x4;/抢占优先级的位数
占满四位
tmppre-0x4-0x4-0
∥优先级占零位
分组(4)0X400: tmppriority=(0x700-0x400)>0x08-0x3:/抢占优先级的位数
占3位
tmppre=0x4-0x3=1;
∥优先级占1位
分组(5)0x500: tmppriority=(0x700-0x500)>0x08-0x2;抢占优先级的位数
/占2位
tmppre-0x4-0x2-2,
∥优先级占2位
其他几种分组情况也相同就不一一列出了。
先级的 psub > tmppriority;然后将四位掩码通过抢占优先级位数得到子优
tmpsub = ti
例如:采用分组5则得到抢占优先级为2,子优先级为2。 Tmpsub为4位掩码初
始值为0xF:
表20.pub-0xf>0x2-0x3;/子优先级的掩码为3。
分组 GROUP抢占优先级
子优先级
子优先级掩码(二进制)
tmppriority
tmppre
tmpsub= tmpsub
tmppriority;
4
0
0000
4
0001
0011
0111
0
子优先级掩码有什么用?
继续看下面的程序就知道了
tmppriority=(u32)NVIC InitStruct->NVIC IRQChannelPreemption Priority NVIC IRQChannelSubPriority tmpsub
∥,与上子优先级掩码得到单纯的子优先级
∥然后或上子优先级得到了该中断通道8位的优先级数
例如:在上面例子采用分组5的前提下,我们选择
了优先级 NVIC IRQChannelSubPriority-1
结果: tmppriority-0x4(1&0x3)-0x5
先与上子优先级掩码得到单纯的子优先级:
表22
子优先子优先Bi7B6Bit5Bit4Bit3 Bit2 BitlBitO
级
级
掩码
0011
0
0011
01
001l
然后或上子优先级得到了该中断通道8位的优先级数:
表23
抢占子优先「Bit7Bit6Bi5Bit4Bit3Bit2 BitlBit0
优先级级
00
0
01
01
10
10
0011
以上就是掩码的作用了,接下来:
tmppriority= tmppriority<<0x04;∥首先将这个优先级数左移四位放置到相应通
道优先级寄存器8位的高四位(优先级8位从左边算起的)
例如: tmppriority-0x5<<0x40x50
tmppriority -((u32)tmppriority) <<((NVIC InitStruct->NVIC IRQChannel
(u8)0x03)*0x08)
/为一个32位中包含4个8位,而这些32位的优先级寄存器又排列在一块连
STⅥ32的NVIC优先级
续的空间中组成优先级寄存器阵列,这样的话,需要有一个对准的问题,比如我
现在是第六个通道,我就需要将其放置到第二个32位中的第二个八位(从左边
数),具体算法是:
首先将该通道在32位中的第几个八位算出来,所以同0x03相与,
∥然后再乘以8得到的便是该通道在32位中的第几位,
有0°8=0,1*8=8,2*8=16,3*8=24,这四种情况
)将该优先级左移这么多位就得到它在32位寄存器中的位置了。
∥总之该语句将该通道优先级寄存在其32位当中从第几位开始的8位找出来
∥放在 tmppriority相应的地方中
例如通道6: tmppriority=0x50(0x6&0x3)*0x8)=0x50000
表24:优先级寄存器阵列
Bit[31.24
Bit23.16]|Bt8
Bit[7.0]
0xE000E400
CHANNEL3 CHANNEL2 CHANNELI CHANNEL0第0个32位
Bit11.24]Bi[23.16
Bit[ 15.8
Bit[7.0]
0xE000E4004
CHANNEL7 CHANNEL6 CHANNEL5 CHANNEL4第1个32位
Bt31.24B23.16
Bit[15.8
BitL7.o]
0xE000E4008
CHANNEL1 CHANNEL10 CHANNEL9 CHANNEL8第2个32位
tmpreg-NVIC->Priority(NVIC InitStruct->NVIC IRQChannel>>0x02)
接下来将通道数除以四(这里通道移位来运算除法的),得到的其实就是该通道
∥在第几个32位优先级寄存器上,把这个32位寄存结果读出来放在 tmpreg中。
例如通道6: tmpreg=NVC→> Priority[];/第1个32位优先级寄存器
tmpmask-(u32)0xFF<<(NVIC InitStruct->NVIC IRQChannel&(u8 )0x03)*0x08)
∥该语句将该通道优先级寄存器在32位当中的第几位开始的八位加上了掩码,以
后面方便写入到该通道优先级寄存器的八位上
例如 tmpmask=0xf<(0x6&0x03)*0x08)=0xm000
表25:
0xE000E4004Bit[3124]
Bit[23.16
Bit[15.8
Bit[7.0]
通道
CHANNEL7 CHANNEL6 CHANNEL5 CHANNEL4
掩码
0000
FF
00
00
tmpreg &=-tmpmask;
∥将该通道在32位的优宄级寄存器组上的8位清零,其他位也就是其它通道的
∥优先级寄存器保证同1相与,不会改变
例如 tmpreg&=0x0omf
//tmppriority &= tmpmask
∥只保留该通道的优先级寄存器在32位上的八位,其他的通道的优先级寄存
∥器全部用0屏蔽
例如 tmppriority=0x60000&of0000×50000
tmpreg= tmppriority;
∥终于现在, mprog中该通道优先级寄存器的8位全部为0,其他通道优先级寄
器的8位(还有三组)全部为原来本身的数而没有改变
/ tmppriority屮该通道优先级寄存器的8位数据完好,其他通道优先级寄存器的
∥8位(还有三组)全部为0
两者相"或",该32位 tmpreg便是已经包含了本次用户输入的通道中断优先
∥级寄存器的8位信息
STⅥ32的NVIC优先级
例如 tmpreg=0x500000006
NVIC->Priority[(NVIC InitStruct->NVIC IRQChannel >>0x02)]=tmpreg
输入到包含该通道中断了优先级寄存器的32位寄存器中,可以看出,本质上也
是一个读-修改-写的过程
(系统自动生成,下载前可以参看下载内容)
下载文件列表
相关说明
- 本站资源为会员上传分享交流与学习,如有侵犯您的权益,请联系我们删除.
- 本站是交换下载平台,提供交流渠道,下载内容来自于网络,除下载问题外,其它问题请自行百度。
- 本站已设置防盗链,请勿用迅雷、QQ旋风等多线程下载软件下载资源,下载后用WinRAR最新版进行解压.
- 如果您发现内容无法下载,请稍后再次尝试;或者到消费记录里找到下载记录反馈给我们.
- 下载后发现下载的内容跟说明不相乎,请到消费记录里找到下载记录反馈给我们,经确认后退回积分.
- 如下载前有疑问,可以通过点击"提供者"的名字,查看对方的联系方式,联系对方咨询.