你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

原创--哥带你学STM32之中断入门理解——中断优先级NVIC理解

[复制链接]
alan_bach 发布时间:2014-4-1 15:58
STM32编程入门之 编译器KEIL MDK的数据类型及两个重要关键词: Z+ X, i' H( ~5 x
6 {1 u( ?+ e) S: U
NVIC优先级+软件中断(SWIER)+软件仿真+硬件仿真(JTAG)+中断延迟
. R" J/ p# T, F0 a
2 H" [8 I9 Y$ Z; x- z5 M$ U$ ^! r8 {
这篇文章本人写一2011年,当时为了理解STM32的中断就做了个学习笔记,现在为了支持沐紫@沐紫8 q7 x; X- G  _+ \( l( [3 N
哥豁出去了。把挖箱底都掏出来了啊,哥准备连发三篇,哈哈2篇已完成了。! j/ ^1 R: V3 Q1 V* s4 }3 Y9 g- r

0 S) g+ U5 o" I9 G: B
首先来说说两个概念,

7 ]1 H( h9 z. l
1、NVIC的优先级概念 ( j9 H  F3 R) g2 j
抢占式优先级 (pre-emption priority): 7 B. E5 |, L% l; y+ B
高占先式优先级的中断事件会打断当前的主程序/中断程序运行— —抢断式优先响应,俗称中断嵌套。
2 Z. _: \! N8 P" Y8 M7 v" C3 ?& v% B0 t2 r! s" [5 Q& g: @
" }0 D, m; I9 m2 c) Y' g, E; {
2、副优先级(subpriority):
$ ^- J& _# }7 I) k  A+ K在占先式优先级相同的情况下,高副优先级的中断优先被响应; 5 h; w2 Q% n& f
在占先式优先级相同的情况下,如果有低副优先级中断正在执行, 高副优先级的中断要等待已被响应的低副优先级中断执行结束后才 能得到响应——非抢断式响应(不能嵌套)。

% X) ?% w! Y9 T: r) L) Y$ O
总结:I: 关于抢占优先级,它总是与中断被嵌套相关连.比如说在A中断中嵌套了B中断.B能打断A中断,B中断就一定属于抢占优先级了.
2 C! A6 M8 F) k
II: 关于副优先级,个人认为它与中断嵌套无关,它不能被嵌套.
& [0 P, @  e  O- G
2、判断中断是否会被响应的依据
2 o6 J: w+ U: d5 _0 B首先是占先式优先级,其次是副优先级; . `$ \+ }! X9 ~# B
占先式优先级决定是否会有中断嵌套; 6 E5 L  ]) j9 F7 e+ n0 X9 |  c
Reset、NMI、Hard Fault 优先级为负(高于普通中断优先级)且不可调整。

: c8 T1 W" M6 o/ {2 A5 f' c
接着简单了解一下中断优先级(NVIC.)
# t, ?1 q- V" B9 y% r
STM32嵌套向量中断控制器(NVIC)中断优先级理解

2 `" i' j2 [9 G8 ~% F
CM3内核寄存器
; o4 v" M8 A' Q! N& ]. ^# ?, S
AIRCR——应用程序中断及复位控制寄存器地址(0XE000-ED0C)
+ `/ i- l3 x. Y$ Y# y6 E1 X
AIRCR是个32位寄存器,其中第8,9,10位为PRIGROUP 优先级分组设置位。见表1
% p, E  z2 X- ?* Y7 J, s
表1 AIRCR寄存器图

/ C; k2 _6 R. w
            
31

7 r( n: E- \5 R/ [8 \8 z            
            
…………

, O5 s1 Z; o, W5 l' b            
            
10
+ g  X) S* o! O+ I+ h& z7 B
            
            
9

& X1 ~/ O  k9 o: U            
            
8
# F. [0 }: G& L& N) y5 E
            
            
………

: K3 O" M1 O8 g, [2 n/ [            
            
0
( e% F' i2 }1 Q; A6 Y9 i
            

* I4 O( {' B7 b! V1 A7 R5 n4 f8 W4 V* t. L) A( U* G6 J
6 ?1 p) X9 b3 I& z% S( N8 c
表2为PRIGROUP[2:0] 即AIRCR 8,9,10位

0 ^: A) m! N8 z* i9 U' C
            
PRIGROUP
  l6 ?4 [1 }7 `
            
[2:0]
* t: D( t/ g3 n/ w
            
            
Interrupt priority level value, PRI_N[7:4]
: Y: B: N2 v; K9 S
            
中断优先寄存器组PRI_N[7:4]位⑴

. B2 m& J+ \1 v0 P3 D! ^' V, G            
            
Number of
, U2 g% X& b0 I4 T+ N4 n* T
            
            
Binary

! X) U3 D5 D# C- g0 @% r( ?            
point(1)
2 W2 B2 b' \% J' Q$ _
            
二进制点位

+ I1 G9 Q- f. I! q0 W* I  A            
            
Group priority

( H1 s  `/ X& W& Z( ?/ Q8 i; r, n            
Bits

) R8 Q. i* V* y* S9 i6 A            
抢占优先级对应位
6 e% b% O4 L/ p, V0 n$ s6 I3 K
            
            
Sub priority

8 t( L6 x+ S* E; X8 X# R            
Bits
: v& K0 Q7 v4 i; _, W. g2 C! P
            
响应优先级对应位
* ~2 K" i6 A6 Q# c) K0 m  `" G
            
            
Group

# l7 y7 ?; T7 V+ t3 h* R. N            
Priorities

5 P9 g- x) u: p: B            
抢占优先级

+ x! g' w+ P9 ]: H- D8 t            
            
Sub
8 c  ^( m8 i! N
            
Priorities
8 W8 N. t2 r" t- b
            
响应优先级

' e. f0 C. a3 i* n            
            
0b011
+ ?0 r/ s1 T5 N
            
            
0bxxxx
+ S8 L- d/ q/ R5 i5 L
            
            
[7:4]
6 g( K4 k. F3 ?6 u- F, }/ m5 d
            
            
None

) k! E  y- w. S( _7 y& I3 ~            
            
16
( ^3 |+ T5 n5 B& T! |/ v$ z! J4 g. p
            
            
None
2 t) J/ F. v8 E8 t
            
            
0b100

+ x; C7 c1 p$ i7 h$ k6 I0 [' Z- L            
            
0bxxx.y

. B. [5 x% V% u7 T" l            
            
[7:5]
8 U+ t2 q- Z6 x" O7 G- {. ?' ~1 G
            
            
[4]
8 C6 i1 x% y- R2 T  C
            
            
8

1 O, J6 u: U. P5 o            
            
2

, A, x" a5 `8 N9 Z            
            
0b101

) u# E, `0 F$ M. A2 C$ k, Y% E            
            
0bxx.yy

# Y) n3 m9 X! P( R, P! \; r            
            
[7:6]

4 W. M5 b# A- }+ Q. V            
            
[5:4]

! I6 m# b7 I9 y8 s0 a* O2 H; D$ ~9 L            
            
4
" \9 ]8 {$ n" S) q2 L7 D
            
            
4
! }- L8 r" B$ Z/ E
            
            
0b110

5 M$ h8 S/ ]' i7 i  e- y- U            
            
0bx.yyy

: {& q1 b- I* A8 {* O) e/ z            
            
[7]
, E: @* V. V) X" c
            
            
[6:4]
0 G3 E1 {! l/ ]9 _' D0 H- r4 d
            
            
2
: P( ?% V. B. _1 |  v
            
            
8

3 D; o4 c1 t5 h& Z$ f% u* p            
            
0b111
$ Z" B1 {9 Q- r  S8 p
            
            
0b.yyyy
/ @# a# Y* R4 I
            
            
None
# K1 ?! L& G+ |4 N" s
            
            
[7:4]

# |. y/ ^# H% H, v            
            
None

! v0 M7 e8 L! O$ ]) J# w. d            
            
16

4 k( z) `: f3 c0 Z4 T            

7 r, V5 ]9 ]" Z
表2 T 优先级分组

5 ]+ y! B2 p; L: C) N; h
表2注释⑴说明:

3 p  l5 w& q) l! P6 _% R
关于中断优先寄存器组PRI_N[7:4]位, PRI_N在CM3内核中为PRI_1~PRI_249.在STM32103XX中可屏蔽中断为60个.所以PRI_N为PRI_1~PR1_59.
$ {: _  `" x9 Q! T: e* P# O( h
而实际上在MDK里的STM32库文件把PRI_N定义为32位的寄存器组IPR[ 15].

# A7 _& Y9 f% e+ `" B  A5 l% \
即IPR[ 0]~ IPR[ 14],每一维元素因为有32位.(每个中断8位配置优先级)所以每一
2 o( V7 c. M- ~+ m; T
元素可以配置4个中断.比如说IPR[ 0]的位(31:23)配置中断A,(23:15)配

4 p6 `) J: a3 x, `
中断B,(15:7)配置中断C,(7:0)配置中断D。就是说每8位配置一个中断,那么其实这8位中,STM32只用了高4位来配置中断优先级别,低4位无效。
+ m9 |. r: b  _& G1 ]) i
注意STM3210XX系列只用了4位来表示优先级别.所以STM3210XX系列最多优先中断级别为16级。

2 B1 g; C9 r% z9 J* w' i( q
2^4=16级。

0 h2 M, O4 {: q4 H
如果上面的一段话对初学者理解还有点迷糊的话,我们看一下下面的图就应该很清楚了。
+ b# c% T; L% v
结合STM32库文件表达:就是SCB->AIRCR配置--------》IP[0]。
+ y6 w/ c2 d8 `. v
这里有一个歧义AIRCR配置--------》IPR[0]是对整个32位IPR[0]四个中断同时配置呢?还是可以对IPR[0]中的四个中断分别设置,个人觉得可以分别独立配置
1 ]3 p9 X3 v  s( D) K/ c) H
表2真值表就是具体配置STM32中断级优先级别了。
3 m1 y* j3 R% d4 v; Z

, Q; C, f+ f  L! K3 T( G1 t6 F; x
/ }1 s' K9 n# B9 p# g$ U
参考1:表2来自ST官方资料,STM32F10xxx Cortex-M3编程手册-英文版.pdf第135页。
- [4 k1 {7 H6 q
参考2:Cortex-M3 权威指南.PDF

STM32之中断入门理解.pdf

下载

159.2 KB, 下载次数: 461

赞 收藏 1 评论12 发布时间:2014-4-1 15:58

举报

12个回答
沐紫 回答时间:2014-4-1 21:06:16

RE:原创--哥带你学STM32之中断入门理解——中断优先级NVIC理解

过来支持一把楼主
alan_bach 回答时间:2014-4-3 16:11:13

回复:原创--哥带你学STM32之中断入门理解——中断优先级NVIC理解

回复第 2 楼 于2014-04-01 21:06:16发表:! r8 B8 L4 N+ v$ Z
过来支持一把楼主 
" {* n, x$ a3 V- k2 t: x3 Y
+ N% y( S2 o# E" w3 m5 _谢谢沐版主
ysdx06010302 回答时间:2014-4-19 07:48:43

回复:原创--哥带你学STM32之中断入门理解——中断优先级NVIC理解

 支持一下。谢谢
123-424225 回答时间:2014-4-20 15:34:09

回复:原创--哥带你学STM32之中断入门理解——中断优先级NVIC理解

xuexixuexi
sdddd 回答时间:2014-4-20 16:34:59

回复:原创--哥带你学STM32之中断入门理解——中断优先级NVIC理解

受教qqqqqqqqqqqqqq
nihaoshijie5188 回答时间:2017-2-1 11:15:13
stm2i 回答时间:2017-2-1 12:49:48
感谢分享!
五哥1 回答时间:2017-2-1 22:48:14
谢谢分享
wofei1314 回答时间:2017-2-6 10:11:25
谢谢分享~
jmzlzl 回答时间:2017-3-11 21:30:37
感谢分享
zbber 回答时间:2017-3-11 23:13:55
谢谢分享,不错,真是太棒了!! s" Q( y8 p1 T' g
哈哈先生105 回答时间:2017-8-27 17:02:21
谢谢分享
关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
人形机器人运动控制、感知与智能配电
半导体创新技术与应用方向
EE架构与软件定义汽车
12V/48V 汽车智能配电(SPD)
区域控制单元(ZCU)与分区架构
关注我们
st-img 微信公众号
st-img 手机版