|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
1. 中断类型' P5 i9 N, \6 B. X5 h. O8 Y# i
在此不严格区分中断和异常,即简单的认为中断与异常一个概念。' m; l- U8 a1 b; r7 C1 m% \
M4 内核搭载了异常响应系统,支持众多的系统异常和外部中断。其中,F429芯片,系统异常10个,外部中断91个。除个别异常的优先级固定外,其它均可编程。stm32f4xx.h
; d( b% L) _; n& \
' J2 k" J4 l) i% ?' B5 B- typedef enum IRQn! X0 L# |- Q; Y1 t1 |" H4 D( h4 J( ~
- - N \6 g1 H" j( N
- {! z3 p' E2 [- q; g& p$ v
' g1 \) T% P9 C0 a" [' S: }9 a5 z- /****** Cortex-M4 Processor Exceptions Numbers ****************************************************************/+ U5 f% R; B. }% a- F' k
4 d) }. s" @/ |2 }8 P2 I- NonMaskableInt_IRQn = -14, /*!< 2 Non Maskable Interrupt */% d; i N: y5 K- x k8 z0 B. M
- $ m, @* _; G6 u
- MemoryManagement_IRQn = -12, /*!< 4 Cortex-M4 Memory Management Interrupt */9 B7 ^6 J" Q9 T+ l% j+ x7 X3 N
* S% X B6 U2 D; }# f; z- BusFault_IRQn = -11, /*!< 5 Cortex-M4 Bus Fault Interrupt */8 q& y6 }! g8 g5 I( _( i8 N
- 3 R* |& |# J7 U6 z
- UsageFault_IRQn = -10, /*!< 6 Cortex-M4 Usage Fault Interrupt */: x0 t( e% O5 _; B" a/ \( v
9 x6 j4 g7 ~4 g; L/ v& s- SVCall_IRQn = -5, /*!< 11 Cortex-M4 SV Call Interrupt */
& k* p* b" Z: K0 |$ Z d4 | - 7 i5 r$ o3 X, W) v; B) O w; s
- DebugMonitor_IRQn = -4, /*!< 12 Cortex-M4 Debug Monitor Interrupt */
4 J- w/ j! F2 K% z( z2 v/ q6 J - 3 U6 E |) ~, y, S$ D% x4 f8 m
- PendSV_IRQn = -2, /*!< 14 Cortex-M4 Pend SV Interrupt */
$ K) T/ f4 J9 \% x - ; @# R, d( C9 N! M, S4 k$ l' \
- SysTick_IRQn = -1, /*!< 15 Cortex-M4 System Tick Interrupt */7 F$ n: m/ e6 u, O& Z4 @$ i
- , H: R5 @, [+ U. ~; Q1 d) G- J
- /****** STM32 specific Interrupt Numbers **********************************************************************/
7 h8 Z# Q* J T6 L - & B3 o! b$ D6 l7 x
- WWDG_IRQn = 0, /*!< Window WatchDog Interrupt */
) `% s! h' C: S4 f a4 `8 T
3 X3 X3 }7 V! S; q$ S) w* Z- PVD_IRQn = 1, /*!< PVD through EXTI Line detection Interrupt */
- ? L* }2 i: p9 e; J: s% P - . I# E& u; y' ]- A4 b9 W6 {
- TAMP_STAMP_IRQn = 2, /*!< Tamper and TimeStamp interrupts through the EXTI line */
2 v" s& o0 j2 t* k; S4 { - 4 q0 w2 }" l& V2 p" p0 w
- RTC_WKUP_IRQn = 3, /*!< RTC Wakeup interrupt through the EXTI line */3 Q9 {" D/ W% F
- & U7 {. H# e0 u9 q N, p6 s
- FLASH_IRQn = 4, /*!< FLASH global Interrupt */* A! Q" P; |$ H7 h$ i$ M% L7 b
3 q, \0 g7 h/ ]# G+ p8 }* j- RCC_IRQn = 5, /*!< RCC global Interrupt */
" {& @! P! j# ^) `/ y O
, o9 B4 l5 P* X1 o* |( x2 n3 t H- EXTI0_IRQn = 6, /*!< EXTI Line0 Interrupt */
6 m' V$ g' O9 Y6 d( _ - 2 @" `5 C6 ? L7 t/ I$ l7 H
- EXTI1_IRQn = 7, /*!< EXTI Line1 Interrupt */
' G5 t: Y: k3 l4 w
- u3 Y5 G e) K) l" O- EXTI2_IRQn = 8, /*!< EXTI Line2 Interrupt */8 _ S- r; U# }: m9 {' ~- ?. o
( Z# R3 p# D ~! V: Y5 |, u- EXTI3_IRQn = 9, /*!< EXTI Line3 Interrupt */; j" O& b, s2 S' [
6 ?& v8 h/ Z' K: v: I4 X- EXTI4_IRQn = 10, /*!< EXTI Line4 Interrupt */
' r8 ?) G3 l0 F& R4 q
7 A K- Z- B( g4 S- DMA1_Stream0_IRQn = 11, /*!< DMA1 Stream 0 global Interrupt */2 D3 q. E3 j/ Q# X" \ a
- $ Q. G, X2 a& j2 ~
- DMA1_Stream1_IRQn = 12, /*!< DMA1 Stream 1 global Interrupt */1 k: M, P" Y5 Q, X- S1 Y
! r7 D$ ^" _( x0 a, R/ C0 O/ s* Z- DMA1_Stream2_IRQn = 13, /*!< DMA1 Stream 2 global Interrupt */
( x' l& }, L; E+ Z% M# ]+ o: U/ V - . F6 a( O4 }* M5 Z+ k( F
- DMA1_Stream3_IRQn = 14, /*!< DMA1 Stream 3 global Interrupt */
. K# \5 j @8 n5 l/ x& N$ K5 Z
8 I+ D* Q# A6 P$ A- DMA1_Stream4_IRQn = 15, /*!< DMA1 Stream 4 global Interrupt */8 D; A4 f( [- a. B
$ Y3 u& i; A- ?+ L: J3 P- DMA1_Stream5_IRQn = 16, /*!< DMA1 Stream 5 global Interrupt */
+ d# W5 O! z7 M, h) m/ @& j - & o5 D1 y6 E- }. L
- DMA1_Stream6_IRQn = 17, /*!< DMA1 Stream 6 global Interrupt */$ B0 B+ I) f# \! A! M
8 h) ?$ V* E& d- ADC_IRQn = 18, /*!< ADC1, ADC2 and ADC3 global Interrupts */
5 N9 A5 `( T- F; _/ u- m - 8 J2 E0 [# U) N* ^' Z% d# u
- #if defined(STM32F429_439xx)8 G$ b. Y$ C4 `8 _
- 7 S' H: H3 u2 G6 _/ s2 x$ v
- CAN1_TX_IRQn = 19, /*!< CAN1 TX Interrupt */
% Y9 q, P. ~$ J* G
. U# ]5 F, E+ E- CAN1_RX0_IRQn = 20, /*!< CAN1 RX0 Interrupt */
) `% A& i* o7 t- D1 { - w% k/ g0 T$ O) x( n; F
- CAN1_RX1_IRQn = 21, /*!< CAN1 RX1 Interrupt */
' O4 k7 s" L+ f" @5 t& G1 Q: Z1 l
+ E) C& }2 x- U! J$ m( a9 |- CAN1_SCE_IRQn = 22, /*!< CAN1 SCE Interrupt */
5 d6 Y; e8 J; h+ ^3 _
# P0 V5 `9 o6 j# t9 r- EXTI9_5_IRQn = 23, /*!< External Line[9:5] Interrupts */
& }: z+ k7 f, O7 n - V* ]) p! ?# b0 ]3 S1 Y: P6 D
- TIM1_BRK_TIM9_IRQn = 24, /*!< TIM1 Break interrupt and TIM9 global interrupt */& L2 s0 K A& x1 Z4 W# q
- 8 e; z0 I3 }/ N* Y$ V( T- k
- TIM1_UP_TIM10_IRQn = 25, /*!< TIM1 Update Interrupt and TIM10 global interrupt */, j6 l! z2 O# Y7 y! ]
$ S0 n! P' f% ~. m6 a- TIM1_TRG_COM_TIM11_IRQn = 26, /*!< TIM1 Trigger and Commutation Interrupt and TIM11 global interrupt */
& ?7 j1 X3 y2 D) M
% j2 s; i: g2 }5 y6 B- TIM1_CC_IRQn = 27, /*!< TIM1 Capture Compare Interrupt
5 h3 \5 ?& a/ |+ L0 b/ i - + S" ^6 X$ P' Q" n0 V6 N
- TIM1_CC_IRQn = 27, /*!< TIM1 Capture Compare Interrupt */" L' K4 R0 x; V! o& u0 {& X
* S% e( s3 A8 ^# Q4 h- TIM2_IRQn = 28, /*!< TIM2 global Interrupt */. s5 Z7 L! I2 L" v0 g1 w) J9 O
; F/ G- g8 \) H, X7 Q- TIM3_IRQn = 29, /*!< TIM3 global Interrupt */
$ ~% G1 l( T3 |: Y0 U0 t - & z9 r. p( s8 A8 Z: i
- TIM4_IRQn = 30, /*!< TIM4 global Interrupt */
0 R! K4 R2 J# V7 ~/ V8 C0 p# p' L
0 H7 A: T J2 S- I2C1_EV_IRQn = 31, /*!< I2C1 Event Interrupt */- u2 @) p6 i* R0 }/ W8 [7 y
" D. C0 U4 L6 ]. e5 [- I2C1_ER_IRQn = 32, /*!< I2C1 Error Interrupt */
8 i# O, Q7 H4 @' r - * g& ^, u: @' L" w
- I2C2_EV_IRQn = 33, /*!< I2C2 Event Interrupt */
2 R t$ e/ Y4 U; w* P1 M6 j
% G$ {/ C6 @' Q1 A/ m: ^- I2C2_ER_IRQn = 34, /*!< I2C2 Error Interrupt */3 m. s& ^0 Q2 g& A
- 8 @5 b& `0 y+ a3 q, c$ u
- SPI1_IRQn = 35, /*!< SPI1 global Interrupt *// e* ]7 ]' K% J; v
- 1 H5 M3 \ O" ~2 s( u
- SPI2_IRQn = 36, /*!< SPI2 global Interrupt */
; q" n, k! R1 w7 Y
8 E8 u& E! t& J6 A, z- USART1_IRQn = 37, /*!< USART1 global Interrupt */
! U' ~; w/ `# p) R* X7 `0 x. \ N* a5 i
) {9 p- @2 o& ~9 S( @6 m- USART2_IRQn = 38, /*!< USART2 global Interrupt */0 _4 B( g' d# W; @
X b8 M4 H' a0 U3 n- USART3_IRQn = 39, /*!< USART3 global Interrupt */3 w* g4 j. v R; Z! n# G
) Z# M% N: ?5 [- EXTI15_10_IRQn = 40, /*!< External Line[15:10] Interrupts */
$ Y% M3 w0 m7 {
; U, U; |2 h& l' e7 P& I/ o/ [. r- RTC_AlARM_IRQn = 41, /*!< RTC Alarm (A and B) through EXTI Line Interrupt */
" n9 V0 {- J- W4 C - & z9 Y. e# q% G$ h/ M5 ?2 z% ^
- OTG_FS_WKUP_IRQn = 42, /*!< USB OTG FS Wakeup through EXTI line interrupt */" f$ I, R0 @! ?, Y) w( w
- ( U! Y" @, K# a
- TIM8_BRK_TIM12_IRQn = 43, /*!< TIM8 Break Interrupt and TIM12 global interrupt */: C0 G" E/ d$ a' ~& O
- , y% R: a z1 M4 o4 Y/ q+ X+ i
- TIM8_UP_TIM13_IRQn = 44, /*!< TIM8 Update Interrupt and TIM13 global interrupt */( ?% y2 ?% C7 t; |3 }8 }
& r7 h' f) V. F: D! p) ^- TIM8_TRG_COM_TIM14_IRQn = 45, /*!< TIM8 Trigger and Commutation Interrupt and TIM14 global interrupt */
& z* W2 S. o+ j- Y - ! q- o7 ~ q2 v! }6 O# C w
- TIM8_CC_IRQn = 46, /*!< TIM8 Capture Compare Interrupt */6 k0 c- i$ P3 y! @7 {4 S
- 2 i# y; T( M7 O( T8 i
- DMA1_Stream7_IRQn = 47, /*!< DMA1 Stream7 Interrupt */
8 z/ @1 j( B* ?, \+ R3 q
0 u% [% @9 Q3 C$ y* g' }3 g. _- FMC_IRQn = 48, /*!< FMC global Interrupt *// C* S' n2 c, g- `3 P* ~
- 5 ` F% B6 A" M, I4 l! r7 i
- SDIO_IRQn = 49, /*!< SDIO global Interrupt */
+ C8 H; e) Q3 z f# M2 x1 \ - # v1 `5 E* N1 W/ [7 y" U0 y
- TIM5_IRQn = 50, /*!< TIM5 global Interrupt */
: x+ H4 @7 @$ T! \- Y7 z# |. i( G+ w1 _: i
( q. }. a% J1 o9 Q/ O! C, {5 c- SPI3_IRQn = 51, /*!< SPI3 global Interrupt */
& ?: p; K9 H! _2 }4 a% V
- ]7 [# o3 t% R$ y0 Q- UART4_IRQn = 52, /*!< UART4 global Interrupt */
: o9 C, \# B+ ~: m, h/ M9 G$ Y5 P
, n$ w* N/ o; R) w; m$ g- UART5_IRQn = 53, /*!< UART5 global Interrupt */$ L" j* |8 ^- Q3 Q
- 7 M# `* G5 R, q% p4 O
- TIM6_DAC_IRQn = 54, /*!< TIM6 global and DAC1&2 underrun error interrupts */
+ V5 i" E. Y# ?& j3 p) a M
4 q2 X c/ m# @9 _- TIM7_IRQn = 55, /*!< TIM7 global interrupt */6 K# F* u! R$ ]1 k$ i
- # J/ t) ]: i# r1 c
- DMA2_Stream0_IRQn = 56, /*!< DMA2 Stream 0 global Interrupt */$ C$ c4 s" f8 G+ h9 P1 U
& d. E* H# e' N% g+ A' F- @- DMA2_Stream1_IRQn = 57, /*!< DMA2 Stream 1 global Interrupt */
' K, M+ m# A5 J" N7 D0 ~
/ z' i$ K" @- a- C+ d' y7 C- DMA2_Stream2_IRQn = 58, /*!< DMA2 Stream 2 global Interrupt */
& k X& ~3 h W' Y1 l5 N
3 q0 u* q& y3 o+ }/ | Z( E- DMA2_Stream3_IRQn = 59, /*!< DMA2 Stream 3 global Interrupt */: t' \, q+ A6 D$ U- y) U
9 x( D1 g* R' M4 `" ?+ \, C( |- DMA2_Stream4_IRQn = 60, /*!< DMA2 Stream 4 global Interrupt */3 a0 S6 J$ x1 G# i# v' `- V
8 W5 [! ~' A* @# s' V- ETH_IRQn = 61, /*!< Ethernet global Interrupt */
3 o: w) t% `( b2 r' ` - O9 L5 u! h4 _0 h E- V5 J
- ETH_WKUP_IRQn = 62, /*!< Ethernet Wakeup through EXTI line Interrupt */
. s% I5 r! G4 I( ?+ j/ P T - ; ~4 t& e4 [% G8 a8 k- w3 ^) U- C
- CAN2_TX_IRQn = 63, /*!< CAN2 TX Interrupt
% `! G8 W( Y+ G/ m - ! m6 v6 `$ {# w( R* ^
- CAN2_TX_IRQn = 63, /*!< CAN2 TX Interrupt */
, ^; W# M1 q1 k2 ? \. J9 b3 I - 1 H5 Y4 C4 B$ P& K X2 d
- CAN2_RX0_IRQn = 64, /*!< CAN2 RX0 Interrupt */
9 o1 f6 o5 T0 ~* \9 `. G y
$ B+ f c5 n; G) w) n1 x5 Y- CAN2_RX1_IRQn = 65, /*!< CAN2 RX1 Interrupt */
, ?7 M- n% m1 v$ _7 U - + ^( O `! j8 T( z+ _4 B- H2 ?
- CAN2_SCE_IRQn = 66, /*!< CAN2 SCE Interrupt */
7 ^1 T7 N* R. I \! Q* A, C" P - % M) ~* d* x# }2 a( Z
- OTG_FS_IRQn = 67, /*!< USB OTG FS global Interrupt */
+ p) W7 M, r, @- N# G - ( D& V( ?! ]" L' k' z! D1 r- k9 H
- DMA2_Stream5_IRQn = 68, /*!< DMA2 Stream 5 global interrupt */; g, J6 s7 w' |* i2 Y* N& b
0 }# U0 c5 [1 r1 @9 \- DMA2_Stream6_IRQn = 69, /*!< DMA2 Stream 6 global interrupt */
: X5 g5 U3 ]) d, f - 3 ^1 P c* ?* a. B
- DMA2_Stream7_IRQn = 70, /*!< DMA2 Stream 7 global interrupt */
! C1 a. ]0 o* E+ L9 c0 y0 L4 \3 { - ) x) T& ]1 ~! q5 T. J
- USART6_IRQn = 71, /*!< USART6 global interrupt */1 _5 Y' L: c1 l, K
8 a p6 t- C2 ]2 Z* L- I2C3_EV_IRQn = 72, /*!< I2C3 event interrupt */
( p, I# M+ @% B' N. i; T - 1 [0 g: @# Y1 t, q$ E
- I2C3_ER_IRQn = 73, /*!< I2C3 error interrupt */4 W5 t! m7 M9 o! k1 W
- . K; W; v: t) M: b9 Y& ?; o
- OTG_HS_EP1_OUT_IRQn = 74, /*!< USB OTG HS End Point 1 Out global interrupt */
* U! Z+ G0 Z5 b* ~: B: O
: d2 e- c3 Q$ Q- OTG_HS_EP1_IN_IRQn = 75, /*!< USB OTG HS End Point 1 In global interrupt */
& V. P: Q7 J: G1 k4 U$ G
' A) H1 r' D7 E: ?: y* j% Q1 g4 X- OTG_HS_WKUP_IRQn = 76, /*!< USB OTG HS Wakeup through EXTI interrupt */
2 u" C7 `% N- I7 `3 w V8 I( c
/ q7 [% P2 _7 h, i& G4 H: U- OTG_HS_IRQn = 77, /*!< USB OTG HS global interrupt */9 j+ q% S! N2 x$ J
3 P% I+ |8 t E( U. R: I- DCMI_IRQn = 78, /*!< DCMI global interrupt */7 K4 O; x2 B' |6 S
- 0 P. s5 v& M0 \& c! c
- CRYP_IRQn = 79, /*!< CRYP crypto global interrupt */6 ^2 [8 [& Q \7 x" O) _4 p
( M" Q" F) U5 l9 @. N- HASH_RNG_IRQn = 80, /*!< Hash and Rng global interrupt */1 x3 ^: X' D& s7 j& Z7 s
! z# d4 B! o5 U: q& @) t- FPU_IRQn = 81, /*!< FPU global interrupt */- G1 S" @4 q- ]3 d
7 j) `5 C: [4 F& H9 U0 ]# `- UART7_IRQn = 82, /*!< UART7 global interrupt */+ p! {$ r; o c+ j B. {) B2 ^
- , s0 ~$ e7 I# r: `) Y$ Q" l4 S
- UART8_IRQn = 83, /*!< UART8 global interrupt */
8 A M- c2 J1 A/ F2 E9 v' k - & f, `0 |( d4 j
- SPI4_IRQn = 84, /*!< SPI4 global Interrupt */
6 G, U7 |9 `" @- N - 6 H7 h1 W5 Q+ \4 a
- SPI5_IRQn = 85, /*!< SPI5 global Interrupt */0 J( `0 d- q( C( O8 C2 }7 g
, V2 \& t4 R$ h2 n! d2 b W- SPI6_IRQn = 86, /*!< SPI6 global Interrupt */5 t% L1 f/ G6 L2 @" G. {# G$ r
- 0 X; T& Q5 s `' C
- SAI1_IRQn = 87, /*!< SAI1 global Interrupt */
$ o: B* d7 I; f" D3 a! B8 P/ l
9 L: Y5 B Q7 _' b1 W( A5 G2 l# Y- LTDC_IRQn = 88, /*!< LTDC global Interrupt */
: s0 |& E A- Y* z - % M/ X3 M D1 j T- H. W, A* A9 o
- LTDC_ER_IRQn = 89, /*!< LTDC Error global Interrupt */7 k. P* l1 K+ }: \& D, {+ k& v+ m
* E5 |+ P- s7 k, R; t- DMA2D_IRQn = 90 /*!< DMA2D global Interrupt */
) v) A! n. ?9 H, d9 p
2 z) z; V: |" n! c$ W$ ]8 z" P- #endif /* STM32F429_439xx */. ]# S$ L+ q% d) T( h
x. M: O- F8 O& K8 z. c7 m0 D0 X2 f- } IRQn_Type;
复制代码 ; U" b+ a$ S" H! L6 I1 `2 Q
2. NVIC 概述( n0 N. W3 @/ p7 |
NVIC是嵌套向量中断控制器,控制着整个芯片中断相关的功能,它跟内核紧密耦合,是内核里面的一个外设。但是各个芯片厂商在设计芯片的时候会对Cortex-M4内核里面的NVIC进行裁剪,把不需要的部分去掉,所以说STM32的NVIC是Cortex-M4的NVIC的一个子集。
. h8 z7 r: a/ c8 c NVIC结构体定义,来自固件库头文: core_cm4.
0 P9 W. M& ~$ {2 _, e' G 在配置中断的时候我们一般只用ISER、ICER和IP这三个寄存器,ISER用来使能中断,ICER用来失能中断,IP用来设置中断优先级。
9 ]: l. y! T3 E3 T
9 b) p! C0 w2 \) L- /** brief Structure type to access the Nested Vectored Interrupt Controller (NVIC).
: [( u) c% f, d; m. u1 P - : U* [0 h+ T* c8 p: V! i( @
- */
: t0 v$ e7 K6 A8 c$ R1 K9 h! B
6 p- b. g1 g4 g4 A9 r/ i4 r- typedef struct
7 g$ p( d; d# k7 f. E7 H - 6 C$ e/ j. W$ l/ i# j
- {
| Z) N/ d! j8 s; f) t+ T - : d( m2 z$ l$ s! x. S, a) k: B! L! n
- __IO uint32_t ISER[8]; /*!< Offset: 0x000 (R/W) Interrupt Set Enable Register */+ h7 F5 ^7 [5 L% k6 h: l
2 U7 T1 ]* m& N8 g5 p4 }- uint32_t RESERVED0[24];' V: w F. w* N# n
- ) o' `8 p5 _* b V1 Q* \) s
- __IO uint32_t ICER[8]; /*!< Offset: 0x080 (R/W) Interrupt Clear Enable Register */
% Y* x, d1 K+ T( i6 P9 s
: T, Z9 e! t1 N& ^ o- uint32_t RSERVED1[24];
5 G( o( J H c6 a* b* t) r* A K! Z - 1 D, B# \/ j0 y# P
- __IO uint32_t ISPR[8]; /*!< Offset: 0x100 (R/W) Interrupt Set Pending Register */
+ v& G: Y' J/ u% t9 k6 }7 L# d' @
2 M: t0 o2 g; X) Z; q9 _+ Q6 a' _- uint32_t RESERVED2[24];
6 ^' {5 e) N7 c3 }# f8 w) z) H5 x
0 H" S' g2 l9 }5 w- __IO uint32_t ICPR[8]; /*!< Offset: 0x180 (R/W) Interrupt Clear Pending Register */
) L6 }2 G# v9 _9 E4 a' q8 H - $ ^9 ]7 F# [+ [0 [3 `
- uint32_t RESERVED3[24];
8 `2 B) X) p0 u( Y" l5 Z4 c, R3 I - 5 E5 H$ b' v: i6 ^' } m- u- A
- __IO uint32_t IABR[8]; /*!< Offset: 0x200 (R/W) Interrupt Active bit Register */
! `* I. O1 g5 Z6 D: K$ A0 Z& l - _/ F6 Y+ i$ A$ l2 J8 t4 g4 \
- uint32_t RESERVED4[56];' g' {7 [5 B. F( P+ y9 o- y) Z
* f# W) @ d$ h2 x- __IO uint8_t IP[240]; /*!< Offset: 0x300 (R/W) Interrupt Priority Register (8Bit wide) */; m% X& M! C4 h& l- C, P- r M: p
- 6 u' q: s2 l$ z$ Z
- uint32_t RESERVED5[644];, T2 _4 D9 B P* s K# Q; C
) g( C2 L$ _$ L- x" i- __O uint32_t STIR; /*!< Offset: 0xE00 ( /W) Software Trigger Interrupt Register */
9 A% j8 ]) p9 @( @' Y7 i - - S* G$ ^2 |7 ~' i
- } NVIC_Type;
复制代码
, I+ \- K2 h( [& t6 o' m( j* b, A 注:系统异常优先级配置拥有独立于外设优先级配置的寄存器! f5 S7 |* C+ ]" [' o6 @; B
! m- E& \8 y8 G9 r8 R5 \1 f
![]()
6 ~- z( _$ ]" W) U4 _+ K% G% X 3. 中断优先级
; X+ e( ~! \7 I8 g" ]: ~8 K2 K% | 在NVIC 有一个专门的寄存器:中断优先级寄存器NVIC_IPRx(在F429中,x=0...90)用来配置外部中断的优先级,IPR宽度为8bit,原则上每个外部中断可配置的优先级为0~255,数值越小,优先级越高。但是绝大多数CM4芯片都会精简设计,以致实际上支持的优先级数减少,在F429中,只使用了高4bit。( s, s0 E3 \4 D1 @
F429 使用 4bit表达优先级 表达优先级. w) ^" `; K5 {$ T4 }
H4 \7 @% {9 ^4 X. Y6 f5 e ' M6 y7 z8 N2 `4 |* f( o: }
用于表达优先级的这4bit,又被分组成抢占优先级和子优先级。如果有多个中断同时响应,抢占优先级高的就会 抢占 抢占优先级低的优先得到执行,如果抢占优先级相同,就比较子优先级。如果抢占优先级和子优先级都相同的话,就比较他们的硬件中断编号,编号越小,优先级越高。
) G8 G8 _0 r3 }1 S, [! y. o 4. 优先级分组
0 Y# W* O4 {) e2 F5 _4 `4 l 优先级的分组由内核外设SCB的应用程序中断及复位控制寄存器AIRCR的PRIGROUP[10:8]位决定,F429分为了5组,具体如下:主优先级=抢占优先级。
0 g! y( H8 U9 j8 d0 Y4 C) r
3 @2 R1 |5 `3 {" F" }1 ]; S 9 @' E/ u, g# g) ? I e) k. l8 {
设置优先级分组可调用库函数NVIC_PriorityGroupConfig()实现,有关NVIC中断相关的库函数都在库文件misc.c和misc.h中。
4 i4 I7 O; _7 ~! ~ 优先级分组真值表
- Z. Q* K5 _( {& L
9 l, g# n. p' s) a3 ?& @' | [% a v. V: P" x. Y7 N
5. 编程要点( K6 ?: N' d m% w
使能外设某个中断,这个具体由每个外设的相关中断使能位控制
7 l. U2 K; I5 F; _/ l7 q 初始化NVIC_InitTypeDef结构体,配置中断优先级分组,设置抢占优先级和子优先级,使能中断请求
! [1 G; O- l. ]) J 编写中断服务函数,短小精悍。
) s) {! O: h( U4 E! M. P3 M % N7 d) t% h" q0 h
3 }( P( A8 I: z! g7 s) A |
|