STM32编程入门之 编译器KEIL MDK的数据类型及两个重要关键词
/ |5 K! S; Y! V
& y; G- B; e5 s* BNVIC优先级+软件中断(SWIER)+软件仿真+硬件仿真(JTAG)+中断延迟
- m. e, @* x5 s( W. s! B( W, \4 }3 _( O P/ p. I1 x4 W4 u0 @6 X# [
8 j; w- v9 {- ^ e
这篇文章本人写一2011年,当时为了理解STM32的中断就做了个学习笔记,现在为了支持沐紫@沐紫
1 n5 z0 n2 [0 T) y# `) N/ U0 A哥豁出去了。把挖箱底都掏出来了啊 ,哥准备连发三篇,哈哈2篇已完成了。. n5 w# R4 P' i5 y+ J8 l
$ n0 V, P% x5 X7 T0 x8 j# f" l首先来说说两个概念, 9 s2 U6 P& }# a- |) Y! f
1、 NVIC的优先级概念 6 K! e( }" L( U1 w6 r/ @& P
抢占式优先级 (pre-emption priority): 0 O0 f" m2 F& Q( \; a7 I' C+ |' E
高占先式优先级的中断事件会打断当前的主程序/中断程序运行— —抢断式优先响应,俗称中断嵌套。 7 k2 b8 J- {$ \1 w7 }, B F! B
' q+ [$ B9 ], B , F' a8 q# k! D! ]2 v$ n
2、副优先级(subpriority):
% r) O6 D+ N4 p在占先式优先级相同的情况下,高副优先级的中断优先被响应;
; J5 `' y- Q a3 Z F: ?( u在占先式优先级相同的情况下,如果有低副优先级中断正在执行, 高副优先级的中断要等待已被响应的低副优先级中断执行结束后才 能得到响应——非抢断式响应(不能嵌套)。 8 Y% f/ v; Z7 X/ U6 V4 E. o
总结:I: 关于抢占优先级,它总是与中断被嵌套相关连.比如说在A中断中嵌套了B中断.B能打断A中断,B中断就一定属于抢占优先级了.
{& c2 M. Y* X8 X: S1 pII: 关于副优先级,个人认为它与中断嵌套无关,它不能被嵌套.
/ s7 M& z$ k, b) _9 u2、判断中断是否会被响应的依据
3 ` y# B* K& P4 Z! d首先是占先式优先级,其次是副优先级;
& V9 _1 W: H- L, f8 ^: `占先式优先级决定是否会有中断嵌套;
5 b- u- O4 |& i) L& ^% J2 |Reset、NMI、Hard Fault 优先级为负(高于普通中断优先级)且不可调整。 ; F. u6 N/ v. j0 Y
接着简单了解一下中断优先级(NVIC.) " {, e: z6 V/ v ?
STM32嵌套向量中断控制器(NVIC)中断优先级理解
j* i9 I) u+ v2 ~+ }. m# t4 n" t- ?CM3内核寄存器 ; L! k" U, H1 E$ k5 v* k
AIRCR——应用程序中断及复位控制寄存器地址(0XE000-ED0C)
. r) [! a& n4 ^# M' \AIRCR是个32位寄存器,其中第8,9,10位为PRIGROUP 优先级分组设置位。见表1
# L* B% |# h5 T4 n) V
表1 AIRCR寄存器图
! v5 ~( _3 A( w 31 # L, z8 y$ r8 E& n" [
| …………
* }* e9 ]$ l, r7 [2 Z2 i | 10 5 E' ^( E! Z6 ?3 l3 x
| 9 ) \( i$ i% P F2 r2 ]! v
| 8
- f' a3 Q0 b. k0 D* X$ z | ………
1 K: C& ^# }0 G# T9 a: v | 0 3 j( @" m0 V/ o2 u. ?* l6 l
|
) K8 n$ {: s' R- L: A U) L) Q& L8 {' I1 `1 C( i
1 k Y ^) m6 P5 K表2为PRIGROUP[2:0] 即AIRCR 8,9,10位
: @* [9 w/ @4 P2 L3 t8 W. ] PRIGROUP
5 K" n% ]. x/ D, t' f [2:0]
+ q! @+ Z) E6 P' c+ z6 q! m9 y | Interrupt priority level value, PRI_N[7:4]
6 j" F& B5 n3 Q; H/ b- B 中断优先寄存器组PRI_N[7:4]位⑴
+ F9 I& T, P; | | Number of ) r, i% K+ a$ R' q) W
| Binary $ j) b( @' z/ ^8 w
point(1) , q. n0 D* [7 I, E
二进制点位 8 q9 g5 n! h6 [
| Group priority
/ C6 J8 a" V, O! k Bits ( C1 [& r& W+ \3 N
抢占优先级对应位 0 E* ^$ D8 F: ~9 \; H1 [8 p
| Sub priority + Q; Z+ x5 @6 M# |* Q: Z% u
Bits
% q6 F) t8 Q+ Z 响应优先级对应位 6 S- g6 \( t a2 c* a6 m
| Group
9 r1 ^# t9 d$ {7 C1 m3 I Priorities
. Y |; e: K) `% g6 C; k6 Y$ a% w 抢占优先级 ( Z7 k0 P7 G- V: r9 m. q( |
| Sub ! J8 G0 d7 m+ U+ u: P: ]# n; T
Priorities " Y$ q$ ^/ M. t& N
响应优先级
- H- O! W( H/ C8 b5 q7 g | 0b011 ( I# {5 O1 ]* w6 a0 ]8 y( |
| 0bxxxx
" J I" a3 Q$ j; ] | [7:4]
0 g$ Y! M% d$ T- D5 D5 G | None
& \' G5 M7 r2 P Y, X; E | 16
3 o9 ?' P9 J) z, p/ o) I0 J | None , ~" Z) q5 ] K3 I @
| 0b100
& a# ~" |' K0 x# j6 A | 0bxxx.y 0 u* I* r7 {9 t- r. |
| [7:5]
1 y/ }: c* [/ @( D4 g/ \ | [4] + L5 Q5 Y- T1 Z* E
| 8 % c, v* x# z$ B
| 2
. {) Z. Z$ _: _0 g+ E | 0b101
; y/ S7 u6 O/ P! I' { | 0bxx.yy
; D; ^2 G N' E% E5 q' K7 k7 A | [7:6] 1 N5 i, P/ G" C8 B" N) a
| [5:4]
. n3 ]' e: d w1 v. E2 [# u { | 4
h9 w2 V& S' U! i4 J& S | 4 : A" V0 w1 x( k* s: @ {# q0 \; |
| 0b110
/ |) |, k& f6 m3 M5 f; C1 j | 0bx.yyy
; e3 J8 h& A/ F( E; y& { | [7] ' I# A- `, M8 I0 k( l
| [6:4]
) l& g* Z+ z5 \/ ~; W' ` | 2
9 I- l0 B. k. I* ? c, g8 E- c | 8 . X8 k# I1 G. |8 ^) k% P# D H/ I
| 0b111 , s+ b, k( z" Y/ R1 D
| 0b.yyyy
4 |; ]1 q! m: x' s! \& W) ^ | None
* ]" g: r# g) M | [7:4]
) a# @" ?# i( Y9 w' _ | None 6 P% M8 ?) f% R/ r6 ]1 R
| 16 6 b9 o8 I/ M* s. R% ]
|
9 d9 O( g* {7 P1 ~0 m# |% {8 }. X' V' d
表2注释⑴说明: . |& E9 J2 ]& f3 h% S% R
关于中断优先寄存器组PRI_N[7:4]位, PRI_N在CM3内核中为PRI_1~PRI_249.在STM32103XX中可屏蔽中断为60个.所以PRI_N为PRI_1~PR1_59.
1 t1 T) f/ Z6 V$ _! O0 \而实际上在MDK里的STM32库文件把PRI_N定义为32位的寄存器组IPR[ 15].
, J9 Y, {/ j+ d- d8 h3 T即IPR[ 0]~ IPR[ 14],每一维元素因为有32位.(每个中断8位配置优先级)所以每一 * M0 P& s4 i& f. E- t/ w6 ?
元素可以配置4个中断.比如说IPR[ 0]的位(31:23)配置中断A,(23:15)配
# ~2 g6 ^( A; y# D6 J& w中断B,(15:7)配置中断C,(7:0)配置中断D。就是说每8位配置一个中断,那么其实这8位中,STM32只用了高4位来配置中断优先级别,低4位无效。 9 s+ o7 H: [' i3 d* \
注意STM3210XX系列只用了4位来表示优先级别.所以STM3210XX系列最多优先中断级别为16级。
! W/ N: J5 d% |0 g( u2^4=16级。 ' O0 Y6 m( D/ R. Y$ b" e; ?
如果上面的一段话对初学者理解还有点迷糊的话,我们看一下下面的图就应该很清楚了。
. k! ~1 H/ j9 }9 i结合STM32库文件表达:就是SCB->AIRCR配置--------》IP[0]。
7 I; {4 G2 s% U; t7 B( y这里有一个歧义AIRCR配置--------》IPR[0]是对整个32位IPR[0]四个中断同时配置呢?还是可以对IPR[0]中的四个中断分别设置,个人觉得可以分别独立配置 : m# x- z+ x6 [, w% i+ r ^4 ~
表2真值表就是具体配置STM32中断级优先级别了。 ' S, a& {' F) {
E" B) d$ u( v( `5 T, y+ q
5 W& p8 X) M) e% A5 @' X参考1:表2来自ST官方资料,STM32F10xxx Cortex-M3编程手册-英文版.pdf第135页。 8 O2 w2 |% _- m
参考2:Cortex-M3 权威指南.PDF |
RE:原创--哥带你学STM32之中断入门理解——中断优先级NVIC理解
回复:原创--哥带你学STM32之中断入门理解——中断优先级NVIC理解
过来支持一把楼主
谢谢沐版主
回复:原创--哥带你学STM32之中断入门理解——中断优先级NVIC理解
回复:原创--哥带你学STM32之中断入门理解——中断优先级NVIC理解
回复:原创--哥带你学STM32之中断入门理解——中断优先级NVIC理解