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

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

[复制链接]
alan_bach 发布时间:2014-4-1 15:58
STM32编程入门之 编译器KEIL MDK的数据类型及两个重要关键词
% _. u3 f: |1 o- v  t, e3 d$ o. {
NVIC优先级+软件中断(SWIER)+软件仿真+硬件仿真(JTAG)+中断延迟" u3 F4 Y& I: h- t7 s! ~/ T

  l9 E  p6 b- Z
, L5 }) _) @7 f) s这篇文章本人写一2011年,当时为了理解STM32的中断就做了个学习笔记,现在为了支持沐紫@沐紫
; v5 }2 J) N. s7 O, `4 n0 T哥豁出去了。把挖箱底都掏出来了啊,哥准备连发三篇,哈哈2篇已完成了。
" A6 l; `- |8 o7 S- a# U " V3 m5 f) y4 j! j8 J$ V1 S, h
首先来说说两个概念,

( ^& Y: G& F* D
1、NVIC的优先级概念
+ J3 C1 b. R" i- ?$ [; z抢占式优先级 (pre-emption priority): . J" g: g5 J& O2 a
高占先式优先级的中断事件会打断当前的主程序/中断程序运行— —抢断式优先响应,俗称中断嵌套。 . p1 H9 f8 q& ^7 e6 U

$ Y: Q( a* X6 t# B
1 Y! U" Q' ?3 s* c+ J
2、副优先级(subpriority): $ C) {1 }+ p6 v* \
在占先式优先级相同的情况下,高副优先级的中断优先被响应;
5 S' D! H) K0 j! p在占先式优先级相同的情况下,如果有低副优先级中断正在执行, 高副优先级的中断要等待已被响应的低副优先级中断执行结束后才 能得到响应——非抢断式响应(不能嵌套)。

4 H5 L+ r. h! n$ d) _7 k9 Y
总结:I: 关于抢占优先级,它总是与中断被嵌套相关连.比如说在A中断中嵌套了B中断.B能打断A中断,B中断就一定属于抢占优先级了.
1 e' v. m. O0 G. M) W
II: 关于副优先级,个人认为它与中断嵌套无关,它不能被嵌套.' M% G7 a0 l# a3 d6 h# [' H: }0 l
2、判断中断是否会被响应的依据
: N  p1 [2 G* v" g9 ?2 ]首先是占先式优先级,其次是副优先级;
0 k+ ^5 J5 U5 K) x- C占先式优先级决定是否会有中断嵌套; 2 ]: d  c0 m- w9 K8 B0 [. E4 R
Reset、NMI、Hard Fault 优先级为负(高于普通中断优先级)且不可调整。
3 P9 Y, s: s; B7 ~/ `" |. b% s# F& V
接着简单了解一下中断优先级(NVIC.)

" `& ^5 h5 u$ I& z
STM32嵌套向量中断控制器(NVIC)中断优先级理解

4 P8 A* V; ~: ~8 d+ ^* c0 _
CM3内核寄存器

' t; X* _0 G+ D: g0 x* s
AIRCR——应用程序中断及复位控制寄存器地址0XE000-ED0C
$ S) R2 G3 R6 ^/ ]4 J4 `
AIRCR是个32位寄存器,其中第8910位为PRIGROUP 优先级分组设置位。见表1
, W$ m1 `, j: A' N1 B7 g1 r
1 AIRCR寄存器图

/ g' W% E# A" I) R5 L0 S- C
            
31
* m5 i- j' l# u" {2 @$ o) E) j
            
            
…………
, x& z5 }6 k* a0 y" u/ G# ^8 Z
            
            
10
3 {+ O. A" \. d$ f4 A. L
            
            
9

  E/ S' M7 T2 o            
            
8
, Y" i) l5 _: R! B6 z
            
            
………
+ j$ m9 t. V' k3 j+ f
            
            
0
  H" N! u, l; |" R7 Y# I8 b
            
9 {3 H; M$ d) N0 l: s6 ?* B5 V
  g5 p' c" c, R7 H$ }
, H5 a# |' B! U+ m% V; y" v/ e+ E9 N) S
2PRIGROUP[2:0] AIRCR 8,9,10

6 S) k5 ^, }: D# b. E0 |
            
PRIGROUP

: |8 J6 O8 r1 A8 e* W: I# p            
[2:0]

) l3 D0 a* }* k            
            
Interrupt priority level value, PRI_N[7:4]

+ e7 E" j1 [4 m! {/ y. E            
中断优先寄存器组PRI_N[7:4]

" z& d, ~# Q' {1 p# ]            
            
Number of
1 D& e0 K) D% C3 F$ W7 U
            
            
Binary

9 i9 V  q3 Z- c+ H" f4 W            
point(1)
( ?! `9 ], Q! j6 e
            
二进制点位
9 j+ e! e% L3 H, r
            
            
Group priority

+ w" O" n0 K/ a            
Bits

* D) k/ V, v+ j7 y  o; o+ ~            
抢占优先级对应位
" h/ |# N0 O+ H# F
            
            
Sub priority
' Z: M5 C5 r; V1 c, |
            
Bits

+ Z4 k$ L! k$ e/ P! F            
响应优先级对应位
' H$ Y  t" Z" T, \0 x: i
            
            
Group

+ I1 G# C% q. F+ A( F& r  y+ C8 p            
Priorities
% z" Q5 g  a6 G2 ?0 g
            
抢占优先级

$ N( L. d, R7 k% n) ?1 N  ~/ K            
            
Sub

/ {/ u. a1 I+ T1 I7 b& z+ y! S            
Priorities

0 V8 o% e7 p% \7 Y5 w            
响应优先级

5 d. `$ b" A) x  e            
            
0b011
2 B* r& w2 f1 h1 ^) {0 M3 t
            
            
0bxxxx

) P3 F0 V( e# w9 }, h2 ?! p6 u+ ^: ^            
            
[7:4]

# R: `) R. L! y5 R$ J+ O) p/ M! `            
            
None

1 W! E5 F2 v, g; s. q* B0 u1 C) V( i            
            
16
* Q# `3 c; [) T0 G, x5 `+ |% k
            
            
None

+ l9 J- V# y% @0 z. D! g            
            
0b100
& j) u: r  V- W, a+ V
            
            
0bxxx.y
9 Q5 a$ m5 P( |  P1 u! d
            
            
[7:5]
: k; L! p8 G  k9 L$ g
            
            
[4]
$ V  h. j* f- g5 D# T
            
            
8

! _  x1 V! a$ v9 U+ G4 W! M+ h+ H  [7 Z            
            
2

5 P4 o, z( X2 V7 H/ Z- S' y5 Z* {4 G' Q            
            
0b101

3 @. z6 R1 f- H7 g; Y            
            
0bxx.yy
  ~+ o. @+ y1 ?! r0 j, z
            
            
[7:6]
- u; K- m! C$ s0 p$ h
            
            
[5:4]

+ C  N' c. E: G7 H0 X+ K6 O            
            
4
' ~0 s9 Q5 b1 z
            
            
4

8 A2 Q, t1 i+ j2 y$ T4 @            
            
0b110

# y1 n0 O4 t* c1 _+ }, o            
            
0bx.yyy
: k0 H0 x' ?' j  I* r3 j/ n* j+ `# T
            
            
[7]
. d" K, L( l4 S5 J9 c
            
            
[6:4]
( I% o3 \3 X* d6 D
            
            
2
, j" W9 H8 P/ z9 K
            
            
8
, F% O$ B) \( u$ |* l& F
            
            
0b111
; P+ D; r  D" v& V% @; P  [
            
            
0b.yyyy

7 `( U4 |3 m% B: N8 E            
            
None

: \! K4 M8 d& j' P) x$ B* G            
            
[7:4]

7 o  `/ a: K! L- ]* a$ G            
            
None
9 S, G' L) f3 R0 V; ]
            
            
16
' h/ k6 d5 Q& B6 b
            
  Q: m, a3 ~7 A3 S% L
2 T 优先级分组
% w" W  F5 t4 u$ q; J) e1 z
2注释⑴说明:
4 l* s8 J, o" d8 q! j! c/ E
关于中断优先寄存器组PRI_N[7:4], PRI_NCM3内核中为PRI_1~PRI_249.STM32103XX中可屏蔽中断为60.所以PRI_NPRI_1~PR1_59.

) G8 H3 f+ Z7 \& A9 h# n  V
而实际上在MDK里的STM32库文件把PRI_N定义为32位的寄存器组IPR[ 15].
# u1 U2 c/ S& g1 g1 ^1 t4 |
IPR[ 0]~ IPR[ 14],每一维元素因为有32.(每个中断8位配置优先级)所以每一
; E! N9 V4 b! z6 o
元素可以配置4个中断.比如说IPR[ 0]的位(31:23)配置中断A,(2315)配

+ R+ g/ M0 [/ U. F- d' N( `
中断B,(15:7)配置中断C,(70)配置中断D。就是说每8位配置一个中断,那么其实这8位中,STM32只用了高4位来配置中断优先级别,低4位无效。
3 g& x2 x8 L; Y9 g( P
注意STM3210XX系列只用了4位来表示优先级别.所以STM3210XX系列最多优先中断级别为16级。

& b! B' Y+ [. j2 K: |
2^4=16级。
" f, ~; T/ \. U1 t
如果上面的一段话对初学者理解还有点迷糊的话,我们看一下下面的图就应该很清楚了。
" d) e6 r2 H0 e5 F7 g9 B
结合STM32库文件表达:就是SCB->AIRCR配置--------IP[0]
9 a0 Z7 ?' M9 g% M
这里有一个歧义AIRCR配置--------IPR[0]是对整个32IPR[0]四个中断同时配置呢?还是可以对IPR[0]中的四个中断分别设置,个人觉得可以分别独立配置

: m- v6 [( S2 d5 i- e* E
2真值表就是具体配置STM32中断级优先级别了。

8 O8 @! x- m5 T$ J: [- {8 {
% [5 ?- `7 p2 ]8 O  x
' G( t' `" R3 U) D7 d9 |
参考1:表2来自ST官方资料,STM32F10xxx Cortex-M3编程手册-英文版.pdf第135页。

% _1 R  R4 B" Q: c2 n
参考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发表:0 Q' [- M' |& Z7 P$ h% s7 K! T1 O
过来支持一把楼主 / C4 {# o8 S7 D* R$ V5 ~

& w! v. d; x: [* m" ]谢谢沐版主
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
谢谢分享,不错,真是太棒了!0 B1 D; ?6 w: _8 s" D
哈哈先生105 回答时间:2017-8-27 17:02:21
谢谢分享

所属标签

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版