|
|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
1. 中断类型% o) B% m; |) E/ t5 I: ?5 t
在此不严格区分中断和异常,即简单的认为中断与异常一个概念。$ z- R6 u$ T0 i; b0 w8 a6 f3 l
M4 内核搭载了异常响应系统,支持众多的系统异常和外部中断。其中,F429芯片,系统异常10个,外部中断91个。除个别异常的优先级固定外,其它均可编程。stm32f4xx.h. c* ]2 r: y, u7 }; ~
7 S# F" {2 l' r, Q/ s- typedef enum IRQn7 P, D" s& ?% r* z& D) U7 D
' Z- o: n; k* K( T2 B$ f- g1 O- {* H& m+ q+ W$ g# ~
- % o8 W' ~1 A; e0 Z# n4 y* o
- /****** Cortex-M4 Processor Exceptions Numbers ****************************************************************/! G& h6 H/ R3 [% Q* _$ Y7 Q1 F. Y
- 7 U$ W* Y0 G) {2 S
- NonMaskableInt_IRQn = -14, /*!< 2 Non Maskable Interrupt */ ?" ~7 f8 X) K' n7 O* e
3 R! {/ [, N4 U, _9 ^- MemoryManagement_IRQn = -12, /*!< 4 Cortex-M4 Memory Management Interrupt */
# j0 n' `5 s$ N8 b/ |1 U% S4 [ - a5 e" J) D# f% t
- BusFault_IRQn = -11, /*!< 5 Cortex-M4 Bus Fault Interrupt */7 ~6 X4 D7 n/ K
& H! @6 `/ J4 z/ n0 g. [- UsageFault_IRQn = -10, /*!< 6 Cortex-M4 Usage Fault Interrupt */
9 b' t" e# j% g8 X - [( m. ~6 d5 _: L
- SVCall_IRQn = -5, /*!< 11 Cortex-M4 SV Call Interrupt */: e( S2 p' T3 `
n5 c' C) l) z4 e: }- DebugMonitor_IRQn = -4, /*!< 12 Cortex-M4 Debug Monitor Interrupt */
9 t' P; d9 t% f8 I- a" j" o a - " \' W3 `# |! e; e' _1 I1 i9 G& I
- PendSV_IRQn = -2, /*!< 14 Cortex-M4 Pend SV Interrupt */
' ?7 `6 [, j6 q v; A. Z$ F* E8 ?
4 T/ V! S: T4 ~# s& g, ~- SysTick_IRQn = -1, /*!< 15 Cortex-M4 System Tick Interrupt */; F4 H- l. x0 A! ~! d
- ) x1 ]1 G3 K1 ~) T. f0 w7 v3 ?
- /****** STM32 specific Interrupt Numbers **********************************************************************/
: G8 R, f: d# O& i0 j$ f - 6 q, Y" Q% c& n H
- WWDG_IRQn = 0, /*!< Window WatchDog Interrupt */) d- r5 p- q2 }, p5 t
2 x% z, h: o- Y, E7 w9 n g3 s- PVD_IRQn = 1, /*!< PVD through EXTI Line detection Interrupt */' u! l$ A( E! \8 W- ` U9 `+ ~
- 0 Y0 j% \) s( w" V/ [
- TAMP_STAMP_IRQn = 2, /*!< Tamper and TimeStamp interrupts through the EXTI line */) X. n0 W; j+ C3 S W3 u
- 0 C& o$ q/ j! |7 `9 B. y5 |
- RTC_WKUP_IRQn = 3, /*!< RTC Wakeup interrupt through the EXTI line */
" f$ v8 A! q5 W7 c, S, d/ f$ a
. N' m& z6 I8 a- e- FLASH_IRQn = 4, /*!< FLASH global Interrupt */. X1 {6 G* K) J5 b i! J3 C. }0 {
1 _6 x1 `1 Y d1 V- o7 }& v* [- RCC_IRQn = 5, /*!< RCC global Interrupt */+ K" a& P5 k. H; `$ q4 O0 p. i
- h0 y- a5 c: S! H0 K
- EXTI0_IRQn = 6, /*!< EXTI Line0 Interrupt */! t9 ^6 j8 e) O* {
- 2 D- V) q3 y R) J. M
- EXTI1_IRQn = 7, /*!< EXTI Line1 Interrupt */, e M: n) V a9 o( \$ M& d+ G% A
- ' ~( I! A" y' a% _4 O, P7 b1 b1 w
- EXTI2_IRQn = 8, /*!< EXTI Line2 Interrupt */9 @ K, J G5 g) K
/ X# R% ~3 T9 ?1 f- EXTI3_IRQn = 9, /*!< EXTI Line3 Interrupt */
3 u, D: A5 V, u0 H' _& Z0 Y5 l) @$ ` - ! R% h& u6 S5 x% I
- EXTI4_IRQn = 10, /*!< EXTI Line4 Interrupt */
+ Q$ C3 S- R' p - , m2 I; [$ ^$ _: |2 M& E- C
- DMA1_Stream0_IRQn = 11, /*!< DMA1 Stream 0 global Interrupt */
9 E4 r l9 V6 x- J0 M! L4 J# F& C; C: U
/ G; V4 \: V8 q: O& P" u! h, s- DMA1_Stream1_IRQn = 12, /*!< DMA1 Stream 1 global Interrupt */: g. l/ E0 Q6 N2 a: u- t" |$ ?% [) I
8 E0 `& U# Q- {2 ~- DMA1_Stream2_IRQn = 13, /*!< DMA1 Stream 2 global Interrupt */
2 ?- ]5 Q& q, _ e) ? - . a% r1 G5 j3 H5 r8 W+ z
- DMA1_Stream3_IRQn = 14, /*!< DMA1 Stream 3 global Interrupt */
4 f2 E# `) g. z. N# g
5 Z$ R- |9 m# C% N# k* H% M4 B- DMA1_Stream4_IRQn = 15, /*!< DMA1 Stream 4 global Interrupt */
& {- K1 D9 R `- N# m; r. H( K
$ U! M! U2 Q. Z- DMA1_Stream5_IRQn = 16, /*!< DMA1 Stream 5 global Interrupt */
% _6 v: D* U+ S) @6 P - / M# l$ I: q8 F; a L
- DMA1_Stream6_IRQn = 17, /*!< DMA1 Stream 6 global Interrupt */8 t1 i: n; L4 O) K# Q$ D* \
; q) a1 R; t! D' X; ?- ADC_IRQn = 18, /*!< ADC1, ADC2 and ADC3 global Interrupts */2 E% H0 ?" I% x2 l5 Y" t$ x/ |4 U
- ) T" R5 O, v4 Q$ D0 V3 _& ?* T
- #if defined(STM32F429_439xx)) @, f: u4 N! N) N
- 5 o! \# d" s- F' _3 O
- CAN1_TX_IRQn = 19, /*!< CAN1 TX Interrupt */
1 Q7 X# C' e0 |% H. @- O/ g
* n2 V* Q5 H3 f+ X- CAN1_RX0_IRQn = 20, /*!< CAN1 RX0 Interrupt */
+ q5 B, _$ D" o7 p* G- i) M
2 g9 Z' y! Z$ H3 |2 Y- CAN1_RX1_IRQn = 21, /*!< CAN1 RX1 Interrupt */
1 @! g; S9 |4 M8 ^ B - $ _4 {1 G' b# ?4 S1 A
- CAN1_SCE_IRQn = 22, /*!< CAN1 SCE Interrupt */
T( C" I( b; v6 V; n - - j& C a8 i, K9 }" q7 B
- EXTI9_5_IRQn = 23, /*!< External Line[9:5] Interrupts */
& P! s2 N* I% h Y3 F* G7 B% N
3 C' y- B& F8 `4 J+ B/ g- TIM1_BRK_TIM9_IRQn = 24, /*!< TIM1 Break interrupt and TIM9 global interrupt */
" G! o \2 M# t* A1 ]6 M - 0 R( C; ]2 V" B
- TIM1_UP_TIM10_IRQn = 25, /*!< TIM1 Update Interrupt and TIM10 global interrupt */- @7 b b, g9 r, m7 P4 U) |8 b
- 5 O6 o W7 G$ D3 N) O# Q9 v
- TIM1_TRG_COM_TIM11_IRQn = 26, /*!< TIM1 Trigger and Commutation Interrupt and TIM11 global interrupt */
; q- @5 j& f9 }, d& Z+ `3 l2 [- Q* ?9 b - + Q5 v1 u2 E/ [& g! K
- TIM1_CC_IRQn = 27, /*!< TIM1 Capture Compare Interrupt9 m4 O: h7 \0 F: b/ t ~3 n
- . W: C/ @4 o$ y1 y1 Y' D
- TIM1_CC_IRQn = 27, /*!< TIM1 Capture Compare Interrupt */. ^% f3 _( l( |
- % h9 e9 ^# L1 H# _) g# `" j
- TIM2_IRQn = 28, /*!< TIM2 global Interrupt */
7 R$ `3 B$ r5 f" V& g7 M6 V6 u - - {1 u. e7 G4 ` r. S
- TIM3_IRQn = 29, /*!< TIM3 global Interrupt */
: ~# P3 f3 w6 ^( S, C
4 _. V2 u' A& q" G4 G& i- TIM4_IRQn = 30, /*!< TIM4 global Interrupt */
& D8 q( \# J# @# H( @1 o
) Q: M2 H# v3 }- I2C1_EV_IRQn = 31, /*!< I2C1 Event Interrupt */) a. m4 H9 V! y* q; K; S: C# H1 I
* O, K& y+ e" s7 i: Z- I2C1_ER_IRQn = 32, /*!< I2C1 Error Interrupt */. d8 ], ^( g! q# J8 ~$ }
8 d2 \ T1 F8 g4 L6 d- I2C2_EV_IRQn = 33, /*!< I2C2 Event Interrupt */2 D3 x m( T6 k: g! ?: N# C
' Z/ g: L G) Z1 a# M0 ]; o" \7 n6 I- I2C2_ER_IRQn = 34, /*!< I2C2 Error Interrupt */, c' {* u( Q- N9 j
- + F4 i/ _' \, K2 T) J5 _
- SPI1_IRQn = 35, /*!< SPI1 global Interrupt */3 y4 k7 Z, y! q6 {3 B' _1 c: C
- ; `) W# B" Q3 D; L9 u. V a
- SPI2_IRQn = 36, /*!< SPI2 global Interrupt */! a7 L- L( K/ K2 o& C3 v
, M! ~0 V5 W# u: H5 i- USART1_IRQn = 37, /*!< USART1 global Interrupt */
0 ~/ C7 U# l a - , W, r1 i( f4 S. `6 U
- USART2_IRQn = 38, /*!< USART2 global Interrupt */
* u# Z7 J/ V& ?6 Y
5 u7 g! m+ N5 ?/ g% W- USART3_IRQn = 39, /*!< USART3 global Interrupt */' O2 A" j* B" c# H h' [* N8 ~
- " Q. @6 t. K8 F) T& `$ P
- EXTI15_10_IRQn = 40, /*!< External Line[15:10] Interrupts */+ ~0 S3 e& g& m* R2 q* s8 a# A
2 F3 T! Z2 j8 |: S" a8 s- RTC_AlARM_IRQn = 41, /*!< RTC Alarm (A and B) through EXTI Line Interrupt */
; G" `" q: h: E7 H - 3 a6 E: ?$ A) L Q9 `
- OTG_FS_WKUP_IRQn = 42, /*!< USB OTG FS Wakeup through EXTI line interrupt */* H7 ?' ? s9 O& o' U- V$ @, H
- ; E7 Q( x% y: c5 M! e1 D* z
- TIM8_BRK_TIM12_IRQn = 43, /*!< TIM8 Break Interrupt and TIM12 global interrupt */
- Q" ~: G+ H! c( R, u
~! n5 V3 l6 A3 s6 V& }; |- TIM8_UP_TIM13_IRQn = 44, /*!< TIM8 Update Interrupt and TIM13 global interrupt */
. `' q% C2 c% U" b- T
5 n* h6 H8 Z9 v! \! ~4 i. J+ }- TIM8_TRG_COM_TIM14_IRQn = 45, /*!< TIM8 Trigger and Commutation Interrupt and TIM14 global interrupt */ r, z9 F; U: {2 s" S1 n- l3 H
- . M8 s& N+ W$ l0 s
- TIM8_CC_IRQn = 46, /*!< TIM8 Capture Compare Interrupt */! p6 j0 R+ i: l* n. ]0 q+ b* U
- - b# H! T8 u- A5 \, o
- DMA1_Stream7_IRQn = 47, /*!< DMA1 Stream7 Interrupt */
. i7 O3 B3 N- C5 \$ V2 c! E
( v" W1 H$ ~' ^. f: S8 V- FMC_IRQn = 48, /*!< FMC global Interrupt */! p' N3 S$ [9 \
- ( L" j, P/ f6 F2 R* t
- SDIO_IRQn = 49, /*!< SDIO global Interrupt */
/ k% x) e' Q8 s% X
0 u% B2 {; \0 P3 U; W2 E/ U- TIM5_IRQn = 50, /*!< TIM5 global Interrupt */, B. C( m% ~0 u1 J' Z) y! f
- & W' d6 L; _- [! s3 F9 b$ R
- SPI3_IRQn = 51, /*!< SPI3 global Interrupt */! R; n: G% S9 S$ F: d3 O- x
- 4 x. {& S+ P+ \7 N+ N: D
- UART4_IRQn = 52, /*!< UART4 global Interrupt */0 q `- A# {; a. E7 F) q' P: D& K
# I) @ F* @; T3 ~( V' t, B- O- UART5_IRQn = 53, /*!< UART5 global Interrupt */% r* t4 q2 V- l" K" }& D
- ?3 q9 v( h" `6 j8 r6 G1 l- TIM6_DAC_IRQn = 54, /*!< TIM6 global and DAC1&2 underrun error interrupts */, Y* F3 _0 j1 H* s! ` t
+ S2 ]7 l+ i5 N/ K+ b ]- H$ B7 V8 R- TIM7_IRQn = 55, /*!< TIM7 global interrupt */! t& K2 S( n. k
- 8 z' V8 {. i) ?# r% @
- DMA2_Stream0_IRQn = 56, /*!< DMA2 Stream 0 global Interrupt */
( Z" F! _, c. i; L, ?
' e1 S1 T: d g. A6 X6 z: Q- DMA2_Stream1_IRQn = 57, /*!< DMA2 Stream 1 global Interrupt */
6 D" f0 q6 a+ \5 S, J2 } - , o. Q8 Y3 y: J u% l
- DMA2_Stream2_IRQn = 58, /*!< DMA2 Stream 2 global Interrupt */
' n, l4 G7 D0 V - . h, g1 d5 p6 u% s6 g
- DMA2_Stream3_IRQn = 59, /*!< DMA2 Stream 3 global Interrupt */+ [: k5 W2 t" ~3 |! S% e5 _" Z
8 h" ^* P& a2 v6 u' ^1 G$ d- DMA2_Stream4_IRQn = 60, /*!< DMA2 Stream 4 global Interrupt */- M; e! @1 {( K: u1 U' k
- 2 U# J+ o: B5 k
- ETH_IRQn = 61, /*!< Ethernet global Interrupt */( v1 @; {8 D9 V( c t Z y
- ; D5 F8 ], r2 h7 l) Q1 S# s, T
- ETH_WKUP_IRQn = 62, /*!< Ethernet Wakeup through EXTI line Interrupt */6 O1 k- { W: ^8 E. i1 K8 h# ^
- 5 m/ T/ B# p q6 \ f6 {( j1 w2 a
- CAN2_TX_IRQn = 63, /*!< CAN2 TX Interrupt' V. t x5 V& u3 k) e8 z: \
- & f" m& y U4 S% {6 k& B, }
- CAN2_TX_IRQn = 63, /*!< CAN2 TX Interrupt */
7 B7 L1 C# O" I! [ - 7 A5 Q L- K5 _# T2 ^0 c
- CAN2_RX0_IRQn = 64, /*!< CAN2 RX0 Interrupt */
( P3 W1 }, H8 j% B, H& t - 3 L' O7 u2 ~- }. B# D4 W# W
- CAN2_RX1_IRQn = 65, /*!< CAN2 RX1 Interrupt */
3 ^3 m; o* p7 y4 [
4 C1 ?7 I( [, {' N0 K7 I- CAN2_SCE_IRQn = 66, /*!< CAN2 SCE Interrupt */
4 {9 U, k1 q" W$ ]" ~
# H3 B0 {7 t$ G: D# a; a1 Z2 _/ S- OTG_FS_IRQn = 67, /*!< USB OTG FS global Interrupt */
0 _5 b0 G/ q" Y/ f% E8 {8 G - 4 }5 y3 t' m/ s! w- g6 v; ]3 K9 \
- DMA2_Stream5_IRQn = 68, /*!< DMA2 Stream 5 global interrupt */
. D. t( M; }. Y# S9 @ - 4 q- b2 d: L9 J8 Z4 f; W' _
- DMA2_Stream6_IRQn = 69, /*!< DMA2 Stream 6 global interrupt */, \' m$ ^ ]8 {! e% U: l0 q: B
& m' E/ ~) @% p- DMA2_Stream7_IRQn = 70, /*!< DMA2 Stream 7 global interrupt *// `! d( Q7 g: {. J" V
9 P' e% z8 r% @- Q; q- USART6_IRQn = 71, /*!< USART6 global interrupt */
, Y: l) k0 e0 [* o; a - 4 N; C& D% I" ]5 o7 E
- I2C3_EV_IRQn = 72, /*!< I2C3 event interrupt */
+ P2 u7 L* g& f$ R h! V - , N) B, }# E$ {; s
- I2C3_ER_IRQn = 73, /*!< I2C3 error interrupt */# o4 \ l+ H0 `+ P+ e
- 1 G1 p. }6 c' p, g
- OTG_HS_EP1_OUT_IRQn = 74, /*!< USB OTG HS End Point 1 Out global interrupt */
2 L& h( u3 X* T: L( w; I) s - + ?, o* i$ }8 [3 c4 l) E& k
- OTG_HS_EP1_IN_IRQn = 75, /*!< USB OTG HS End Point 1 In global interrupt */
) f6 V" {+ q" ? _1 Q1 n8 J( G - 7 f$ Q1 n2 |# ~! O) S
- OTG_HS_WKUP_IRQn = 76, /*!< USB OTG HS Wakeup through EXTI interrupt */8 ^2 b& F7 p$ C0 T) T
- / @# A# u3 a0 ]
- OTG_HS_IRQn = 77, /*!< USB OTG HS global interrupt */
' E' [8 d% D1 |: C
3 d/ V, `7 B4 }1 j* a* p0 Q- DCMI_IRQn = 78, /*!< DCMI global interrupt */
$ P( @$ M% O" c, t# M* q+ N; Q. _
, d$ n( p# W# j" B0 r4 C" N- CRYP_IRQn = 79, /*!< CRYP crypto global interrupt */0 R/ I2 F+ w- J. j
- 8 Q6 y/ r/ k) `& I* x
- HASH_RNG_IRQn = 80, /*!< Hash and Rng global interrupt */
' L2 g: ^% w+ n! { ]/ T - ! H0 t e: r9 r' b8 Y4 E h
- FPU_IRQn = 81, /*!< FPU global interrupt */
( ]- A% Y# O' F' J& ?& e* ^5 G - 1 T# `% \% G+ L& x# ~ x
- UART7_IRQn = 82, /*!< UART7 global interrupt */1 ^+ V, `; D( b7 V5 b; V$ i! _9 S
- * k8 N4 K& t3 }5 f; `+ P E7 V3 C
- UART8_IRQn = 83, /*!< UART8 global interrupt */
) _) C. }( ?% q7 A# V6 i! ^ - 8 k& W1 v& p1 Q) A! D/ A) u
- SPI4_IRQn = 84, /*!< SPI4 global Interrupt */! \5 D- `' J1 N g" l- F% U8 x& b
- 2 C: S2 h0 K8 |8 G* j/ d. _% o
- SPI5_IRQn = 85, /*!< SPI5 global Interrupt */
$ o' F4 s" f6 l7 o: p0 k! ~ - ! e. U6 F/ W) K0 T2 g; D0 c+ r X
- SPI6_IRQn = 86, /*!< SPI6 global Interrupt */
3 b, s3 ]; O3 H7 k, J Q - , ~: G0 p4 I" t# R
- SAI1_IRQn = 87, /*!< SAI1 global Interrupt */- _, m' W2 @ o, `' V8 W) J
- ) G& C6 G$ `" q+ r6 ]" a
- LTDC_IRQn = 88, /*!< LTDC global Interrupt */( C: n4 y6 R" I$ Y
! u7 k4 \2 {( A2 z# h. D- LTDC_ER_IRQn = 89, /*!< LTDC Error global Interrupt */& _( H& d5 H+ Z! J% C- e, F
- 0 \4 ]8 M' o4 S# K+ Q$ M- y9 F5 n
- DMA2D_IRQn = 90 /*!< DMA2D global Interrupt */
" z5 f- ^3 [4 B- g) Z4 A - / P8 H4 C* [- e
- #endif /* STM32F429_439xx */
* ^" a/ q7 p0 D. Q& p! Z
$ e2 r% o- [- Q: D: m- } IRQn_Type;
复制代码
' H& T- S* O! H3 ?) K |9 K. W, M 2. NVIC 概述
\5 a2 z3 u. q& D NVIC是嵌套向量中断控制器,控制着整个芯片中断相关的功能,它跟内核紧密耦合,是内核里面的一个外设。但是各个芯片厂商在设计芯片的时候会对Cortex-M4内核里面的NVIC进行裁剪,把不需要的部分去掉,所以说STM32的NVIC是Cortex-M4的NVIC的一个子集。
) I% E; G/ t# x- h. P P/ U- @ NVIC结构体定义,来自固件库头文: core_cm4.
( O$ s# Q5 s R( i- E3 x 在配置中断的时候我们一般只用ISER、ICER和IP这三个寄存器,ISER用来使能中断,ICER用来失能中断,IP用来设置中断优先级。6 k0 u2 i5 P& u7 R
$ D! h+ {; c$ |- b
- /** brief Structure type to access the Nested Vectored Interrupt Controller (NVIC).& _: N# Z% O8 c: [, @
- 3 i- [, T ^+ ^& m* `: z2 U) L
- */2 ~0 W0 o+ D) R, i; d' `) |
' D; B3 u8 w; M- typedef struct( N* X, |4 w8 g5 b) N" m# s) P
" O/ ~! h! ?- I0 B% X- {
: Q' ] y0 N% b6 b" i
5 v& s% Q+ R, y4 P8 T" V% T- __IO uint32_t ISER[8]; /*!< Offset: 0x000 (R/W) Interrupt Set Enable Register */0 j& S: f( @' V! v) a
- ; s4 r( e1 ?- F s% _# _' J! R
- uint32_t RESERVED0[24];
% s, i8 R1 k! f; m( n' H) H: E
) r8 I' y1 ]' s1 G1 ?5 K8 U$ f2 v4 p- __IO uint32_t ICER[8]; /*!< Offset: 0x080 (R/W) Interrupt Clear Enable Register *// S3 t8 j' m: M" o' Q
+ Z2 d( U c0 [+ v2 Z) C- uint32_t RSERVED1[24];
+ c; P7 R. S1 E3 v
. h8 ?# P) f- t- __IO uint32_t ISPR[8]; /*!< Offset: 0x100 (R/W) Interrupt Set Pending Register */
1 `1 v `4 _5 t2 J
7 I: l) V/ W# ~6 }, H1 U1 S- uint32_t RESERVED2[24];
0 l5 e; Z0 }# r& N- F - & ]3 V6 ~% ~2 E0 [
- __IO uint32_t ICPR[8]; /*!< Offset: 0x180 (R/W) Interrupt Clear Pending Register */7 m3 {' S# `& x+ C9 r% o$ t
# Q. Q* x( D1 }8 R m( [- uint32_t RESERVED3[24];
7 P6 Q; M" D0 _6 B) {
+ r+ X( O: j% e' O- __IO uint32_t IABR[8]; /*!< Offset: 0x200 (R/W) Interrupt Active bit Register */
9 o, A" ~: L$ o/ X+ B( {+ w
- J6 a) r7 b5 ~7 X- j2 e- Y# V- uint32_t RESERVED4[56];5 R6 Y9 c% A: p# k; N/ @+ ^
5 q: H1 _5 J3 r. }2 \0 g- __IO uint8_t IP[240]; /*!< Offset: 0x300 (R/W) Interrupt Priority Register (8Bit wide) */
/ l2 Y# D8 R2 [" ]$ h$ c* s - $ G+ H4 Q% [+ m& o
- uint32_t RESERVED5[644];
( l! o5 v1 J- y+ [. h$ b# f& N1 T - . u7 H. Z0 [+ q0 G4 u
- __O uint32_t STIR; /*!< Offset: 0xE00 ( /W) Software Trigger Interrupt Register */
# i) z# ^2 z3 k. b( S+ \ - , }7 x) @! A5 o' D! q- j$ G ^
- } NVIC_Type;
复制代码
' K, v) @4 T- T, l: j 注:系统异常优先级配置拥有独立于外设优先级配置的寄存器
) O% l: l& m6 E! n5 m' r5 A- s( A u
![]()
( J% s3 ~4 n- u# Q" g' R. N 3. 中断优先级
0 H6 s0 d" {# i; X# |- v0 X6 U, ] 在NVIC 有一个专门的寄存器:中断优先级寄存器NVIC_IPRx(在F429中,x=0...90)用来配置外部中断的优先级,IPR宽度为8bit,原则上每个外部中断可配置的优先级为0~255,数值越小,优先级越高。但是绝大多数CM4芯片都会精简设计,以致实际上支持的优先级数减少,在F429中,只使用了高4bit。: h3 f1 a6 _4 j4 Z
F429 使用 4bit表达优先级 表达优先级
! F3 w; ~% A0 `4 U7 E: x7 p! ^' T) R
![]()
! v- d- E8 B2 N 用于表达优先级的这4bit,又被分组成抢占优先级和子优先级。如果有多个中断同时响应,抢占优先级高的就会 抢占 抢占优先级低的优先得到执行,如果抢占优先级相同,就比较子优先级。如果抢占优先级和子优先级都相同的话,就比较他们的硬件中断编号,编号越小,优先级越高。2 h8 c" ]. d, C
4. 优先级分组
- l6 p) c+ D& \: A* R; e2 j9 ` 优先级的分组由内核外设SCB的应用程序中断及复位控制寄存器AIRCR的PRIGROUP[10:8]位决定,F429分为了5组,具体如下:主优先级=抢占优先级。
; ?; O; ~! v* q/ j, N
5 h: c# A) P- U- {7 N0 G# R* B+ s) p- x![]()
- V5 I: C F# A$ O6 O9 w3 u 设置优先级分组可调用库函数NVIC_PriorityGroupConfig()实现,有关NVIC中断相关的库函数都在库文件misc.c和misc.h中。
: W. a' B$ B! c8 w8 t2 @* R! X 优先级分组真值表
_! P1 W1 O F, S7 A- A( w+ X
% A* C# O0 U- U5 q![]()
. r6 V- `, g- L0 T) W, V* r- q$ a) ~8 c 5. 编程要点$ d, b- A: S9 v9 V6 l7 `* s
使能外设某个中断,这个具体由每个外设的相关中断使能位控制
8 V: Z8 Z6 L* h9 o# f( V4 T1 m 初始化NVIC_InitTypeDef结构体,配置中断优先级分组,设置抢占优先级和子优先级,使能中断请求
) q' `, E0 \, ?$ m9 X | q 编写中断服务函数,短小精悍。8 R# q9 V$ m. M6 L0 g
0 X. x% v9 _5 f2 Q( f$ q7 r , |. {, x1 Q; U i$ Z* V" f( A
|
|