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* D1、 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& zSTM32嵌套向量中断控制器(NVIC)中断优先级理解
4 P8 A* V; ~: ~8 d+ ^* c0 _CM3内核寄存器
' t; X* _0 G+ D: g0 x* sAIRCR——应用程序中断及复位控制寄存器地址(0XE000-ED0C) $ S) R2 G3 R6 ^/ ]4 J4 `
AIRCR是个32位寄存器,其中第8,9,10位为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
表2为PRIGROUP[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
% 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_N在CM3内核中为PRI_1~PRI_249.在STM32103XX中可屏蔽中断为60个.所以PRI_N为PRI_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,(23:15)配
+ R+ g/ M0 [/ U. F- d' N( `中断B,(15:7)配置中断C,(7:0)配置中断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]是对整个32位IPR[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 |
RE:原创--哥带你学STM32之中断入门理解——中断优先级NVIC理解
回复:原创--哥带你学STM32之中断入门理解——中断优先级NVIC理解
过来支持一把楼主 / C4 {# o8 S7 D* R$ V5 ~
谢谢沐版主
回复:原创--哥带你学STM32之中断入门理解——中断优先级NVIC理解
回复:原创--哥带你学STM32之中断入门理解——中断优先级NVIC理解
回复:原创--哥带你学STM32之中断入门理解——中断优先级NVIC理解