使用LL库编程时,发现外设中断即使使能也进不了中断。5 B- b+ s2 }+ y" ?6 H7 k' M+ V
一般外设都会有自己的寄存器来控制中断的开关,比如ADC 中断使能寄存器 (ADC_IER),但是,将里面相应的位置位后,中断仍然不能相应。2 g ^ F8 J: h6 y' r, |' B
这是因为总的NVIC开关没有打开。这点也好理解。有过STM32开发经验的人都知道,NVIC有开关来控制外设的中断使能。但是在LL库如何实现呢?+ a: Q( z+ Y1 C" f4 `
翻遍了LL库并没有相应的函数。因为NVIC属于CORTEX内核的东西,外设函数是触摸不到的。(而HAL库是有类似的函数的)5 n5 l" `3 U7 B) Z+ e* g
5 Q: {3 @+ u: R; g, Y$ x% J以下是NVIC寄存器# s% t- @; W& i3 O$ n! @; o- d
3 `* e' y4 j a1 h
7 y% x& O6 w1 H* ^
, @/ O/ X6 p B# n: g2 Q4 t4 G
下图是对NVIC操作的函数
4 ]+ x3 W6 d9 l! X) f4 B! H7 o2 P8 t" c# @3 I( `: W8 H. `
0 ]- U; g( s9 J. D
下面是各个中断的序号
F# y# p- X& W. s8 X6 D2 k8 t3 F X/ ], r1 z' I$ E5 j
- /** @addtogroup Peripheral_interrupt_number_definition
1 M! f8 y1 h: U0 x; ^, D, N/ h$ J - * @{4 F. x9 _5 ^. m1 o$ l$ B
- */
& A; r* _8 d' ^6 Z0 ^" B0 _: g - / v/ Q1 r+ T% P6 E9 g& ]
- /**/ M( f# M3 _' A3 N
- * @brief stm32l011xx Interrupt Number Definition, according to the selected device , e4 X$ U$ n2 K/ b
- * in @ref Library_configuration_section
& j8 N8 ^$ G" z/ v& p+ f - */
3 g8 c, s- ]9 x6 m3 Y5 F - . E4 x }- L/ F# Y k; |- O9 W
- /*!< Interrupt Number Definition */
+ [% R [, a: N9 d' }: M - typedef enum, m, y0 N. W+ K: q! t2 x! u
- {5 D6 ?7 | ]. d0 p; Y
- /****** Cortex-M0 Processor Exceptions Numbers ******************************************************/+ E; @6 ]9 p5 \. y# h
- NonMaskableInt_IRQn = -14, /*!< 2 Non Maskable Interrupt */
7 ~/ G/ P+ B3 ~7 e' z4 d - HardFault_IRQn = -13, /*!< 3 Cortex-M0+ Hard Fault Interrupt */: R+ i" B( s" Q% p5 I4 r* u
- SVC_IRQn = -5, /*!< 11 Cortex-M0+ SV Call Interrupt */
: _" P* {! o" ` G - PendSV_IRQn = -2, /*!< 14 Cortex-M0+ Pend SV Interrupt */' d) C9 d* ~3 D7 p
- SysTick_IRQn = -1, /*!< 15 Cortex-M0+ System Tick Interrupt */4 }; O7 l; E( \; s$ ?' K6 s
% l& _! y; z5 D2 s- /****** STM32L-0 specific Interrupt Numbers *********************************************************/
" `& H1 N- i% h9 N# h - WWDG_IRQn = 0, /*!< Window WatchDog Interrupt */$ D" t! y! s9 j6 L Z
- PVD_IRQn = 1, /*!< PVD through EXTI Line detect Interrupt */* |, w2 K1 ?; m5 i$ v5 H% C/ i
- RTC_IRQn = 2, /*!< RTC through EXTI Line Interrupt */0 X5 t5 G* R9 p2 g( k" p0 l8 D
- FLASH_IRQn = 3, /*!< FLASH Interrupt */
* u; @' q2 [+ m5 N - RCC_IRQn = 4, /*!< RCC Interrupt */3 W0 @: I& f' a+ d D: f o8 w
- EXTI0_1_IRQn = 5, /*!< EXTI Line 0 and 1 Interrupts */
) {3 {! p* B* F- s$ M2 Q - EXTI2_3_IRQn = 6, /*!< EXTI Line 2 and 3 Interrupts */& B, Y8 h; C% Z: D i a2 t
- EXTI4_15_IRQn = 7, /*!< EXTI Line 4 to 15 Interrupts */
; t0 M$ |* S9 a( G - DMA1_Channel1_IRQn = 9, /*!< DMA1 Channel 1 Interrupt */" p# `: g N2 {" H* X. B
- DMA1_Channel2_3_IRQn = 10, /*!< DMA1 Channel 2 and Channel 3 Interrupts */7 S: B5 ~" t$ L' y
- DMA1_Channel4_5_6_7_IRQn = 11, /*!< DMA1 Channel 4, Channel 5, Channel 6 and Channel 7 Interrupts */
( @5 Z) W9 C/ N% g - ADC1_COMP_IRQn = 12, /*!< ADC1, COMP1 and COMP2 Interrupts */
/ l9 j) K% b! V$ f - LPTIM1_IRQn = 13, /*!< LPTIM1 Interrupt */
/ ?/ N) S! D: M% @2 g/ y - TIM2_IRQn = 15, /*!< TIM2 Interrupt */
- ?+ S2 I5 @4 R - TIM21_IRQn = 20, /*!< TIM21 Interrupt */2 G# f) b6 \. F1 R, W' o
- I2C1_IRQn = 23, /*!< I2C1 Interrupt */6 v7 B% u2 g6 {3 e" t) A$ n2 y
- SPI1_IRQn = 25, /*!< SPI1 Interrupt */
) t: U# w7 a+ R6 F9 S0 ? - USART2_IRQn = 28, /*!< USART2 Interrupt */
* g. p% K9 m$ m1 W) I: C. K - LPUART1_IRQn = 29, /*!< LPUART1 Interrupt */: v/ O, O4 G- |3 p
- } IRQn_Type;
复制代码 . A4 i! s$ Z. o' q/ x7 v" m' |1 `
例如将ADC1中断使能,除了对ADC1内部的相应中断位(ADC_IER)使能外,还需要使用下列语句才可以:' J( b8 M4 _+ Q L& B3 v$ w
! @, O9 B4 f1 w5 H8 g: n4 RNVIC_EnableIRQ(ADC1_COMP_IRQn);/ i& z9 N% n0 ^1 d0 C! C
6 A, Q0 G+ W$ _ K2 u
- O5 s* C& _, z" Z; h" n) _2 l
/ _" u; @0 ?( o |