打印

我的学习心得--关于STM3的NVIC

[复制链接]
9635|33
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
60岁老头|  楼主 | 2008-3-18 19:35 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
    我的学习心得--关于STM3的NVIC

1.异常可分为系统异常和外部中断,异常优先级也即分为系统异常优先级和外部中断优先级。
2.中断矢量的顺序决定了异常的硬件优先级。若不进行软件设置异常的优先级(软件优先级),
异常优先级就决定于硬件优先级。
3.异常一旦指定软件优先级后,硬件优先级则无效。(按:错,1.应是软优于硬,2.局部还是全体?)
4.不管硬软,复位,NMI,和硬故障这3个异常的优先级始终依次最高。
5.用户可设置的最高优先级为0 号优先级,其仅次于复位,NMI 以及硬件故障的第4 优先级。
  0号优先级也是所有可调整优先级的默认优先级。(按:是否意味都要设置?)
6.系统异常的优先级可通过系统处理器优先级寄存器组进行控制(写入)。
该寄存器组是:NVIC_SYS_PRI1-3 0xE000ED18-23 共12个字节。
顺序地对应从4开始的12个系统异常中断号NVIC_SYS_PRI4-12:
存储器管理,总线故障,使用故障,保留, 保留,保留,保留,SVCall, 调试监控,保留,PendSV,SysTick。
   其中,只有PendSV,SysTick可以通过软件来触发(设置挂起pendSV位),方法是:将中断控制状态寄存器0xE000ED04的[28]PENDSVSET,[26] PENDSTSET置1。
7. 外部中断指的是除系统异常之外的异常,也即中断号等于和大于16 的异常。外部中断的0 号中断对应于NVIC 的16 号中断,依次类推.
   外部中断的优先级可通过外部中断优先级寄存器组(又称"中断优先级寄存器")进行控制(写入)。
该寄存器组是:0xE000E400-41F 共32个字节。顺序地对应32个中断号:
中断0的优先级(PRI_0),就放在0xE000E400;中断31的优先级(PRI_31),就放在 0xE000E41F。
8. CortexM3规定的优先级是256级,但具体的采用CortexM3内核的IC可以是8级
(例Stellaris的LM3S系列)或16级(例ST的STM32系列),也可以更大。
 所以,对于这2个IC,写入系统处理器优先级寄存器和中断优先级寄存器组的值(PRI_N,8Bit)分别只有高3Bit和高4Bit才是有效的,其余5Bit和4Bit没有意义。
9. 优先级分组 (姜按:“CortexM3 参考手册中的这段话,还是摘录在下面,尽管我认为这个机制对于STM32这个IC,几乎没有意义。)
为了对具有大量中断的系统加强优先级控制,NVIC 支持优先级分组机制。应用中断和复位控制寄存器中的PRIGROUP 区(3Bit)来将每个PRI_N 中的值分为占先优先级区和次优先级区。我们将占先优先级称为组优先级。如果有多个挂起异常共用相同的组优先级,则需使用次优先级区来决定同组中的异常的优先级,这就是同组内的次优先级。组优先级和次优先级的结合就是通常所说的优先级。如果两个挂起异常具有相同的优先级,则挂起异常的编号越低优先级越高。这与优先级机制是一致的。
10. 应用:在程序中改变优先级的最快办法是“字节写”。

沙发
香水城| | 2008-3-18 20:43 | 只看该作者

楼主辛苦,总结的不错

赞!

不过,标题中的STM32写错了。

使用特权

评论回复
板凳
dy008| | 2008-3-20 14:59 | 只看该作者

一点理解!

LZ的心得:
3:是对全部的中断级别有效,因为复位后,所有的中断源的两个优先级区内的级别=0,所以才用在中断向量表里的位置来区分优先级,其实任何时候都是按照"抢占优先级区">"优先级区">"中断向量表位置"的先后顺序来区分等级高低的。
5:如果不用调整优先级,只是使用默认优先级可以不用设置!
8:级数根据分组的策略不同而不同,对于STM32F10x最小可以=0,最大=16!
9:个人认为分组有意义请看我的帖子:https://bbs.21ic.com/club/bbs/bbsView.asp?boardid=49
也就是是否用中断嵌套的问题!

使用特权

评论回复
地板
60岁老头|  楼主 | 2008-3-20 18:37 | 只看该作者

帮你贴出原贴

dy008 发表于 2008-3-20 14:44 

楼主: 对Cortex-M3的中断分组的理解

看了一段时间的资料和调试,自己对于分组的理解:
1:NVIC中有个非常重要的优先级组概念:"抢占式优先级”组(简称M组)和“子优先级”组(简称S组):
在STM32F10X中根据分组的策略不同,可以有不同数量的"抢占式优先级”和“子优先级”级别(0~16个),而芯片内的每一个中断源在两个组中各占一个等级,不同中断源可以用相同的级别,等级比较的顺序为:M组--S组--向量表中的位置,如果两个中断源在M组和S组分配的等级一样,这时它们之间的中断等级高低就用它们在中断向量表中的位置作为判断依据!

情况A:只有一个中断事件发生并且在这个中断服务(ISR)执行的过程中没有其他中断发生,那么你可以忘记中断级别与分组的问题,
情况B:当两个或以上的中断同时发生时,NVIC就根据中断源在两个组里的等级进行区分谁先执行服务,比较的顺序:M组--S组--向量表中的位置!根据以上顺序依次执行各自的ISR;
情况C:当某一个中断的ISR正在执行的过程中又发生了另外一个中断事件,如果新发生中断在M组的级别高于当前中断在M组的级别,将立即发生中断切换至新的中断源的ISR,这就是"抢占式优先级”的意义,直到新中断源的ISR执行完成才能返回原中断ISR。而要是两个中断源在M组级别相同,再对S组中的级别进行比较,但不进行切换,只会发生末尾连锁,必须等原中断执行完毕才能执行新的中断ISR。
综上所述,可以知道Cortex-M3的中断控制还是非常灵活的,一些不重要的中断服务可以配置为在M组中的等级最低,在S组里灵活安排,而重要的中断可以在M组中分配较高等级(数值较小)。

使用特权

评论回复
5
clslhy| | 2008-3-29 07:38 | 只看该作者

借鉴一下哦

使用特权

评论回复
6
syrobots| | 2010-8-7 11:14 | 只看该作者
受益匪浅啊!

使用特权

评论回复
7
无冕之王| | 2010-8-8 08:56 | 只看该作者
多么深刻的心得,难得啊

使用特权

评论回复
8
火箭球迷| | 2010-8-8 09:35 | 只看该作者
不错的心得,很有启发

使用特权

评论回复
9
yybj| | 2010-8-8 14:43 | 只看该作者
写的不错,楼主辛苦了

使用特权

评论回复
10
vipcff| | 2010-8-14 16:32 | 只看该作者
楼主辛苦

使用特权

评论回复
11
火箭球迷| | 2010-8-15 16:11 | 只看该作者
楼主真的60岁了吗,心得写得太好了

使用特权

评论回复
12
baidudz| | 2010-8-15 16:26 | 只看该作者
心得写得很详细,值得学习

使用特权

评论回复
13
无冕之王| | 2010-8-16 10:07 | 只看该作者
楼主可以考虑再多些一些,这样的心得很难得

使用特权

评论回复
14
mxh0506| | 2010-8-16 10:13 | 只看该作者
交流有利于提高,好!

使用特权

评论回复
15
秋天落叶| | 2010-8-16 10:23 | 只看该作者
交流使人进步

使用特权

评论回复
16
PXJ_520| | 2010-9-12 20:10 | 只看该作者
mark

使用特权

评论回复
17
lixiaoxu2meng| | 2010-9-13 09:17 | 只看该作者
mark

使用特权

评论回复
18
lianaiyy| | 2012-4-20 16:53 | 只看该作者
mark

使用特权

评论回复
19
dfsa| | 2012-4-20 19:17 | 只看该作者
不错的学习心得,写的很好

使用特权

评论回复
20
pkat| | 2012-4-20 19:30 | 只看该作者
总结的的确是很不错

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

23

主题

158

帖子

0

粉丝