STM32编程入门之 编译器KEIL MDK的数据类型及两个重要关键词, t1 |3 r$ r5 U6 G1 l3 W
5 ]$ u- H5 g3 K$ ]% {% S$ g
NVIC优先级+软件中断(SWIER)+软件仿真+硬件仿真(JTAG)+中断延迟6 |' O: u7 \ T2 f
* P1 n" ]( L! e9 f7 C6 r5 {! @2 ^6 Q8 F$ \$ s7 r
这篇文章本人写一2011年,当时为了理解STM32的中断就做了个学习笔记,现在为了支持沐紫@沐紫
4 ?' L- Q$ `, e哥豁出去了。把挖箱底都掏出来了啊 ,哥准备连发三篇,哈哈2篇已完成了。* J' x4 \2 d! q- H
[6 B; _8 b/ Z8 K0 M0 s }
首先来说说两个概念, 1 V* v! ]- n1 p* `7 x" x0 O
1、 NVIC的优先级概念
6 B; w% x- E- T) a. B7 k- t2 o抢占式优先级 (pre-emption priority): ! A3 `7 _+ w* [# y& h& w
高占先式优先级的中断事件会打断当前的主程序/中断程序运行— —抢断式优先响应,俗称中断嵌套。
4 z& R1 y, L% [: I- l3 d
; X4 v% Q% M% l6 H
8 U% A+ d2 L) a" Q2、副优先级(subpriority): 6 E/ Y* Z) C3 a7 u1 U* B5 ]
在占先式优先级相同的情况下,高副优先级的中断优先被响应;
9 [+ E4 r0 ?9 w# b# Y, s$ n3 b在占先式优先级相同的情况下,如果有低副优先级中断正在执行, 高副优先级的中断要等待已被响应的低副优先级中断执行结束后才 能得到响应——非抢断式响应(不能嵌套)。
+ \5 \0 i: ^: T f V总结:I: 关于抢占优先级,它总是与中断被嵌套相关连.比如说在A中断中嵌套了B中断.B能打断A中断,B中断就一定属于抢占优先级了. ' l" {! o& C3 t( D$ }/ i
II: 关于副优先级,个人认为它与中断嵌套无关,它不能被嵌套.3 j- ]8 f4 H& i' s7 v) K, i
2、判断中断是否会被响应的依据
+ r' S0 [, c0 p- [6 }- @$ V首先是占先式优先级,其次是副优先级; 2 S1 m6 [; I: |# K- e, P$ R0 B
占先式优先级决定是否会有中断嵌套;
. ?$ I: R/ y( R% H7 u& CReset、NMI、Hard Fault 优先级为负(高于普通中断优先级)且不可调整。
( I% P! T3 [5 u4 q6 x9 @) S. p- P接着简单了解一下中断优先级(NVIC.)
* y: @" t o9 B& f J/ h! OSTM32嵌套向量中断控制器(NVIC)中断优先级理解 6 H7 Z1 \$ N* ~: c# [
CM3内核寄存器
/ V7 I* `4 Q) N6 S7 tAIRCR——应用程序中断及复位控制寄存器地址(0XE000-ED0C)
8 O* x' J4 b: `/ s k0 z+ P1 Q5 vAIRCR是个32位寄存器,其中第8,9,10位为PRIGROUP 优先级分组设置位。见表1 + u; U3 o5 u+ ^5 v4 n7 v
表1 AIRCR寄存器图
/ ?1 ^& c9 d8 W( S3 u 31
4 k _7 _$ a$ a0 p | ………… 7 C. }- r! d1 v0 @6 f1 }" Z0 e$ N4 O
| 10
$ Z$ @+ E: g# Y% D | 9
7 ^* o% c. x$ P( S- T( }+ \% K | 8 ! U% F! Y- Q' L, b
| ……… / k+ Q7 Q) h2 k3 e8 ~
| 0
* ~6 |. d( t6 F7 A, \) y- { | ; c( Y: n8 A" W+ o0 H# Q& Y7 j
! k3 N/ b. W* _& }
# q5 }1 F8 `9 g
表2为PRIGROUP[2:0] 即AIRCR 8,9,10位 7 W2 \- @+ v# V
PRIGROUP % Y& O8 j1 a, {; y* {$ b8 ~% z
[2:0]
9 l4 q0 r( V: p' I4 e* [ r! D | Interrupt priority level value, PRI_N[7:4] 7 }8 _+ Q3 Z! O* t
中断优先寄存器组PRI_N[7:4]位⑴
3 {& z+ m: W% J | Number of
0 A. ^$ q% R2 G& @ | Binary 5 G$ R: i1 ]4 r4 e0 \
point(1)
) A6 f% I# h; \7 ]% t5 b- ` 二进制点位 + U H+ D. P8 d( K* N7 {
| Group priority
8 L+ N0 e. O' n- ^3 j Bits 5 M2 a0 v* u# p# q: v
抢占优先级对应位 4 K: k* m% U0 |: m
| Sub priority
- X0 X2 x- f3 S2 e0 c! G; k* a8 d Bits 1 g+ a; J2 N7 d9 U* ^1 X% w
响应优先级对应位
) D& B2 I; j! m' h | Group
. c1 q, E* O$ [: v- b Priorities
, @& {6 d4 m5 ^ l8 M 抢占优先级 + G6 F* | r4 S5 M. F% |
| Sub
# }! R6 L$ G: n Priorities 8 h. K6 f/ n c, V! b9 s z1 v
响应优先级 4 J. P* R9 I, Z& s" H! G
| 0b011
# n0 E7 w9 T o0 O2 |% f) S | 0bxxxx
9 |9 O! N; |$ J/ J! P | [7:4]
- F4 ~# ?* D p( L& @ }; f% U: M | None
! Z; S' ?) y( s8 _4 i' F, @. N; B | 16
* J! j6 X3 {; r3 f0 ? | None
9 a0 I; l0 [+ N | 0b100
3 f# H. N5 w: u | 0bxxx.y
) w' ~. p6 @& `! | | [7:5]
) R) a& a7 @. `+ |1 ]! @0 P# M8 t" s | [4] + i( Y# X7 k5 C
| 8
9 a5 u. d% b# [ | 2 9 g4 ]4 p9 w2 _& B& w2 E( L
| 0b101 / q% C, s9 ~. E5 ]
| 0bxx.yy
6 L$ @# Y* w3 T | [7:6] 5 T$ |% W9 a* c; E+ n0 B
| [5:4]
) G8 Y+ J& q. X7 u. i: D$ b | 4
Y5 B2 k- [% i$ \2 O/ F. l* Q5 t | 4 1 z: G% m+ [) h# k( x; y! |
| 0b110 " I \+ A0 x& r1 Z* W5 P
| 0bx.yyy 6 _: K) v9 c a9 u# t
| [7] 1 r! {, l y3 n
| [6:4]
; w9 N- p8 T% ]; `& ]* J1 e | 2
2 e9 N% Q" g3 h3 y3 P | 8 0 K/ \2 l8 J' L( t9 B" u, `
| 0b111 1 p3 E! z; }2 o) z8 k; `9 B/ J5 c
| 0b.yyyy
8 p0 u% t( u) k) R) L/ O | None
* C$ {0 M6 O& f" x$ y }5 Z5 X- k: F | [7:4] ! L f6 _% R+ D
| None 3 B6 z& h+ h: P* \
| 16 6 z* Y% o9 M1 w4 K; T/ @
|
B8 G# H3 y% p. ]! l: b% ~% _* D- p' O( {/ _6 O6 T9 T
表2注释⑴说明:
p/ a" u. c& e. v1 D) _& H$ R! n; j关于中断优先寄存器组PRI_N[7:4]位, PRI_N在CM3内核中为PRI_1~PRI_249.在STM32103XX中可屏蔽中断为60个.所以PRI_N为PRI_1~PR1_59. 7 |7 _/ }3 O$ V
而实际上在MDK里的STM32库文件把PRI_N定义为32位的寄存器组IPR[ 15]. / l6 ~) p, P. ~
即IPR[ 0]~ IPR[ 14],每一维元素因为有32位.(每个中断8位配置优先级)所以每一
) T6 R: f( V( |2 _0 c元素可以配置4个中断.比如说IPR[ 0]的位(31:23)配置中断A,(23:15)配
, A0 O+ R9 X! W3 v$ }# f+ V; n, N中断B,(15:7)配置中断C,(7:0)配置中断D。就是说每8位配置一个中断,那么其实这8位中,STM32只用了高4位来配置中断优先级别,低4位无效。 7 [% W4 R: Q ^' ]
注意STM3210XX系列只用了4位来表示优先级别.所以STM3210XX系列最多优先中断级别为16级。
- v: \$ C/ N3 G% w; T2^4=16级。
( o# K( P1 [9 f. B如果上面的一段话对初学者理解还有点迷糊的话,我们看一下下面的图就应该很清楚了。
1 P1 }8 P- h8 G( d: |( L+ V) k8 n q结合STM32库文件表达:就是SCB->AIRCR配置--------》IP[0]。 7 ]5 s- Q4 u, H) I! R2 S# p
这里有一个歧义AIRCR配置--------》IPR[0]是对整个32位IPR[0]四个中断同时配置呢?还是可以对IPR[0]中的四个中断分别设置,个人觉得可以分别独立配置
3 w* K# F9 V& G8 o: X表2真值表就是具体配置STM32中断级优先级别了。
% Q. |3 p, D$ K2 f, u1 L1 U* ~( }% M+ s; j* o4 b
; K1 [7 O4 J* N. m. A( N; z' h6 b
参考1:表2来自ST官方资料,STM32F10xxx Cortex-M3编程手册-英文版.pdf第135页。
, M, l) E( g* i3 n6 `- D y: l参考2:Cortex-M3 权威指南.PDF |
RE:原创--哥带你学STM32之中断入门理解——中断优先级NVIC理解
回复:原创--哥带你学STM32之中断入门理解——中断优先级NVIC理解
过来支持一把楼主 . R- ? k, e4 h5 J& v2 [
谢谢沐版主
回复:原创--哥带你学STM32之中断入门理解——中断优先级NVIC理解
回复:原创--哥带你学STM32之中断入门理解——中断优先级NVIC理解
回复:原创--哥带你学STM32之中断入门理解——中断优先级NVIC理解