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