STM32编程入门之 编译器KEIL MDK的数据类型及两个重要关键词7 d; W+ ]1 ]+ X' e5 z" \2 T4 D# ?
$ ]( l1 `5 r" n: h# k
NVIC优先级+软件中断(SWIER)+软件仿真+硬件仿真(JTAG)+中断延迟3 [/ |. T6 E" }6 ^0 u
" G: _# {6 h7 h$ z) g* {6 x w
+ a8 C% B% ~- z1 F# L" w
这篇文章本人写一2011年,当时为了理解STM32的中断就做了个学习笔记,现在为了支持沐紫@沐紫; @, ?( p0 l2 y. t0 B' y* R& Y+ n
哥豁出去了。把挖箱底都掏出来了啊 ,哥准备连发三篇,哈哈2篇已完成了。; J0 m* b y# q; T
$ E9 Z# n1 c: [) R4 R- [首先来说说两个概念,
% g; }& z0 D! V' \1、 NVIC的优先级概念
% ~0 G: \; P% \, m( x; o抢占式优先级 (pre-emption priority):
5 w- W2 E' H/ w4 \高占先式优先级的中断事件会打断当前的主程序/中断程序运行— —抢断式优先响应,俗称中断嵌套。
% y3 C1 L* P* j9 I1 x* c3 g7 }
/ N3 T+ B. k6 L5 _: D' X6 A
4 f3 z1 \/ M3 z! W/ F2、副优先级(subpriority): 2 ]: P* I: u% e
在占先式优先级相同的情况下,高副优先级的中断优先被响应; & ^7 r% Z0 A- D3 t( O
在占先式优先级相同的情况下,如果有低副优先级中断正在执行, 高副优先级的中断要等待已被响应的低副优先级中断执行结束后才 能得到响应——非抢断式响应(不能嵌套)。 % `6 W# P/ @: j: D0 P& l E
总结:I: 关于抢占优先级,它总是与中断被嵌套相关连.比如说在A中断中嵌套了B中断.B能打断A中断,B中断就一定属于抢占优先级了.
2 s% c) f# k3 x* G6 I/ yII: 关于副优先级,个人认为它与中断嵌套无关,它不能被嵌套.) j4 s6 W2 K' b& w9 ~
2、判断中断是否会被响应的依据 - M- J! j$ \2 K5 _) m
首先是占先式优先级,其次是副优先级; + \( O: F# ~+ I$ w/ ^0 H y* }
占先式优先级决定是否会有中断嵌套; / J9 g F4 U/ ^
Reset、NMI、Hard Fault 优先级为负(高于普通中断优先级)且不可调整。 , Q5 E: A1 ]5 K9 Q9 C
接着简单了解一下中断优先级(NVIC.)
4 s% P8 A: W7 W7 E8 NSTM32嵌套向量中断控制器(NVIC)中断优先级理解
/ o, w1 o a9 i3 J- J8 ?CM3内核寄存器
; E8 K& @: S% R# e8 d2 QAIRCR——应用程序中断及复位控制寄存器地址(0XE000-ED0C) 0 G) b8 r7 f& N9 Z$ E& r$ q
AIRCR是个32位寄存器,其中第8,9,10位为PRIGROUP 优先级分组设置位。见表1
$ ~( U/ j# o* k' [/ ?9 X
表1 AIRCR寄存器图 1 `1 S0 Q7 ?% g) E) K
| 31 5 B1 B$ Q* U- E; U- I: |& ^
| …………
3 \% |$ z) \/ T" | | 10 8 ~& G$ w7 U+ `
| 9 9 W$ ]4 Q4 d0 ]; ~5 @: t# k$ z
| 8
2 r1 T, j7 N( P0 i | ………
# e( C3 r1 H& @% s8 N, M3 C( ?% g: P | 0 9 i' N! ^" J: J
|
- o+ \) V8 L \4 m' T, x/ I, z2 G0 J* j0 ]
' t0 l2 d# N# L2 B- ?7 Z表2为PRIGROUP[2:0] 即AIRCR 8,9,10位
- h9 i9 e$ J/ V| PRIGROUP
' y0 e) \1 e% l {& @$ l/ b [2:0] 1 {2 j% \4 x, j0 ~
| Interrupt priority level value, PRI_N[7:4] 4 P4 Z& y# k* }4 U: \$ C( X* l
中断优先寄存器组PRI_N[7:4]位⑴
' Y3 u$ }1 o) E9 p; {% H) n+ B | Number of
6 `8 P+ d4 }+ z2 T | | Binary
3 a3 c) F; b0 B5 }8 L point(1)
1 E3 R" s; ?) o' r! S" y- U5 ^ 二进制点位
- s1 H* U9 m0 b# m- X7 q& ~' ` | Group priority
9 z* @/ ?6 _* {+ |4 G6 D Bits
6 |4 b* ~$ F- k( R3 o, Z) n! P 抢占优先级对应位
E# k1 H; v) c9 ^# d | Sub priority 7 M2 e/ v, t! v9 M$ d4 N/ X: o
Bits
7 L' l. d' [, u# u$ a. P" N 响应优先级对应位 ) l9 |3 c, R' S( w) \, |
| Group 8 _' X6 k0 ]2 w; i0 G* M
Priorities
* v9 {0 a" [% z. `: r! V$ ~ 抢占优先级
+ |/ O/ u; {+ F6 J$ ]0 @; i' e | Sub
0 `" W' T% T0 L Priorities
h8 b+ ?" w1 | 响应优先级
& [( K! j/ q# P. O! W | | 0b011
1 f' V$ R: [9 { | 0bxxxx
2 o+ e( E7 S) H | [7:4] 6 b5 D% y# B' F* X4 k
| None
X0 O& e' E, y7 C: a | 16
( |7 J' b$ U& p8 P' z | None 2 O) G( `8 v& F1 m
| | 0b100 8 m- z$ p# c. M \ X
| 0bxxx.y
3 @( ^5 F/ D1 [- I1 t5 C7 C% F | [7:5] / {! y' X- _: T: K- Q* ?7 a2 z
| [4]
6 z+ P2 ~9 n' @" W | 8
5 V+ L7 p3 ~7 V: X | 2 * c8 u' ]+ o7 { E4 W. j
| | 0b101
) {% z! P6 `# Y5 U, c | 0bxx.yy
, G' l* i# h1 M# d z1 y) B5 O | [7:6] 9 P: Z' o" p* N: n+ R' }
| [5:4] 5 e; O- d/ l$ ?- x# A1 X; u8 z
| 4 3 o: W* @9 o0 Q( f L
| 4 9 i% K7 |# _; o; Q9 J
| | 0b110
- y4 q+ q& n) T# X1 t | 0bx.yyy & Z" ^* @: |3 R3 A; @. |
| [7]
; O0 f$ [5 u: _5 J( B; ^4 o5 y | [6:4] 8 a, C; b7 N2 {0 v7 p4 [
| 2 9 _! @8 T ?4 q9 F0 @+ `
| 8
% z4 P: X8 N4 L. O& z | | 0b111
, @$ n' O1 ~ a" i | 0b.yyyy
% K3 w" R7 J; b | None
( v. m: o, q3 F m' l& s | [7:4] 7 V$ |0 H" b1 b
| None 8 b W3 z3 o, S, u$ Q: I: ]
| 16
- _* k$ A( \5 P! y+ b! o# z. t |
% f$ s7 L- ^- |( V5 _" Q! O) a/ i0 b8 R2 K
表2注释⑴说明: $ w$ `" ~8 ^) @
关于中断优先寄存器组PRI_N[7:4]位, PRI_N在CM3内核中为PRI_1~PRI_249.在STM32103XX中可屏蔽中断为60个.所以PRI_N为PRI_1~PR1_59. , J4 z3 i6 |+ @2 r
而实际上在MDK里的STM32库文件把PRI_N定义为32位的寄存器组IPR[ 15]. : V3 v- w$ D; A" \# V
即IPR[ 0]~ IPR[ 14],每一维元素因为有32位.(每个中断8位配置优先级)所以每一 5 k& B2 f% \" y
元素可以配置4个中断.比如说IPR[ 0]的位(31:23)配置中断A,(23:15)配
8 J2 _9 {9 {& A) q7 K; @中断B,(15:7)配置中断C,(7:0)配置中断D。就是说每8位配置一个中断,那么其实这8位中,STM32只用了高4位来配置中断优先级别,低4位无效。
& n& F8 L0 o, L' k注意STM3210XX系列只用了4位来表示优先级别.所以STM3210XX系列最多优先中断级别为16级。
( Z0 J6 ~5 y$ t0 t2^4=16级。
0 m4 h% d$ g* _3 `9 x如果上面的一段话对初学者理解还有点迷糊的话,我们看一下下面的图就应该很清楚了。
+ P. C: [9 X3 V, z6 p结合STM32库文件表达:就是SCB->AIRCR配置--------》IP[0]。 ; P5 e1 Z5 Z9 x7 Q6 ]- E7 l
这里有一个歧义AIRCR配置--------》IPR[0]是对整个32位IPR[0]四个中断同时配置呢?还是可以对IPR[0]中的四个中断分别设置,个人觉得可以分别独立配置
4 X: y9 r+ k, l! g表2真值表就是具体配置STM32中断级优先级别了。
. `$ q. O' D! ?2 y8 u: H( d% _3 y$ [/ Z
3 P* H( O0 t& ~3 @7 k7 I: l& M- p
参考1:表2来自ST官方资料,STM32F10xxx Cortex-M3编程手册-英文版.pdf第135页。
* f( O" b" |; ` _( O4 ?$ y5 V参考2:Cortex-M3 权威指南.PDF |
RE:原创--哥带你学STM32之中断入门理解——中断优先级NVIC理解
回复:原创--哥带你学STM32之中断入门理解——中断优先级NVIC理解
过来支持一把楼主
谢谢沐版主
回复:原创--哥带你学STM32之中断入门理解——中断优先级NVIC理解
回复:原创--哥带你学STM32之中断入门理解——中断优先级NVIC理解
回复:原创--哥带你学STM32之中断入门理解——中断优先级NVIC理解