OpenEdv-开源电子网

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

STM32学习笔记(一)——之NVIC中断优先级分组的浅理解

[复制链接]

3

主题

14

帖子

1

精华

初级会员

Rank: 2

积分
197
金钱
197
注册时间
2012-1-26
在线时间
0 小时
发表于 2012-1-27 12:45:33 | 显示全部楼层 |阅读模式
        第一次发帖,写得不好还请大家指正!

       最近在看正点原子写的《STM32不完全手册》,sys.h有一个关于NVIC的分组函数My_NVIC_PriorityGroupConfig,该函数的参数NVIC_Group为要设置的分组号,可选范围为0~4,总共5组。My_NVIC_PriorityGroupConfig函数代码如下:

// 设置NVIC分组 
//NVIC_Group:NVIC 分组 0~4  总共 5 组   
void MY_NVIC_PriorityGroupConfig(u8 NVIC_Group)     
{  
    u32 temp,temp1;    
    temp1=(~NVIC_Group)&0x07;//取后三位 
    temp1<<=8; 
    temp=SCB->AIRCR;  //读取先前的设置 
    temp&=0X0000F8FF; //清空先前分组 
    temp|=0X05FA0000; //写入钥匙 
    temp|=temp1;     
    SCB->AIRCR=temp;  //设置分组                      
}

        搞了一天,其实就是在研究一句话 temp1=(~NVIC_Group)&0x07;//取后三位 为什么NVIC_Group要取反?和CM3分组不是反了吗?仔细查看《CM3权威指南》和对比《STM32不完全手册》可以发现,STM32是把CM3内核中第7分组定义为STM32的第0分组!原子哥撇开STM的库函数自己写,其实写的就是内核驱动,所以现在我们要控制的不是STM32,而是CM3,为了和STM32文档对应,那么我们应该对NVIC_Group取反!比如说我现在要用到STM32中的第1分组,其实是CM3中的第6分组,那我应该是把0x600写进CM3!
        接下来是为什么STM32要对CM3的分组取反,即Crystal_oscillator说的MSB对齐。给出了一个解释:通过让优先级以MSB 对齐,可以简化程序的跨器件移植。比如,如果一个程序早先在 支持4 位优先级的器件上运行,在移植到只支持3 位优先级的器件后,其功能不受影响。但 若是对齐到LSB,则会使MSB 丢失,导致数值大于7 的低优先级一下子升高了,甚至会反转小于等于7 的高优先级。如,8 号优先级因为损失了MSB,现在反而变成0号了!
我觉得这是一个原因,然后我又再查看了一下CM3,这时我们不烦假设自己是STM32的设计者,此时定义4位的优先级。

第一种方案,和STM32给的定义一样(对CM3的分组取反,并取寄存器高4位),得到以下结果:

 

第二种方案,按照CM3的分组顺序,并取寄存器低4位(为什么不取高四位,自己写一下就明白了),得到以下结果:

 

 

CM3有个特别的规定,即8位寄存器中至少得有一位子优先级(响应优先级),所以造成两种分配方法的不同结果。如果按照第二种,那么STM32只存在4个分组。为什么选择第一种方案呢?个人觉得有以下原因:
1、存在0子优先级的分组。CM3规定,高级的抢占优先级可以打断低级的抢占优先级中断,而高级的子优先级并不具备打断低级子优先级的特权,所以4位子优先级的分组和4位抢占优先级的分组还是稍有不同的。这样提高了STM32的普适性,在某些情况下,可能需要用到4位抢占优先级!
2、如Crystal_oscillator所说的移植性问题。


      对于这个问题,暂时先想到这里吧,继续下一个~时间不够啊~回来前还被老师批说STM32你们学的是库函数,没了库函数什么都干不了。原来原子哥前面教的是CM3内核的东西,难怪觉得有点晦涩。加油加油!
 
参考资料:     《CM3权威指南》
                     《STM32不完全手册》--正点原子@scut
                     《关于NVIC更深入的一点理解》--Crystal_oscillator
                     http://bbs.ednchina.com/BLOG_ARTICLE_2092646.HTM
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

38

主题

2061

帖子

6

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
3273
金钱
3273
注册时间
2012-1-16
在线时间
37 小时
发表于 2012-1-27 21:53:53 | 显示全部楼层
你QQ多少,可以加你吗?
站在巨人的肩膀上不断的前进。。。
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165524
金钱
165524
注册时间
2010-12-1
在线时间
2116 小时
发表于 2012-1-28 00:45:49 | 显示全部楼层
图片是从qq空间搞过来的,无法显示!
直接上传吧。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

18

主题

158

帖子

1

精华

中级会员

Rank: 3Rank: 3

积分
400
金钱
400
注册时间
2011-11-23
在线时间
0 小时
发表于 2012-8-7 09:04:41 | 显示全部楼层
mark
回复 支持 反对

使用道具 举报

9

主题

45

帖子

0

精华

初级会员

Rank: 2

积分
101
金钱
101
注册时间
2013-2-5
在线时间
0 小时
发表于 2013-2-19 18:55:20 | 显示全部楼层
我也是在这个地方遇到了问题,谢谢楼主的分享。。。
回复 支持 反对

使用道具 举报

9

主题

51

帖子

0

精华

初级会员

Rank: 2

积分
108
金钱
108
注册时间
2013-3-16
在线时间
0 小时
发表于 2013-7-29 10:08:35 | 显示全部楼层
mark
回复 支持 反对

使用道具 举报

1

主题

15

帖子

0

精华

初级会员

Rank: 2

积分
86
金钱
86
注册时间
2014-1-8
在线时间
11 小时
发表于 2014-1-29 12:36:48 | 显示全部楼层
学习了。。。。。。。。。。。。。
回复 支持 反对

使用道具 举报

1

主题

8

帖子

0

精华

初级会员

Rank: 2

积分
85
金钱
85
注册时间
2013-11-27
在线时间
11 小时
发表于 2014-2-18 11:37:57 | 显示全部楼层
马克
回复 支持 反对

使用道具 举报

6

主题

25

帖子

0

精华

初级会员

Rank: 2

积分
69
金钱
69
注册时间
2014-3-2
在线时间
0 小时
发表于 2014-3-10 15:54:34 | 显示全部楼层
赞一个。。
可是还是不太懂分组是啥意思??等级太低了
如今我是问题的索取者,但是我坚信未来我将是问题的解答者,努力,,,
回复 支持 反对

使用道具 举报

3

主题

11

帖子

0

精华

初级会员

Rank: 2

积分
72
金钱
72
注册时间
2014-4-17
在线时间
3 小时
发表于 2014-4-17 21:20:33 | 显示全部楼层
顶!!!!!!!学习了
回复 支持 反对

使用道具 举报

8

主题

78

帖子

0

精华

初级会员

Rank: 2

积分
193
金钱
193
注册时间
2013-12-27
在线时间
15 小时
发表于 2014-4-17 23:24:34 | 显示全部楼层
不知道大家有没有遇到过中断嵌套,而出现硬件错误。
回复 支持 反对

使用道具 举报

1

主题

4

帖子

0

精华

新手入门

积分
28
金钱
28
注册时间
2014-11-19
在线时间
0 小时
发表于 2014-11-19 21:29:13 | 显示全部楼层
吐槽LZ说话的语气,一副自以为是的样子,以为自己智商超高,呵呵。
对于这个问题,我只想说LZ把一个简单的问题弄得这么复杂,还一副参透奥妙的意思。
学习建议直接看英文版手册,就不会出现Lz的问题,英文版手册写的很明白,分组颠倒与否没有改变寄存器的定义。
MSB对齐中的MSB用语不当,LZ的MSB对齐是说将一个字节bit【7:0】中的高位作为有效位,低位忽略掉,这不是
通常意义下的MSB(指字节),MSB术语一般用在大小端格式中。
为什么采用高位作为有效位,M3权威指南(宋岩 译)中有原话,LZ帖中所说也是完全摘抄的原文。
回复 支持 反对

使用道具 举报

1

主题

4

帖子

0

精华

新手入门

积分
28
金钱
28
注册时间
2014-11-19
在线时间
0 小时
发表于 2014-11-19 21:38:50 | 显示全部楼层
ST将分组颠倒没有改变寄存器中对分组的定义,转换了形式,便于记忆,
分组0~5分别对应0~5个抢占优先级。便于记忆,例如:分组n代表有n个抢占优先级,有4-n个响应优先级。
由于抢占优先级高于响应优先级,按抢占优先级从小到大的顺序便于记忆。
回复 支持 反对

使用道具 举报

2

主题

11

帖子

0

精华

初级会员

Rank: 2

积分
60
金钱
60
注册时间
2012-5-3
在线时间
4 小时
发表于 2014-12-9 21:31:58 | 显示全部楼层
这是stm32   3.5固件库里面外部中断的例程,目的是 set EXTI0 Interrupt to the lowest priority ,为什么没有调用
NVIC_PriorityGroupConfig ( uint32_t NVIC_PriorityGroup )
进行中断优先级分组呢,而且
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority= 0x0F;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x0F;
这两个参数都是0x0f,似乎有点不妥
中断优先级.png
回复 支持 反对

使用道具 举报

18

主题

60

帖子

0

精华

初级会员

Rank: 2

积分
152
金钱
152
注册时间
2015-4-11
在线时间
0 小时
发表于 2015-4-12 08:28:27 | 显示全部楼层
外部中断的配置还是没看懂~~好复杂啊
while{努力};
回复 支持 反对

使用道具 举报

18

主题

60

帖子

0

精华

初级会员

Rank: 2

积分
152
金钱
152
注册时间
2015-4-11
在线时间
0 小时
发表于 2015-4-12 15:34:10 | 显示全部楼层
回复【3楼】正点原子:
---------------------------------原子哥--为啥我发了个求助贴--怎么没审核过来呀? 买了块战舰板子- 刚学到中断,例子代码好多没看懂,....但是发了一帖,不见了--------------------------现在都还在看----
while{努力};
回复 支持 反对

使用道具 举报

18

主题

60

帖子

0

精华

初级会员

Rank: 2

积分
152
金钱
152
注册时间
2015-4-11
在线时间
0 小时
发表于 2015-4-12 15:42:11 | 显示全部楼层
楼主 --你这个优先级 的表是哪里来的呢?我怎么没有看到那里有>??
while{努力};
回复 支持 反对

使用道具 举报

18

主题

60

帖子

0

精华

初级会员

Rank: 2

积分
152
金钱
152
注册时间
2015-4-11
在线时间
0 小时
发表于 2015-4-13 08:36:43 | 显示全部楼层
楼主~~~给说说下,你的那些优先级分组在哪个手册看到的?我找了好久都没看到
while{努力};
回复 支持 反对

使用道具 举报

0

主题

3

帖子

0

精华

新手入门

积分
23
金钱
23
注册时间
2014-12-26
在线时间
0 小时
发表于 2015-5-15 19:38:21 | 显示全部楼层
这个倒不难理解
回复 支持 反对

使用道具 举报

20

主题

39

帖子

0

精华

初级会员

Rank: 2

积分
126
金钱
126
注册时间
2016-10-26
在线时间
32 小时
发表于 2016-12-3 14:07:55 | 显示全部楼层
Mark...
回复 支持 反对

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-5-25 19:04

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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