|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
1. 中断类型
/ ~. J/ \% n' M+ Y0 Z+ {, C 在此不严格区分中断和异常,即简单的认为中断与异常一个概念。0 T1 J3 y" y) t
M4 内核搭载了异常响应系统,支持众多的系统异常和外部中断。其中,F429芯片,系统异常10个,外部中断91个。除个别异常的优先级固定外,其它均可编程。stm32f4xx.h
0 i4 o# V0 T# W0 \: o5 V# G, F" n' u+ G/ R1 R
- typedef enum IRQn& u) m4 r, T/ J2 I! ^$ Q. N5 V
- # Q+ y+ e0 c( X$ R; H- \
- {
8 O) p: O, D- w% u1 V9 h6 L* s - 9 A( u P6 P! \: }) Z
- /****** Cortex-M4 Processor Exceptions Numbers ****************************************************************/& a& | D5 E6 J, ~( E1 x( u1 Q
+ N4 E& F& g+ H: ^6 p- NonMaskableInt_IRQn = -14, /*!< 2 Non Maskable Interrupt */
3 N0 R; P4 n$ r; |0 u& }, n - ' u3 g; \0 O' e4 o
- MemoryManagement_IRQn = -12, /*!< 4 Cortex-M4 Memory Management Interrupt */
- q" U3 S3 `. F9 z1 w - ( D! u8 J, C, ?8 C/ r- Q
- BusFault_IRQn = -11, /*!< 5 Cortex-M4 Bus Fault Interrupt */
, C- U* x! }, {' Q% f - 7 ~9 }7 n5 X# e$ T5 |. t
- UsageFault_IRQn = -10, /*!< 6 Cortex-M4 Usage Fault Interrupt */
# c3 @1 P8 ^0 l+ n
$ k4 ]! C) R+ [; G0 I5 y1 W0 p- SVCall_IRQn = -5, /*!< 11 Cortex-M4 SV Call Interrupt */- t/ J( |8 G; H
- / ^ }! F) N# ^8 m
- DebugMonitor_IRQn = -4, /*!< 12 Cortex-M4 Debug Monitor Interrupt */
9 X9 N# r0 n( _- U& T0 F
3 ?0 Q6 y" F$ U U4 ~2 Q" s- PendSV_IRQn = -2, /*!< 14 Cortex-M4 Pend SV Interrupt */
. \4 ]' |$ n" {. Z9 y6 P4 }
* e1 ]) n$ ?: G5 S- SysTick_IRQn = -1, /*!< 15 Cortex-M4 System Tick Interrupt */
. V9 F8 Y5 u0 E# S# S$ _7 } - ) |. {" z. O) i. K
- /****** STM32 specific Interrupt Numbers **********************************************************************/
# W& c6 D& l2 D: m, Z# P - 7 W7 d8 M' s. a2 J: z
- WWDG_IRQn = 0, /*!< Window WatchDog Interrupt */
2 s% t/ f3 j x& n' Z6 O* R. k - 0 Q& a# |8 a5 J+ A, y0 H
- PVD_IRQn = 1, /*!< PVD through EXTI Line detection Interrupt */: \6 s+ F0 t5 R2 i: @9 N4 X
- 3 n. |4 |$ |" E
- TAMP_STAMP_IRQn = 2, /*!< Tamper and TimeStamp interrupts through the EXTI line */
# H3 B5 e! h9 a1 z6 |# q% t - " I& L& l% a/ q
- RTC_WKUP_IRQn = 3, /*!< RTC Wakeup interrupt through the EXTI line */; b9 B: o O" P
- 8 ?7 R" s8 O: ^8 i: B2 h
- FLASH_IRQn = 4, /*!< FLASH global Interrupt */" Y0 k3 |3 f3 t2 u5 M0 \
- / C& N, g' V6 a2 J
- RCC_IRQn = 5, /*!< RCC global Interrupt */* i: [5 _" {6 h; b) V% U- f# `6 @# y
- + V+ a H% a! D- Y. N
- EXTI0_IRQn = 6, /*!< EXTI Line0 Interrupt */
7 H9 M) @, p( X, \. w! m
4 L+ a7 j" I# D s% g5 t- EXTI1_IRQn = 7, /*!< EXTI Line1 Interrupt */
2 Z1 m1 r0 _) }, W
: d( O& y1 Z/ y; _# ?) H- EXTI2_IRQn = 8, /*!< EXTI Line2 Interrupt */( I, p; ^8 B, D& g
: h5 @3 W* O% L# C; R( S. C. X4 _7 U- EXTI3_IRQn = 9, /*!< EXTI Line3 Interrupt */
/ f% L3 B$ H; x3 E9 _+ _; A - ' q1 T, m8 n- k4 U
- EXTI4_IRQn = 10, /*!< EXTI Line4 Interrupt */
% h* D, v" e* w* i/ i5 S - 5 T% Y; |* r. A
- DMA1_Stream0_IRQn = 11, /*!< DMA1 Stream 0 global Interrupt */
+ }3 k; }9 T4 j2 {8 K) V( ^
7 ^- _/ e$ f2 N5 y- DMA1_Stream1_IRQn = 12, /*!< DMA1 Stream 1 global Interrupt */
6 k1 H1 ^, {- y- ~5 C - 1 z7 P1 W( j6 E5 c7 X' y
- DMA1_Stream2_IRQn = 13, /*!< DMA1 Stream 2 global Interrupt */3 \: W( J# q4 u. g8 O1 d7 C
- " N8 t: E9 ?- ^9 [
- DMA1_Stream3_IRQn = 14, /*!< DMA1 Stream 3 global Interrupt */
% `. @/ C( R1 u9 @$ Z& A* J, S) J
D3 D" K* }& W' l' ~- DMA1_Stream4_IRQn = 15, /*!< DMA1 Stream 4 global Interrupt */
. V' O) h) U) E) g
! E8 }5 k) B) O& e5 }- DMA1_Stream5_IRQn = 16, /*!< DMA1 Stream 5 global Interrupt */; Z4 q e+ j' O6 r# q
3 D3 v& c! m( ?/ T; w) _- DMA1_Stream6_IRQn = 17, /*!< DMA1 Stream 6 global Interrupt */; S d( V) h7 L8 V" O
- - n. V, S' k, b# k; a2 c- O
- ADC_IRQn = 18, /*!< ADC1, ADC2 and ADC3 global Interrupts */
; D8 g0 y" z, v9 c" L) L - ( @$ G8 E7 }& a1 L" g% s, M
- #if defined(STM32F429_439xx). d5 c, n2 t6 q( [
- 6 B: C$ @" ?5 c! j7 ]0 r, w9 o% D
- CAN1_TX_IRQn = 19, /*!< CAN1 TX Interrupt */
. ^, N( k' g7 @2 K/ s
7 r8 Q6 e- d( J; F, B5 T- CAN1_RX0_IRQn = 20, /*!< CAN1 RX0 Interrupt */$ @4 J1 z8 H/ P) I5 ~
; C1 \+ y% Z) u- CAN1_RX1_IRQn = 21, /*!< CAN1 RX1 Interrupt */7 v4 v% x9 f4 \
' Z q( a# i' x- CAN1_SCE_IRQn = 22, /*!< CAN1 SCE Interrupt */ A" L, ?3 v% b
- 8 _' t h% U4 @9 e0 O' K2 X. X
- EXTI9_5_IRQn = 23, /*!< External Line[9:5] Interrupts */
, Z" H% }' m, s9 U0 P! b- K* k
4 |$ Q1 u- z7 l: a6 O- TIM1_BRK_TIM9_IRQn = 24, /*!< TIM1 Break interrupt and TIM9 global interrupt */# ~! I% V! ~* i, B
- ; V; |& B: H! l2 ^ |" V
- TIM1_UP_TIM10_IRQn = 25, /*!< TIM1 Update Interrupt and TIM10 global interrupt */
7 j5 [+ o# d( d. W1 G - 3 Z; p: k" g- q" i5 N7 H9 D
- TIM1_TRG_COM_TIM11_IRQn = 26, /*!< TIM1 Trigger and Commutation Interrupt and TIM11 global interrupt */
8 f# A. e# E# ` - - f: X6 K* c5 m8 H. H7 d
- TIM1_CC_IRQn = 27, /*!< TIM1 Capture Compare Interrupt2 t- w; K& N: I5 D, x
- 3 R8 d$ `, A8 N6 {
- TIM1_CC_IRQn = 27, /*!< TIM1 Capture Compare Interrupt */
2 C+ ^7 @3 q" A: z* d" I8 W - 1 Q7 j" ^2 w& ~1 P/ x. ?/ v( r. c
- TIM2_IRQn = 28, /*!< TIM2 global Interrupt */
6 `3 T& _5 Z) e/ H
6 H! L) W' i$ @+ ?( x5 b/ i- TIM3_IRQn = 29, /*!< TIM3 global Interrupt */* X! G# M; e8 R
- ! H8 j& y, z! l1 p0 b! ]" ~# F
- TIM4_IRQn = 30, /*!< TIM4 global Interrupt */
) }( x( `; b( V1 \) C - ! H6 y8 R- M5 ~8 d6 w/ C% J
- I2C1_EV_IRQn = 31, /*!< I2C1 Event Interrupt */, {/ c) Y6 U% p/ Y7 |
3 J/ n7 Y" c" ?& d& L- I2C1_ER_IRQn = 32, /*!< I2C1 Error Interrupt */
* b& `' O5 \* J7 q
9 P9 v( ~6 \8 P: O5 M$ \0 t- I2C2_EV_IRQn = 33, /*!< I2C2 Event Interrupt */; O u/ T" H9 g5 q Q5 d4 Q9 ~
! w$ C- \$ s% P+ J" F- I2C2_ER_IRQn = 34, /*!< I2C2 Error Interrupt */
6 n: b" a2 v7 y1 g - ) m' g* Y. \/ W
- SPI1_IRQn = 35, /*!< SPI1 global Interrupt */% ]1 T2 i' H' X7 I# F2 f
; F8 r O. F, M9 k/ Y; W; P- SPI2_IRQn = 36, /*!< SPI2 global Interrupt */: W$ [# P% i+ t: K) H" ~* f' Q
- , x# Y/ ?* d; L# @% \8 ~: O$ J: Z/ M: l
- USART1_IRQn = 37, /*!< USART1 global Interrupt */
( f* O2 }+ m; A: d, J" ^
/ I: m" a+ r- H1 Q- l5 v$ p" `/ |- USART2_IRQn = 38, /*!< USART2 global Interrupt */: C: l( I6 B6 I. _
- % n0 F. X; n$ ?& W5 W
- USART3_IRQn = 39, /*!< USART3 global Interrupt */
1 d( _0 m) [6 ?' s+ x, h
3 u1 L; k7 N7 `! ?- EXTI15_10_IRQn = 40, /*!< External Line[15:10] Interrupts */
& [1 W7 d+ ~- q! M; O - " t. M( I7 U( t0 [1 E- y
- RTC_AlARM_IRQn = 41, /*!< RTC Alarm (A and B) through EXTI Line Interrupt */
2 j5 {. k1 W( \7 n) r; q' _
6 l `8 j& o4 H( B- OTG_FS_WKUP_IRQn = 42, /*!< USB OTG FS Wakeup through EXTI line interrupt */
1 [1 \3 V9 l9 w8 L2 W - 8 \# y7 q B% U! D3 z
- TIM8_BRK_TIM12_IRQn = 43, /*!< TIM8 Break Interrupt and TIM12 global interrupt */
& a) p1 @( L% P( C2 }
p1 c! u0 {- `' q: b C+ p- TIM8_UP_TIM13_IRQn = 44, /*!< TIM8 Update Interrupt and TIM13 global interrupt */
" I$ l/ O. D3 K& a. L
! o8 r2 T+ g" {' t; q. e- TIM8_TRG_COM_TIM14_IRQn = 45, /*!< TIM8 Trigger and Commutation Interrupt and TIM14 global interrupt */) H, _7 r% U5 ]+ }6 M5 Y
- - n+ D c+ {( @* d4 {/ e
- TIM8_CC_IRQn = 46, /*!< TIM8 Capture Compare Interrupt */. N3 g% l. X( m
1 h* C: L+ G. m% Z- DMA1_Stream7_IRQn = 47, /*!< DMA1 Stream7 Interrupt */
P- U: X: r! F7 }% ?# u - : h1 Y) O0 l* _/ @5 Y7 l
- FMC_IRQn = 48, /*!< FMC global Interrupt */, L' g& @- C, k
# m' {4 ]& N: J6 r- SDIO_IRQn = 49, /*!< SDIO global Interrupt */4 Y! d* v- ~' O0 [. B S3 I
; X' F P/ w0 |# o8 n- TIM5_IRQn = 50, /*!< TIM5 global Interrupt */; C0 g. W1 C; m/ ?; p7 p( |
% e( X! q3 w3 O- ?- SPI3_IRQn = 51, /*!< SPI3 global Interrupt */
9 R: t$ o1 D8 M6 Z7 p7 s - ; T7 q2 q1 k5 V8 X" `
- UART4_IRQn = 52, /*!< UART4 global Interrupt */
3 I, G6 m! v8 v
7 |9 \7 N- O T6 a, x' d2 |' U- UART5_IRQn = 53, /*!< UART5 global Interrupt */$ o" @' ?% K' f6 z) F$ j) F) B
8 |/ Q, h+ b* i* C- TIM6_DAC_IRQn = 54, /*!< TIM6 global and DAC1&2 underrun error interrupts */
$ k2 o1 E. E+ G# ?( {/ N9 u
5 s( K# X' N6 n! ^8 U! e- TIM7_IRQn = 55, /*!< TIM7 global interrupt */6 k# e. g% |' }7 T. O' W" u7 r
- ; P1 p# N& s* X2 Q% _
- DMA2_Stream0_IRQn = 56, /*!< DMA2 Stream 0 global Interrupt */' p+ U8 q$ x5 a% ?
" C* R" Y! k8 R% X- l6 s2 O+ P- DMA2_Stream1_IRQn = 57, /*!< DMA2 Stream 1 global Interrupt */! G( C7 j2 q: b/ B* f* C& [: R! P0 @
- : Q7 m# f9 Q* z( [' [6 \
- DMA2_Stream2_IRQn = 58, /*!< DMA2 Stream 2 global Interrupt */
' Y1 z/ S: B/ p8 O, h1 @$ i
8 }/ R1 E+ W; `- DMA2_Stream3_IRQn = 59, /*!< DMA2 Stream 3 global Interrupt */% S% r) u) Y$ U* q4 |. }; ~% P0 w
* H& N- N9 x' l1 ~3 l/ a- DMA2_Stream4_IRQn = 60, /*!< DMA2 Stream 4 global Interrupt */
9 K# t& ^: t( K& c5 U5 F - ' z' [7 c2 A3 n" x: J& j
- ETH_IRQn = 61, /*!< Ethernet global Interrupt */
% |6 r0 I# s) ~3 y0 p
( s6 p) \; P) a V- ETH_WKUP_IRQn = 62, /*!< Ethernet Wakeup through EXTI line Interrupt */1 d% V8 D8 i# ]% {
- ' V* t' ]( O7 \7 `, i
- CAN2_TX_IRQn = 63, /*!< CAN2 TX Interrupt2 [5 w1 F/ W7 ]7 r( M
- 3 f) u5 r) f/ V4 |
- CAN2_TX_IRQn = 63, /*!< CAN2 TX Interrupt */. P0 }" S# h1 P" F; f8 S2 b7 _5 u) D
- 9 L0 ~7 M# q* ~ m9 W
- CAN2_RX0_IRQn = 64, /*!< CAN2 RX0 Interrupt */( ?- D# `: j& U
! N( C: H2 _/ ` I- CAN2_RX1_IRQn = 65, /*!< CAN2 RX1 Interrupt */7 s6 y9 l4 r% e) B# E+ ]( J
- - d. _0 D) w9 W% n$ j3 Q, m
- CAN2_SCE_IRQn = 66, /*!< CAN2 SCE Interrupt */
) g" N: O- k% w6 i& ? - 7 V0 R% Y, S( ~% @; `
- OTG_FS_IRQn = 67, /*!< USB OTG FS global Interrupt */
# _% r: _; ^) f
% E* @+ x4 N! ^; x9 j4 h; X- DMA2_Stream5_IRQn = 68, /*!< DMA2 Stream 5 global interrupt */
0 _( A; q0 @$ O" v8 ^. g - : x+ J- f, G( o$ z& V D' X
- DMA2_Stream6_IRQn = 69, /*!< DMA2 Stream 6 global interrupt */
1 x, k. A# A8 d& I4 m: \( Z- U- b+ m
! b0 V8 h7 A; x( O% S* U- DMA2_Stream7_IRQn = 70, /*!< DMA2 Stream 7 global interrupt */; j4 R' d0 `' _
- - z. m- B% c$ k0 g4 z. `" x
- USART6_IRQn = 71, /*!< USART6 global interrupt */- ?5 R. e/ s" m9 t/ b: f7 ]7 _
+ T* R4 t3 O9 E: Z7 O' @! S; D- I2C3_EV_IRQn = 72, /*!< I2C3 event interrupt */
2 ^9 K6 L1 T3 ~ - : I. \3 Q; J- X; M" ]
- I2C3_ER_IRQn = 73, /*!< I2C3 error interrupt */5 u8 f- w3 w- ]' D
* O; k' f! I3 a, \8 \- OTG_HS_EP1_OUT_IRQn = 74, /*!< USB OTG HS End Point 1 Out global interrupt */& c( r" K% m# P
5 g3 w9 H: c+ E" \4 V, K5 b' ?+ N7 }- OTG_HS_EP1_IN_IRQn = 75, /*!< USB OTG HS End Point 1 In global interrupt */7 c0 K( x4 n a* ?
: @3 P# o- y) }+ S# q9 c- OTG_HS_WKUP_IRQn = 76, /*!< USB OTG HS Wakeup through EXTI interrupt */
0 M; _0 U* Q9 [3 K
% U* N# |# \* \7 G- OTG_HS_IRQn = 77, /*!< USB OTG HS global interrupt */" n8 k7 }5 I5 F; R: r- T3 `
; G; t5 X8 v$ }! Y$ v- DCMI_IRQn = 78, /*!< DCMI global interrupt */
- d+ ]: z d) I/ d, K - * P; Q4 }* ~- ]. U
- CRYP_IRQn = 79, /*!< CRYP crypto global interrupt */) t5 x' D$ f+ j- F
- 5 v+ s6 I, r: }' E- n8 {+ ^9 x
- HASH_RNG_IRQn = 80, /*!< Hash and Rng global interrupt *// g$ ]5 W( F; ^4 o5 e7 p% I
- ' L( P/ [+ L) K X* U* w
- FPU_IRQn = 81, /*!< FPU global interrupt */
" N' Q; o0 p9 i; u1 F. M6 f - $ u9 r1 t6 \# _3 ~; [+ @
- UART7_IRQn = 82, /*!< UART7 global interrupt */
0 Z6 J) B7 G9 d! S0 e Y - 3 l' Q4 v B1 r! \1 S' n* z
- UART8_IRQn = 83, /*!< UART8 global interrupt */
, o6 x, H1 P/ _2 e( e) L0 I - 7 @9 _! |# W, E- z1 t' R
- SPI4_IRQn = 84, /*!< SPI4 global Interrupt */
: w8 Z" [+ g+ T( c% D, G) U
& q4 j) T, p# P1 B, |- SPI5_IRQn = 85, /*!< SPI5 global Interrupt */0 R8 t" }0 l( _
" w" w' D8 S# @- k# s& J# W8 p- SPI6_IRQn = 86, /*!< SPI6 global Interrupt */& I+ C# C4 R% E# O
- H. N& w! h C- SAI1_IRQn = 87, /*!< SAI1 global Interrupt */
, u# P7 M k( I8 [8 S6 B7 t
" [% P/ t; j) N3 ~7 `; j- LTDC_IRQn = 88, /*!< LTDC global Interrupt */5 q- K. v5 ]6 @5 }& R7 h
: _. v: D& m! E5 V; L- LTDC_ER_IRQn = 89, /*!< LTDC Error global Interrupt */
* r5 }, ^ p+ E8 [- S* S) ]; ^/ u
; x2 @1 m' T9 p& E g$ r- DMA2D_IRQn = 90 /*!< DMA2D global Interrupt */5 ]9 b8 d% I7 ^2 _: E
- O$ u9 K$ V$ e- I. c- Q) `' F) S
- #endif /* STM32F429_439xx */
0 I% W; a) f# o; ^+ s - " B4 H# `8 ?' I9 K+ V2 X
- } IRQn_Type;
复制代码 / M+ N! e% L6 N# i0 T
2. NVIC 概述
5 f6 R- ^" j9 x# T! J NVIC是嵌套向量中断控制器,控制着整个芯片中断相关的功能,它跟内核紧密耦合,是内核里面的一个外设。但是各个芯片厂商在设计芯片的时候会对Cortex-M4内核里面的NVIC进行裁剪,把不需要的部分去掉,所以说STM32的NVIC是Cortex-M4的NVIC的一个子集。
7 q$ d- V. Z& v6 Y9 | NVIC结构体定义,来自固件库头文: core_cm4.2 Q7 h+ a, g3 R$ t% g7 P
在配置中断的时候我们一般只用ISER、ICER和IP这三个寄存器,ISER用来使能中断,ICER用来失能中断,IP用来设置中断优先级。& B; P* E S6 n
+ {9 A7 c9 o7 G! E- f- /** brief Structure type to access the Nested Vectored Interrupt Controller (NVIC).& K9 g( G) Y! u' P/ z M" n
- 8 W$ H. U$ P# t4 w8 J& n, r
- */
8 u1 \4 v7 H0 |! q% g
- L* i# _) T5 a# L- typedef struct
- S2 j) ]" e: U4 ~# V
& @% t9 b! v$ q I9 ~3 J! e- {
# V" T, `4 H6 Q - - S1 `2 d+ Q; n! B! }" f
- __IO uint32_t ISER[8]; /*!< Offset: 0x000 (R/W) Interrupt Set Enable Register */
& Z, V- K, a0 M$ `$ o/ c0 c
( f2 O3 @0 c: Y! j: \) W' ?- uint32_t RESERVED0[24];/ U+ [/ G+ }7 k2 j( v4 W* F1 _
$ S1 V) |' a) ~; _3 G- __IO uint32_t ICER[8]; /*!< Offset: 0x080 (R/W) Interrupt Clear Enable Register */
: `* g. @" N" o
& o+ }4 H7 o8 R% M4 R- uint32_t RSERVED1[24];
- o! D2 \, L* W - ; t& Q( ?% j9 @) R
- __IO uint32_t ISPR[8]; /*!< Offset: 0x100 (R/W) Interrupt Set Pending Register */) Q) ^! ?" V$ O% u) Z$ d$ a. J
1 H1 X1 a0 F8 w$ e% {9 q4 x4 a- uint32_t RESERVED2[24];3 z6 d, P4 ^1 ?; j7 X' t
6 }: X* |( p# X* S- __IO uint32_t ICPR[8]; /*!< Offset: 0x180 (R/W) Interrupt Clear Pending Register */7 P. t! }$ g2 _' J( B: Y
3 l7 B/ y" N4 ~0 r- G- uint32_t RESERVED3[24];4 U( [. m) b! b% s
( v1 V4 o& v! \' x7 m3 i+ `" N- __IO uint32_t IABR[8]; /*!< Offset: 0x200 (R/W) Interrupt Active bit Register */
+ w7 `/ H. q2 E; g3 I, c9 e+ q
, B/ _5 P$ G( Q: p1 o+ w- uint32_t RESERVED4[56];5 a7 F' j2 n( O I. \- e
- - S0 z' g7 m9 h# T* t6 w
- __IO uint8_t IP[240]; /*!< Offset: 0x300 (R/W) Interrupt Priority Register (8Bit wide) */3 M- J* c. w& a! s5 C. l
- ! u# g1 A1 F* Q% p
- uint32_t RESERVED5[644];
4 d& N5 O( Y2 b9 z. {8 d - ' k+ N. m# U2 }+ R5 G
- __O uint32_t STIR; /*!< Offset: 0xE00 ( /W) Software Trigger Interrupt Register */# ^2 ?1 [0 P% a0 [/ o
- : B+ z& a5 E* h
- } NVIC_Type;
复制代码
) H# q% d3 U" D2 `! n$ i+ ~ 注:系统异常优先级配置拥有独立于外设优先级配置的寄存器
: s6 e k5 u# |! ^% x( l1 f$ ]$ W, P& c/ Y+ [
![]()
I0 ] A8 \ @3 s8 w0 j: ^! S 3. 中断优先级
" L5 T' t& Q+ M 在NVIC 有一个专门的寄存器:中断优先级寄存器NVIC_IPRx(在F429中,x=0...90)用来配置外部中断的优先级,IPR宽度为8bit,原则上每个外部中断可配置的优先级为0~255,数值越小,优先级越高。但是绝大多数CM4芯片都会精简设计,以致实际上支持的优先级数减少,在F429中,只使用了高4bit。9 f8 d x: M4 W/ ]9 y
F429 使用 4bit表达优先级 表达优先级
5 V9 B/ m7 M& c/ G: i; f6 L5 d
2 I# D( E& M; Q+ o3 t6 r; B 0 i& t- i5 F. i- ]( X) ?0 f
用于表达优先级的这4bit,又被分组成抢占优先级和子优先级。如果有多个中断同时响应,抢占优先级高的就会 抢占 抢占优先级低的优先得到执行,如果抢占优先级相同,就比较子优先级。如果抢占优先级和子优先级都相同的话,就比较他们的硬件中断编号,编号越小,优先级越高。4 R: N1 Q6 t) \/ f" g* G- B
4. 优先级分组- H& _3 d! l$ u2 s" h
优先级的分组由内核外设SCB的应用程序中断及复位控制寄存器AIRCR的PRIGROUP[10:8]位决定,F429分为了5组,具体如下:主优先级=抢占优先级。! J7 C+ b. l% A% M# c% z
$ {5 N5 X" R5 f3 f) K9 ~+ o ( v1 K- f4 J% y+ n: Q4 S+ y
设置优先级分组可调用库函数NVIC_PriorityGroupConfig()实现,有关NVIC中断相关的库函数都在库文件misc.c和misc.h中。
" L% x$ j- A6 [/ ~ 优先级分组真值表9 Q( q( i0 h* y7 [3 @; Z# S$ d
; F% A5 A$ F% [- f! m 7 D; \1 \5 F* i7 q& k, U& x
5. 编程要点, M% H; {& L: u. U' U# K2 Y
使能外设某个中断,这个具体由每个外设的相关中断使能位控制9 b/ ^' `. c6 N0 e% M
初始化NVIC_InitTypeDef结构体,配置中断优先级分组,设置抢占优先级和子优先级,使能中断请求
8 t5 K* b9 I, S3 \1 n$ w" ~( h1 @ 编写中断服务函数,短小精悍。8 ~, P1 [* O; [7 X* L
0 d3 L7 k5 U* M7 ]( y3 t3 X) q4 i5 b
. f% W( M8 ]' }. B! H7 {% b( L
|
|