使用LL库编程时,发现外设中断即使使能也进不了中断。4 q& H* Q+ H3 Z% \# [8 q3 \
一般外设都会有自己的寄存器来控制中断的开关,比如ADC 中断使能寄存器 (ADC_IER),但是,将里面相应的位置位后,中断仍然不能相应。
9 H) K l" i# p$ F& }这是因为总的NVIC开关没有打开。这点也好理解。有过STM32开发经验的人都知道,NVIC有开关来控制外设的中断使能。但是在LL库如何实现呢?
5 C( f, j5 ~* z7 u! K6 O翻遍了LL库并没有相应的函数。因为NVIC属于CORTEX内核的东西,外设函数是触摸不到的。(而HAL库是有类似的函数的)0 ^9 c7 Z, K u& x
! Y- g$ c$ N7 \/ }
以下是NVIC寄存器1 S. G$ F4 F) f
0 _) J/ c9 V* C# k% ^2 I
6 v) s, [* L2 y+ J+ T
9 c! d/ { B) L/ p5 j
下图是对NVIC操作的函数
& ?9 B' l2 E! }$ A
$ ~, M& m E$ G- x' b) k. T4 o1 i
下面是各个中断的序号
: @0 j% [, Z# y% q; p8 _+ q* P0 Y
4 b$ B' a7 x( }& J, \) p' k) N" g* w- /** @addtogroup Peripheral_interrupt_number_definition+ [6 p8 `( L2 ?1 g! ]; E$ S' ~* M2 w
- * @{/ D4 S, b7 b7 p1 t8 I, [( b4 L9 t
- */. x$ \9 A4 H; A& M
+ K8 m. }$ S2 G+ [* X- /**. A, L! ?6 Z: ]. O
- * @brief stm32l011xx Interrupt Number Definition, according to the selected device
0 B. s5 B" V* o$ R$ n - * in @ref Library_configuration_section
% p3 r2 S$ u* @ w% M& ^ - */; U7 L J9 e2 p
6 N+ ]' z& ~! M0 q, M4 U8 M B& {- /*!< Interrupt Number Definition */
1 E- G- W' S) @- o( v4 ] - typedef enum
: Y7 ] w+ c* F; Y; W% T4 ~ - {4 |6 O( V% r/ J" I
- /****** Cortex-M0 Processor Exceptions Numbers ******************************************************/) @0 Q/ R/ C. @4 G
- NonMaskableInt_IRQn = -14, /*!< 2 Non Maskable Interrupt */: x; o/ l- m+ P8 x) P, K
- HardFault_IRQn = -13, /*!< 3 Cortex-M0+ Hard Fault Interrupt */6 D3 e2 l y/ z7 e
- SVC_IRQn = -5, /*!< 11 Cortex-M0+ SV Call Interrupt */ E7 B; {# M+ d6 ^3 h3 w# a' j
- PendSV_IRQn = -2, /*!< 14 Cortex-M0+ Pend SV Interrupt */
1 @- z- d+ M6 y( ?0 S, x8 _7 I - SysTick_IRQn = -1, /*!< 15 Cortex-M0+ System Tick Interrupt */
; C" n3 n4 Q4 V" D
3 a/ |; B3 ?6 v6 P, A- /****** STM32L-0 specific Interrupt Numbers *********************************************************/4 g5 V+ G T( c8 S
- WWDG_IRQn = 0, /*!< Window WatchDog Interrupt */
; R& s' [8 ]1 ~. e4 _ - PVD_IRQn = 1, /*!< PVD through EXTI Line detect Interrupt */3 w3 L) {3 A: }1 [! s
- RTC_IRQn = 2, /*!< RTC through EXTI Line Interrupt */3 E! r/ V/ w$ u
- FLASH_IRQn = 3, /*!< FLASH Interrupt */4 w7 C& N( H: I z% e( P
- RCC_IRQn = 4, /*!< RCC Interrupt */
" s& ~4 ` z7 a# q! G' w4 | - EXTI0_1_IRQn = 5, /*!< EXTI Line 0 and 1 Interrupts */
& K1 t8 w" @4 I( E; X - EXTI2_3_IRQn = 6, /*!< EXTI Line 2 and 3 Interrupts */: z/ z8 ?8 j; T) Y) t$ N+ z
- EXTI4_15_IRQn = 7, /*!< EXTI Line 4 to 15 Interrupts */
* j3 P' Q5 d3 t( I - DMA1_Channel1_IRQn = 9, /*!< DMA1 Channel 1 Interrupt */ R/ O7 z; G! a9 K1 t
- DMA1_Channel2_3_IRQn = 10, /*!< DMA1 Channel 2 and Channel 3 Interrupts */
( v# ^! s4 n& u$ Q( c7 M+ K' @, X - DMA1_Channel4_5_6_7_IRQn = 11, /*!< DMA1 Channel 4, Channel 5, Channel 6 and Channel 7 Interrupts */
# J. C& l9 k+ K; ]7 l. G5 C - ADC1_COMP_IRQn = 12, /*!< ADC1, COMP1 and COMP2 Interrupts */7 i' a: `/ k: ~' G
- LPTIM1_IRQn = 13, /*!< LPTIM1 Interrupt */
9 A, D- [/ ~3 f' V# E1 q - TIM2_IRQn = 15, /*!< TIM2 Interrupt */' u8 M. s8 F% O. ?
- TIM21_IRQn = 20, /*!< TIM21 Interrupt */
' j; {4 w7 q Q1 k, Z8 ]' o - I2C1_IRQn = 23, /*!< I2C1 Interrupt */
( h, ]) }9 C8 e - SPI1_IRQn = 25, /*!< SPI1 Interrupt */
( y: M$ O$ X. ~ - USART2_IRQn = 28, /*!< USART2 Interrupt */5 h" A% {- q# U2 C
- LPUART1_IRQn = 29, /*!< LPUART1 Interrupt */
3 m j! A) G s- R: a4 z - } IRQn_Type;
复制代码
* s$ ], N: D6 ]例如将ADC1中断使能,除了对ADC1内部的相应中断位(ADC_IER)使能外,还需要使用下列语句才可以:
i% ]1 T0 I4 |$ \% B6 t, P0 S' q1 n) V
NVIC_EnableIRQ(ADC1_COMP_IRQn);2 |9 ]6 m8 @ X; A
5 Z- h1 f3 W; M) q U
8 _6 s- _. v& [4 B' u
1 j9 V4 Z8 k. x% @8 n |