打印
[应用相关]

STM32之中断与嵌套NVIC

[复制链接]
1046|5
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
energy1|  楼主 | 2015-3-25 19:53 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
我也是靠看这本书才弄懂的: .8j s
Cortex-M3
权威指南 Xr$.0F\5&S
Joseph Yiu
g@C~n+h
宋岩 S4pi)_W
其实很简单。 I&;8? c^j
//CM3
最多240个中断(通常外部中断写作IRQs),就是 软件上说的 IRQ CHANAELx(中断通道号x)#lH(*{+  
每个中断有自己的可编程的中断优先级【 有唯一对应的 中断优先级寄存器 . (G‑x%#wS  
由于CM3支持 硬件中断嵌套,所以可以有 256 级的可编程优先级 n[ }wjC f
256级中断嵌套【 书上称:抢占(preempt 优先级】 gud 1J"l
所以大家可以设: ­9rv>sz  
IRQ CHANAEL 0
通道 = 2    中断优先级 WWDG 窗口定时器中断 ` bF
"n

IRQ CHANAEL 1
通道 = 0    中断优先级 PVD 联到EXTI的电源电压检测(PVD)中断 }eEhLcs
IRQ CHANAEL 3
通道 = 255  中断优先级 RTC 实时时钟(RTC)全局中断 ldv-"#Y3x
IRQ CHANAEL 6
通道 = 10   中断优先级 EXTI0 EXTI线0中断 }0u;{$
..... 3>­ w,g2  
IRQ CHANAEL 239
通道 =  (0<x<255)   中断优先级 ..bOPa5jxP  
H Am@­(  
这个实在是太恐怖了! 是的,其实CM3 并没有这样做。 "'v0c2t
实在的芯片例如STM32等就只有设计来可用才64级可编程优先级和8级中断嵌套。 [b [,;P4H
64级中断就是说:( INT0 INT63)这个大家比较好理解,其它的64···239就不用了。 oD~r
‑:

IRQ CHANAEL 0 j[{E
B]  
。。。 ‑&lG
'

IRQ CHANAEL  63 fZh ]%|k  


沙发
energy1|  楼主 | 2015-3-25 19:54 | 只看该作者
8级中断嵌套这又是何解呢?
?34L* ­

是这样的,上面说 一个 【中断】对应 一个【中断优先级寄存器】,而这个寄存器是 8 位的。 Mc)h=aj`
当然就是256级了。而现在就用了 它其中的 BIT7,IT6,BIT5 三位来表示,而且是MSB对齐的。 (cWeW
quU

用了3 个位来表达优先级(MSB 对齐的我们能够使用的8 个优先级为:0x00(最高),0x200x400x600x800xA00xC0 以及0xE0) ^I}/­2A0o
这样我们在【中断优先级寄存器】就不能按理论的填 0255之间的数了, Dh,iP*mO
而只能填0x00(最高),0x200x400x600x800xA00xC0 以及0xE0) AXt^o;b<$
所以大家可以设: SLVo]:44  
IRQ CHANAEL 0
通道 = 0x20  中断优先级 WWDG 窗口定时器中断 Z~/W\T$r
IRQ CHANAEL 1
通道 = 0x40  中断优先级 PVD 联到EXTI的电源电压检测(PVD)中断 P"w$zn\Nu
IRQ CHANAEL 3
通道 = 0x20  中断优先级 RTC 实时时钟(RTC)全局中断 L#9Au@_
IRQ CHANAEL 6
通道 = 0xA0  中断优先级 EXTI0 EXTI线0中断 5''AZF
..... ‑;/5R\JDC  
IRQ CHANAEL 63
通道 =  0x00(最高),0x200x400x600x800xA00xC0 以及0xE0) }U
Y+J
5)>

使用特权

评论回复
板凳
energy1|  楼主 | 2015-3-25 19:55 | 只看该作者
大家注意到了,上面通道0和通道3 的优先级都是0X20, 这怎么办? D1+y%Ty
//
如果优先级完全相同的多个异常同时悬起,则先响应异常编号最小的那一个。如IRQ #0会比IRQ #3 先得到响应 4­AC:_+%c
而且文中还讲了 【优先级分组】,这又是什么回事? fv$&53c  
其实我回头看来,这个【优先级分组】和【抢占优先级】【亚优先级】都毫无意义的。 Z7 Rf@a  
如果当时用 256级即是 把【中断优先级寄存器】的8位都全用上,就没这个必要了。还什么优先级分组呢! .Y$7>NA
就是因为厂家现在【偷工减料】,才搞出这个明堂来的。 z0mMB ddaA
是这样的,在应用程序中断及复位控制寄存器(AIRCR) 中的 108 位【3位】是表示【优先级分组】 lJ!P­gM1?l
它作用主要是用于对【中断优先级寄存器】『我们现在中用了BIT7,BIT6,BIT5三位』的功能的说明。 UqL/=
?s,

有一个表,在《Cortex-M3 权威指南》的110页, 例如我们把AIRCR108 位设为【5 sZgV9{uk
查表可得【抢占优先级】=【76】,【亚优先级】=【50】,
\nzwz&gP

对于【中断优先级寄存器】只用了BIT7,6,5, 因此我们可以看作是 76】,【5】。那40 可以不管。 yXgwx>
现在我们的 IRQ0=0X20, IRQ3=0X20, 也就是  0 0 1 0  】『 bit7=0,bit6=0,bit5=1,bit4=0 p
x c\{!|

因为大家(IRQ0/IRQ3) 【抢占优先级】=【76】都是0 说明它们的中断相应级别是一样的。 ma­<[/T
再继续判断它们哪个更优先的责任就要看【5】,结果连【5】都是一样的! -uoy*fQ
那就按默认: !1`2SZ+p
//
如果优先级完全相同的多个异常同时悬起,则先响应异常编号最小的那一个。如IRQ #0会比IRQ #3 先得到响应 k 7n20 `
由于CM3没有 进中断【关全局中断相应】这事,只要是中断通道打开了,就会存在 通道间的 嵌套,即是会发生 8^^A9y[O
【抢占】的情况了。

使用特权

评论回复
地板
energy1|  楼主 | 2015-3-25 19:55 | 只看该作者
上面就简短的说明,如果要详细理解,可以看《Cortex-M3 权威指南》。 \Pp
}9_a

有任何理解不当,请各位多多指教! '%0w>7P8c
补充注意: <y^hb‑0P
“2
)抢占式优先级别相同的中断源之间没有嵌套关系;” `RZ}G&C
所以大家可以设:PY@U&F_MU  
IRQ CHANAEL 0
通道 = 0x20  中断优先级    WWDG 窗口定时器中断 |nzO)c
:f

IRQ CHANAEL 1
通道 = 0x40  中断优先级    PVD 联到EXTI的电源电压检测(PVD)中断
;h .*4

IRQ CHANAEL 3
通道 = 0x20  中断优先级    RTC 实时时钟(RTC)全局中断 p|u-F #
IRQ CHANAEL 6
通道 = 0xA0  中断优先级    EXTI0 EXTI线0中断 ci_cJ4YV^‑
这样 0 通道和3 通道就不会有嵌套情况,而是0 通道按默认比3 通道优先高些。 {P\Z uXeX9
0 通道与1 通道就会有嵌套情况。 Q%\'`"`  
  /_=x19or4  
芯片复位后,默认的优先级分组 0 就是 71】表示抢占式优先级,【0】表示亚优先级, c­FQ|GOf
这样对于MSB对齐的 8 个优先级为:0x00(最高),0x200x400x600x800xA00xC0 以及0xE0) \}^x

$q3  
使用就很方便了,建议大家就用默认的默认的优先级分组 0,也就是复位后的值,哈哈! K
"Tn!eR

E^*
4­ej  


使用特权

评论回复
5
energy1|  楼主 | 2015-3-25 19:56 | 只看该作者
例如下面的两个按键,都使用外中断方式, 使用了PD.3,PD.4两个引脚。这两个中断的优先级都是0X20 c\gU!?Y6
按默认的优先级分组,它们之间不会发生中断嵌套。 _.'FIM(u~
     /* Enable the EXTI3 Interrupt on PD.3 */ 6,!-!OwE  
STM32_Nvic_Regs->Priority[9].all=0x20;   //
中断的优先级是 0X20^[dak <  
STM32_Nvic_Regs->Enable[0].bit.INT9=1;  //
INT9 中断   IRQ9 YDFXzb3dZ}  
     /* Enable the EXTI4 Interrupt on PD.4 */ `>p!r%!{  
STM32_Nvic_Regs->Priority[10].all=0x20;  //
中断的优先级是 0X20 cdca.#kH
STM32_Nvic_Regs->Enable[0].bit.INT10=1; //
INT10 中断  IRQ10

使用特权

评论回复
6
搞IT的| | 2015-3-26 13:06 | 只看该作者
相当不错。好好学习了。

使用特权

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

本版积分规则

94

主题

422

帖子

10

粉丝