|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
1. 中断类型
# A& z$ |- p; m- U$ {+ \ 在此不严格区分中断和异常,即简单的认为中断与异常一个概念。
7 f3 w/ p: w+ T B M4 内核搭载了异常响应系统,支持众多的系统异常和外部中断。其中,F429芯片,系统异常10个,外部中断91个。除个别异常的优先级固定外,其它均可编程。stm32f4xx.h
$ u4 e5 Q& {0 l/ N- L
! d' o% |# |. ] `- typedef enum IRQn" k: C, H" c6 \ {
# |: n# M$ Y1 I) h* m- {0 }! f; I; H8 W- O0 {
) Z2 u( A+ ^/ x* n7 i# S: B- /****** Cortex-M4 Processor Exceptions Numbers ****************************************************************/9 n2 j+ R8 t% S: _0 ], a. m
- * b4 [3 s: R: H/ d7 s' Z/ H7 {4 t4 s
- NonMaskableInt_IRQn = -14, /*!< 2 Non Maskable Interrupt */
3 ^8 `7 u- K" I3 z: d& q6 A - & L. D$ s, T) o
- MemoryManagement_IRQn = -12, /*!< 4 Cortex-M4 Memory Management Interrupt */
5 w9 ?$ @+ w* S$ @
* q( |2 `. D$ u- BusFault_IRQn = -11, /*!< 5 Cortex-M4 Bus Fault Interrupt */3 ~( g% G+ `+ y% f* z
- / A$ H* A V4 ]5 h6 }$ p
- UsageFault_IRQn = -10, /*!< 6 Cortex-M4 Usage Fault Interrupt */: w( Y7 |7 o3 z
v+ p0 c! v* R4 q/ ?( k8 U- SVCall_IRQn = -5, /*!< 11 Cortex-M4 SV Call Interrupt */" ]8 s7 d8 F+ d9 l
- # ~$ V/ C; V" [1 I
- DebugMonitor_IRQn = -4, /*!< 12 Cortex-M4 Debug Monitor Interrupt */
5 B6 O- p! a N4 C1 x+ ~" }3 u
) M5 v5 m* J. V9 _ d- PendSV_IRQn = -2, /*!< 14 Cortex-M4 Pend SV Interrupt */
5 E' g6 c9 t0 J4 u' Y# i6 C
0 j! h- i; G: t. ] d- SysTick_IRQn = -1, /*!< 15 Cortex-M4 System Tick Interrupt */9 v/ W+ f4 ~- |; E) d. D5 W/ _
2 C( F8 k1 @! m" B1 p6 E+ I( R- /****** STM32 specific Interrupt Numbers **********************************************************************/) J' S' c3 S. h9 Y; ]
- ; r5 W, i+ j" C$ d
- WWDG_IRQn = 0, /*!< Window WatchDog Interrupt */
' Q& _0 n4 | N( X - ) J S6 |! X+ c+ \: A$ {
- PVD_IRQn = 1, /*!< PVD through EXTI Line detection Interrupt */
. S% t: C# i1 x4 U
: j; a+ _( S" H7 w- TAMP_STAMP_IRQn = 2, /*!< Tamper and TimeStamp interrupts through the EXTI line */! y: J7 H+ x& D/ M/ g
- * |( M; y6 a; p8 n |
- RTC_WKUP_IRQn = 3, /*!< RTC Wakeup interrupt through the EXTI line */
: d! Z) V1 w# c- X
+ x, o( C5 x* y; k7 ?9 d- FLASH_IRQn = 4, /*!< FLASH global Interrupt */* `+ N, H! M* ?3 S
- ! T1 t* _- d- E' a
- RCC_IRQn = 5, /*!< RCC global Interrupt */
! x/ J; v9 a% `- \6 f& [+ x7 I3 y - 8 l/ @- D/ p9 T# j
- EXTI0_IRQn = 6, /*!< EXTI Line0 Interrupt */( V% u* ~6 h. u" J$ b
& j2 v( a$ L' L2 H4 z# c4 w) r- EXTI1_IRQn = 7, /*!< EXTI Line1 Interrupt */8 f7 L7 I: i# S8 a8 d- A- `
- 5 f, h6 w! p8 l& O. j D( c
- EXTI2_IRQn = 8, /*!< EXTI Line2 Interrupt */2 ]. S3 F* b1 M5 c3 {
- / Q- v' F% t# @) I" d& g) w
- EXTI3_IRQn = 9, /*!< EXTI Line3 Interrupt */
6 p+ M7 V5 Q7 o: |7 h - 0 l T, _; ]( A( G1 e, E
- EXTI4_IRQn = 10, /*!< EXTI Line4 Interrupt */- }% Q" I4 ?" L }* b! U1 {3 [
: K, F/ s% W! I5 L. f7 G4 G- DMA1_Stream0_IRQn = 11, /*!< DMA1 Stream 0 global Interrupt */" A1 `$ T# {7 c9 Y, v
- 3 \ @9 J) Q3 T; t+ S; Z
- DMA1_Stream1_IRQn = 12, /*!< DMA1 Stream 1 global Interrupt */1 @. f, J7 K3 |7 f1 b' ?, m% o0 O& }
) `& ?% r6 i2 U# c- a2 s- DMA1_Stream2_IRQn = 13, /*!< DMA1 Stream 2 global Interrupt */& D7 e' {1 ^1 }1 j/ e2 }4 j
0 g7 C% F& h# t! q: ~+ O( z- DMA1_Stream3_IRQn = 14, /*!< DMA1 Stream 3 global Interrupt */- d3 n- B' W; U4 C* E
- 1 S z3 f* N! d ?' o
- DMA1_Stream4_IRQn = 15, /*!< DMA1 Stream 4 global Interrupt */
% q! a0 }1 t7 _1 b% c& ?
1 C, ?* S% W. @) s* d- X- DMA1_Stream5_IRQn = 16, /*!< DMA1 Stream 5 global Interrupt */4 f9 K1 C6 n$ ^3 k! V" z
- 9 a/ G- Y! ]# o) k9 L
- DMA1_Stream6_IRQn = 17, /*!< DMA1 Stream 6 global Interrupt */1 P* r- c& k* w6 A/ b/ E/ s2 i' o
- # x' v( O6 F/ f; X) E3 f% ^+ W
- ADC_IRQn = 18, /*!< ADC1, ADC2 and ADC3 global Interrupts */
! r" Y1 o/ k2 g9 y: r' I" E5 E
; z' K5 Q- C' b8 U7 C- #if defined(STM32F429_439xx)
) ^8 n' x* r2 ^2 n - : s; Q$ D# u7 O1 N Y5 V7 U
- CAN1_TX_IRQn = 19, /*!< CAN1 TX Interrupt */$ C1 t7 C; l- G* o( R9 k4 K
2 s: d+ D4 ?9 M% O- CAN1_RX0_IRQn = 20, /*!< CAN1 RX0 Interrupt */; D! o- A7 B) R1 k7 W' ?3 ^
) ~) @5 o5 `3 p/ R$ K- CAN1_RX1_IRQn = 21, /*!< CAN1 RX1 Interrupt */+ c& q3 m" U# d$ V# l( U, b
+ z& s. I# ~) N+ u2 N- [- CAN1_SCE_IRQn = 22, /*!< CAN1 SCE Interrupt */
# N6 ^) J2 Q* O$ r7 V' f' M( `
: W0 R" [* t9 b! \! ^. ~1 f) \+ T e$ Z4 Y- EXTI9_5_IRQn = 23, /*!< External Line[9:5] Interrupts */
$ g2 X. L. A; S3 r" v" o0 [ - ; b) X& M: f5 F- \: F
- TIM1_BRK_TIM9_IRQn = 24, /*!< TIM1 Break interrupt and TIM9 global interrupt */+ c1 e# d2 Q$ A" f. a# z. a9 n
- . u4 B. e* @0 k( }
- TIM1_UP_TIM10_IRQn = 25, /*!< TIM1 Update Interrupt and TIM10 global interrupt */
l) ?) V6 I8 c; n& n) T: L% J
# l+ D: Q1 v3 v) N$ r- TIM1_TRG_COM_TIM11_IRQn = 26, /*!< TIM1 Trigger and Commutation Interrupt and TIM11 global interrupt */; ^2 ]' W, {- i9 _& \
- + C; M7 I: H9 t6 n% u
- TIM1_CC_IRQn = 27, /*!< TIM1 Capture Compare Interrupt
9 g" G( U- D" G2 p9 D - 6 k p& {, ?2 F* P# B6 t
- TIM1_CC_IRQn = 27, /*!< TIM1 Capture Compare Interrupt */
: a9 i- e# z4 f: c2 l' v& N - 4 U: m T5 k( {
- TIM2_IRQn = 28, /*!< TIM2 global Interrupt */, i! |. t& v- l7 s
& G/ W" ?( g4 ?: ]% A0 k) ~- TIM3_IRQn = 29, /*!< TIM3 global Interrupt */
( k+ [: }( w+ Y9 V' r. K4 J
$ r; N) P+ ~1 I! N6 `; A/ F0 i- TIM4_IRQn = 30, /*!< TIM4 global Interrupt */
$ I8 z# i/ O V: s
u/ F- V/ g: Y2 v- I2C1_EV_IRQn = 31, /*!< I2C1 Event Interrupt */
/ A/ [% @- p. ^/ a
* f( K' d/ q+ A5 L# j7 s3 e; I- I2C1_ER_IRQn = 32, /*!< I2C1 Error Interrupt */% p! t2 F, R6 t4 }, s! K5 E& @7 X
6 _3 @2 s( u- R6 b- I2C2_EV_IRQn = 33, /*!< I2C2 Event Interrupt */ o: p1 @, s3 G
' i$ S$ z2 q1 q* e$ i& w4 k- I2C2_ER_IRQn = 34, /*!< I2C2 Error Interrupt */7 M3 ~ u- @8 g' f1 e, o
- , T, j: N+ O+ @* T/ }: Z; H; r
- SPI1_IRQn = 35, /*!< SPI1 global Interrupt */
9 X) O8 s% _7 M+ Q
4 y& h& Z6 {4 n# X* ^2 w- SPI2_IRQn = 36, /*!< SPI2 global Interrupt */! C$ Y2 i. e" [- a; N
- 4 W* S: n1 z D; ?4 V
- USART1_IRQn = 37, /*!< USART1 global Interrupt */
: K7 J; z; W9 p5 T3 j8 A) G - @: ]7 [9 L- f9 b0 c
- USART2_IRQn = 38, /*!< USART2 global Interrupt */% a- T. U1 l2 H2 ^7 z A; c
" p- c0 C% c- M" j1 p. e- USART3_IRQn = 39, /*!< USART3 global Interrupt */
I" h6 t; W5 L- f; ]4 y0 c - - v+ h$ G; n- H: M3 Z, ~
- EXTI15_10_IRQn = 40, /*!< External Line[15:10] Interrupts */
/ C% z |( ?& i# M: C - " i0 C0 a! }/ f' @$ U
- RTC_AlARM_IRQn = 41, /*!< RTC Alarm (A and B) through EXTI Line Interrupt */
5 a8 L) q- a2 N5 } - 1 F7 w" B7 l' i) v8 r j
- OTG_FS_WKUP_IRQn = 42, /*!< USB OTG FS Wakeup through EXTI line interrupt */
* A1 r# ?6 V7 u$ J; m# u6 t6 g% w" o
$ `' d B. ~, H" ?+ C# b( L$ [- TIM8_BRK_TIM12_IRQn = 43, /*!< TIM8 Break Interrupt and TIM12 global interrupt */
5 ^2 {4 E0 k( q4 F o9 ] - 4 C6 H6 e( d) y5 E3 Y" M' E
- TIM8_UP_TIM13_IRQn = 44, /*!< TIM8 Update Interrupt and TIM13 global interrupt */
0 ^7 d/ a/ ]7 a1 _
) r. _0 O9 n9 H/ r# G- TIM8_TRG_COM_TIM14_IRQn = 45, /*!< TIM8 Trigger and Commutation Interrupt and TIM14 global interrupt */9 k0 t( L e) M2 {% K5 y8 q
7 Q+ S8 u3 l `+ H- TIM8_CC_IRQn = 46, /*!< TIM8 Capture Compare Interrupt */
0 u4 c$ g+ ~# j - , C+ O! ^# V6 p* u' Y N4 _4 E- \ e
- DMA1_Stream7_IRQn = 47, /*!< DMA1 Stream7 Interrupt */3 G4 g! U% N; k% c! f V
& Z- l1 i: \7 V& ^) e1 \- FMC_IRQn = 48, /*!< FMC global Interrupt */
T U7 S/ r% ]" M, q
! S8 Z& t8 A0 H v- e- SDIO_IRQn = 49, /*!< SDIO global Interrupt */
4 k% V" Z, @9 Z) ?9 v8 Z2 {# _5 x! B - - k: w% h/ Q- \0 f7 J
- TIM5_IRQn = 50, /*!< TIM5 global Interrupt */
# v$ c1 k; v( a' k! k
* O( v! _# Y1 ?3 j4 j6 o, B- SPI3_IRQn = 51, /*!< SPI3 global Interrupt */+ {+ r8 l& N- @2 j- Z. k" X/ j5 ~
- # \- B. M& ]& o9 s+ h% z4 G l/ q$ h
- UART4_IRQn = 52, /*!< UART4 global Interrupt */: X- S8 `$ I& C4 S% M' r
# z" _; B& i# J4 `8 D O2 W- UART5_IRQn = 53, /*!< UART5 global Interrupt */5 L0 ^* i) m6 m# a/ b$ I6 j
- 3 K0 k" ~" z- ?1 C
- TIM6_DAC_IRQn = 54, /*!< TIM6 global and DAC1&2 underrun error interrupts */
0 i; P1 p0 |7 a1 l3 K7 c - 6 `4 v2 G$ e0 Y
- TIM7_IRQn = 55, /*!< TIM7 global interrupt */
& u) N. v+ D3 J9 k0 R+ q! Z
1 S" P3 I# V# e5 H) ^: T: m: D3 e- DMA2_Stream0_IRQn = 56, /*!< DMA2 Stream 0 global Interrupt */
7 v$ Z7 X& t, x" e6 P( p0 T1 x" _& y - : L) Z6 t- C6 Y
- DMA2_Stream1_IRQn = 57, /*!< DMA2 Stream 1 global Interrupt */6 @+ y1 }1 h! y4 A9 ^
q1 B; P6 ?6 _ C- DMA2_Stream2_IRQn = 58, /*!< DMA2 Stream 2 global Interrupt */
; m1 d( G9 ], E, B& B
$ T7 v7 u6 T" n' A; B- DMA2_Stream3_IRQn = 59, /*!< DMA2 Stream 3 global Interrupt */9 m. G; [2 E& f8 H( h& k
- ( S3 b5 \3 q3 I
- DMA2_Stream4_IRQn = 60, /*!< DMA2 Stream 4 global Interrupt */
+ O* R4 K6 V6 d8 K6 n: G' U0 S
0 Y, G# u( b( p- ETH_IRQn = 61, /*!< Ethernet global Interrupt */
3 z0 c. }# n+ T! K I2 w
' c2 u0 i8 B: G- ETH_WKUP_IRQn = 62, /*!< Ethernet Wakeup through EXTI line Interrupt */5 C( x0 J. U: Y6 G8 g- Y V& H
9 G* M |, Y& q0 {( F- CAN2_TX_IRQn = 63, /*!< CAN2 TX Interrupt
/ v+ m v8 [6 }" s* c, j3 A
3 z& p- O( H$ F7 E9 A$ w- CAN2_TX_IRQn = 63, /*!< CAN2 TX Interrupt */
" i* Q+ P& T2 A8 j; t# x( u6 t
8 N' f2 M9 R7 E- `1 |, F2 H- CAN2_RX0_IRQn = 64, /*!< CAN2 RX0 Interrupt */5 `( M/ Y4 m' D1 Y, K
- 4 J) l G' F& T. s. I+ c7 ~
- CAN2_RX1_IRQn = 65, /*!< CAN2 RX1 Interrupt */, F2 A) Y$ b: n- i0 l) k
- " h, p$ N; f L
- CAN2_SCE_IRQn = 66, /*!< CAN2 SCE Interrupt */% A4 {4 E" T+ n3 Q5 y( x; @! h
3 S" C/ M8 v5 ?* O7 z7 J- OTG_FS_IRQn = 67, /*!< USB OTG FS global Interrupt */
9 ~3 `3 D) D- N- B( q3 ^9 ~; Y& U9 n - # B# f* [8 V7 Z1 a- s* v
- DMA2_Stream5_IRQn = 68, /*!< DMA2 Stream 5 global interrupt */# p. @2 B* T; [! O3 _" c: H0 ?* ~9 X
l" z6 y ~: J# r- V- DMA2_Stream6_IRQn = 69, /*!< DMA2 Stream 6 global interrupt */6 K# G7 [2 Q2 G
- 6 C# u* z' R: \
- DMA2_Stream7_IRQn = 70, /*!< DMA2 Stream 7 global interrupt */
( M8 a+ s' W+ y% ?
! T E5 B5 a' G8 l$ Q0 U& f; X- USART6_IRQn = 71, /*!< USART6 global interrupt */
' {! J# r8 q4 f: G
$ l7 V* a! D8 H! `+ J- I2C3_EV_IRQn = 72, /*!< I2C3 event interrupt */2 l7 E$ q: N. @+ c6 x: e' u% K p4 Z
- ) [+ o5 v& B7 V/ j
- I2C3_ER_IRQn = 73, /*!< I2C3 error interrupt */8 C( \$ Q, r* r9 ]$ s% G0 Y* b; O
# p, q' H2 w8 }2 c3 ?- OTG_HS_EP1_OUT_IRQn = 74, /*!< USB OTG HS End Point 1 Out global interrupt */# v6 [% e0 ?2 C6 Q* w
8 s' v7 }9 E7 `- d) o! a) I4 M/ b- OTG_HS_EP1_IN_IRQn = 75, /*!< USB OTG HS End Point 1 In global interrupt */- n4 M: k- R9 Z7 F. \4 N( |. Z
4 m( I2 O! e2 ?0 g) n6 A: T- OTG_HS_WKUP_IRQn = 76, /*!< USB OTG HS Wakeup through EXTI interrupt */
8 E3 X6 m) N0 w5 |" F0 G+ d' _
" B( {6 ^* l1 Z- OTG_HS_IRQn = 77, /*!< USB OTG HS global interrupt */: p( J5 J' T8 X) }$ x
- $ K q# m! W, T5 a5 Z* H5 \
- DCMI_IRQn = 78, /*!< DCMI global interrupt */. K) N$ n- e* w. z/ U
- 7 _% g2 K1 C' p
- CRYP_IRQn = 79, /*!< CRYP crypto global interrupt */& \8 W6 n! X) r! O' d9 V2 t* Y6 A8 U
- " B X. A5 T5 [3 V% W( Y
- HASH_RNG_IRQn = 80, /*!< Hash and Rng global interrupt */
" q9 `- S. `% e0 l - : T' z# n6 Y; m: |, }- O! C
- FPU_IRQn = 81, /*!< FPU global interrupt */' Q l4 g" x3 l
- . _ z0 C; j# p D
- UART7_IRQn = 82, /*!< UART7 global interrupt */
& ^1 ^& z: I& [# k - : ?3 [9 o; k7 W3 N: R( m! y- b2 ?% [ X
- UART8_IRQn = 83, /*!< UART8 global interrupt */& I/ j% Y/ n/ A% U4 h- v' H
- * [$ z& D6 |# v1 t
- SPI4_IRQn = 84, /*!< SPI4 global Interrupt */( ^2 N0 j" F( m
5 W1 U2 ?4 }7 m+ s- SPI5_IRQn = 85, /*!< SPI5 global Interrupt */; p4 k# h- W1 _) q
- ' }. f* g: t( M+ K6 A1 P
- SPI6_IRQn = 86, /*!< SPI6 global Interrupt */
# c9 M% J% V4 \4 h; x% p - + \4 `4 O* J2 u! L1 N
- SAI1_IRQn = 87, /*!< SAI1 global Interrupt */
" {0 H9 F9 m% x* M! g - ! s* ]$ N* H; b" J0 ~
- LTDC_IRQn = 88, /*!< LTDC global Interrupt *// s$ Z/ h- U( N+ a3 ^5 Y& `3 ]! N! G/ K" u
- 5 ?3 B* C- J, s6 m
- LTDC_ER_IRQn = 89, /*!< LTDC Error global Interrupt */
( S. [- o/ w! P - 2 x, D9 c/ c' l6 c2 N7 ]; E
- DMA2D_IRQn = 90 /*!< DMA2D global Interrupt */
$ f3 a( `( a! _; C, d - ! D$ c6 M% @( G' V
- #endif /* STM32F429_439xx */: K1 X2 W7 `9 J" J, a, H2 o
- ; a+ B. _7 `) l
- } IRQn_Type;
复制代码 4 _% \$ A* Z- k6 N
2. NVIC 概述, P- G6 B9 V7 `; @9 J
NVIC是嵌套向量中断控制器,控制着整个芯片中断相关的功能,它跟内核紧密耦合,是内核里面的一个外设。但是各个芯片厂商在设计芯片的时候会对Cortex-M4内核里面的NVIC进行裁剪,把不需要的部分去掉,所以说STM32的NVIC是Cortex-M4的NVIC的一个子集。
. q4 Y/ m" N4 _+ f+ s NVIC结构体定义,来自固件库头文: core_cm4.. O5 n1 e5 x; M/ g# w
在配置中断的时候我们一般只用ISER、ICER和IP这三个寄存器,ISER用来使能中断,ICER用来失能中断,IP用来设置中断优先级。
9 F( `- m Z- m/ ^$ t' Q- W, A, H8 w' R* g
- /** brief Structure type to access the Nested Vectored Interrupt Controller (NVIC).9 Z- b5 O, S8 [; T0 j
- 2 W+ S% o8 V/ k: {, i
- */
" [5 ]4 \. v9 j! X9 l4 S! M - 2 S+ A A4 D B- c$ \
- typedef struct
/ j8 l* s5 t: {" B' g0 s - ; ^% I% j% v. Z- x( \6 ]
- {
3 q0 D4 d! I0 ~' b' w+ x9 |
! f6 ^3 G' O$ M% ~* e' T9 a- __IO uint32_t ISER[8]; /*!< Offset: 0x000 (R/W) Interrupt Set Enable Register */# ~" ? z N% l c( p/ Q0 }8 J
- 8 |# l! j) P0 @
- uint32_t RESERVED0[24];
+ i1 y0 X g" c6 x
. C* i2 j. Z( J- o/ m* N2 a* _- __IO uint32_t ICER[8]; /*!< Offset: 0x080 (R/W) Interrupt Clear Enable Register */
( \+ Z# }/ A1 c) B - ! }/ s) s8 v: q' Z& C$ d
- uint32_t RSERVED1[24];4 D# H, Y1 L2 {
# k& w; l9 K6 Y/ L- __IO uint32_t ISPR[8]; /*!< Offset: 0x100 (R/W) Interrupt Set Pending Register */
1 X+ z# k- H5 h - # v _8 P6 s) A- g
- uint32_t RESERVED2[24];$ j% V) G8 }. L' M' j
0 n `/ E9 Z+ v0 v7 z- __IO uint32_t ICPR[8]; /*!< Offset: 0x180 (R/W) Interrupt Clear Pending Register */6 A- ]9 g! j1 ?4 w2 D
0 b6 x2 L6 T3 |' T% K( |( z. v- uint32_t RESERVED3[24];: O, v+ }1 i7 ~& v/ f3 z/ F
7 a5 Q$ I% Z5 d' o" V- __IO uint32_t IABR[8]; /*!< Offset: 0x200 (R/W) Interrupt Active bit Register */
, I& n# a! Z3 p" S) I) d - Q0 y% V. e( l% z5 ^) L/ G; @
- uint32_t RESERVED4[56];. L- ~# J; |! ^0 m
7 A" | G, u8 s. f5 |# h' ?- __IO uint8_t IP[240]; /*!< Offset: 0x300 (R/W) Interrupt Priority Register (8Bit wide) */
e" q* C- K. k, @ - - ~7 o. G+ M# u
- uint32_t RESERVED5[644];3 P% D) v1 q9 u# q
D7 g7 ]- y5 _- x& c3 j& I- __O uint32_t STIR; /*!< Offset: 0xE00 ( /W) Software Trigger Interrupt Register */
2 [$ u: t) g. c" f# j
$ ~6 ^" q2 o. `8 K H- } NVIC_Type;
复制代码
8 p* a: v0 z2 ~9 S' M. ? 注:系统异常优先级配置拥有独立于外设优先级配置的寄存器
7 b4 ~0 l: f6 z; L. P4 R
6 C6 E7 X5 u. l8 k1 m ( s0 d, @2 J# u7 f$ d. V8 n! g
3. 中断优先级
6 A' J' ~! u3 b- R$ z6 L 在NVIC 有一个专门的寄存器:中断优先级寄存器NVIC_IPRx(在F429中,x=0...90)用来配置外部中断的优先级,IPR宽度为8bit,原则上每个外部中断可配置的优先级为0~255,数值越小,优先级越高。但是绝大多数CM4芯片都会精简设计,以致实际上支持的优先级数减少,在F429中,只使用了高4bit。
j& l+ n; y8 @1 O; Z% K F429 使用 4bit表达优先级 表达优先级) o, \" r& [ h6 i% P
" O, }" z* r! t: V* l- w7 c" |
![]()
6 P4 Z+ w I: r 用于表达优先级的这4bit,又被分组成抢占优先级和子优先级。如果有多个中断同时响应,抢占优先级高的就会 抢占 抢占优先级低的优先得到执行,如果抢占优先级相同,就比较子优先级。如果抢占优先级和子优先级都相同的话,就比较他们的硬件中断编号,编号越小,优先级越高。3 [ K: Z8 s2 \+ O, U- y
4. 优先级分组
9 J/ [+ H0 _3 Y, G. y! N+ H h 优先级的分组由内核外设SCB的应用程序中断及复位控制寄存器AIRCR的PRIGROUP[10:8]位决定,F429分为了5组,具体如下:主优先级=抢占优先级。
+ f ~& ?* S2 S. u l4 I" Y; O, C& v/ f# y/ r0 y- F3 X7 y2 P
- F7 I. X' Y; Y* [/ u
设置优先级分组可调用库函数NVIC_PriorityGroupConfig()实现,有关NVIC中断相关的库函数都在库文件misc.c和misc.h中。4 G/ g3 ~% O( j% x+ |" U
优先级分组真值表4 r% i: |9 S& d3 @ b9 R6 p/ v
8 w( u: Z' `( v: T( X+ ^
! [- r5 a+ i. L/ w( y
5. 编程要点/ P! d: u, z7 H6 e7 S/ r+ t. y0 p
使能外设某个中断,这个具体由每个外设的相关中断使能位控制
/ c0 Q5 ^5 u$ q8 P' r 初始化NVIC_InitTypeDef结构体,配置中断优先级分组,设置抢占优先级和子优先级,使能中断请求: z5 d w4 q" q6 Q6 }( g
编写中断服务函数,短小精悍。8 I1 {- d) U% y! o6 V9 K; h" T
9 Q* d2 l9 F% ^; M; G3 n) b8 J) s
7 N6 b9 k! M% M& K |
|