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. l1、 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- G2、判断中断是否会被响应的依据
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 ~% FCM3内核寄存器 ; 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
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( q2^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 |
RE:原创--哥带你学STM32之中断入门理解——中断优先级NVIC理解
回复:原创--哥带你学STM32之中断入门理解——中断优先级NVIC理解
过来支持一把楼主
谢谢沐版主
回复:原创--哥带你学STM32之中断入门理解——中断优先级NVIC理解
回复:原创--哥带你学STM32之中断入门理解——中断优先级NVIC理解
回复:原创--哥带你学STM32之中断入门理解——中断优先级NVIC理解