使用LL库编程时,发现外设中断即使使能也进不了中断。& Y% V {* G) _- I% p# q! J# Z
一般外设都会有自己的寄存器来控制中断的开关,比如ADC 中断使能寄存器 (ADC_IER),但是,将里面相应的位置位后,中断仍然不能相应。3 D& \. w9 s# \4 t: P- r
这是因为总的NVIC开关没有打开。这点也好理解。有过STM32开发经验的人都知道,NVIC有开关来控制外设的中断使能。但是在LL库如何实现呢?
6 C4 x/ k% ?+ E* ^/ P3 k! A翻遍了LL库并没有相应的函数。因为NVIC属于CORTEX内核的东西,外设函数是触摸不到的。(而HAL库是有类似的函数的)
* A- [: S. T: _# k8 z3 o" \5 S1 d* k! e, P3 y. z" T* ]+ x
以下是NVIC寄存器
! ^* H8 a# S: i3 X; a% ]' a2 {) }. {: ?
. c" y# Q9 R+ g0 e* K6 v& o
( s. @/ E4 s% F$ m. g! q下图是对NVIC操作的函数: M8 I+ }9 Q3 I/ o7 J: ^3 F
. S/ k7 \3 S7 ?% @8 \0 w5 q/ ^
7 F, p/ }* v8 ^4 M7 O+ n
下面是各个中断的序号
: P$ D6 X7 P3 H' H
" V }/ U8 X/ S7 N# o6 z- /** @addtogroup Peripheral_interrupt_number_definition) y! w5 N; s9 s
- * @{( x& M/ e( O2 O* v4 B
- */- I1 Z" Z6 W& _
- ( Z* g" k9 c. x5 P: l: x
- /**$ v! k# W+ ?+ q" r7 f7 ^# Q- @
- * @brief stm32l011xx Interrupt Number Definition, according to the selected device + E6 }, f1 [# X( s
- * in @ref Library_configuration_section 5 Z, G6 C7 ?3 z" c
- */& V [: N8 C& U; I
- x/ k- E/ A, [* N. B- /*!< Interrupt Number Definition */; T4 C y& U T0 l/ T; \3 W
- typedef enum
{6 M1 F# t2 I# F - {
3 W, r0 ^7 B% `! \1 M, s - /****** Cortex-M0 Processor Exceptions Numbers ******************************************************/% R2 i5 b, H: R" d! E. Z& ^( q
- NonMaskableInt_IRQn = -14, /*!< 2 Non Maskable Interrupt */
2 o4 W# B; [/ `3 M* c' Y - HardFault_IRQn = -13, /*!< 3 Cortex-M0+ Hard Fault Interrupt *// K2 @- l+ F( o$ t
- SVC_IRQn = -5, /*!< 11 Cortex-M0+ SV Call Interrupt */* `- t% g+ ]" Z3 N, {
- PendSV_IRQn = -2, /*!< 14 Cortex-M0+ Pend SV Interrupt */
) }( j: Q6 `+ ]3 Z" j9 C: J - SysTick_IRQn = -1, /*!< 15 Cortex-M0+ System Tick Interrupt */
. y1 {. e; J2 C8 b
# v/ V- Q. [4 U, S8 b* e0 V- /****** STM32L-0 specific Interrupt Numbers *********************************************************/
3 X0 g$ L9 W0 o: n7 J1 x5 q - WWDG_IRQn = 0, /*!< Window WatchDog Interrupt */
9 m1 @0 l+ ^( s. k - PVD_IRQn = 1, /*!< PVD through EXTI Line detect Interrupt */3 |+ e L$ A: T
- RTC_IRQn = 2, /*!< RTC through EXTI Line Interrupt */
: n" ?2 H' E3 H' C, o - FLASH_IRQn = 3, /*!< FLASH Interrupt */
5 v7 l; q* T* I: [ - RCC_IRQn = 4, /*!< RCC Interrupt */
- n; r6 T. \$ p+ k: a" g - EXTI0_1_IRQn = 5, /*!< EXTI Line 0 and 1 Interrupts */4 M4 l3 C3 E& R' V
- EXTI2_3_IRQn = 6, /*!< EXTI Line 2 and 3 Interrupts */; e) G2 E' T8 s5 }1 t
- EXTI4_15_IRQn = 7, /*!< EXTI Line 4 to 15 Interrupts */
( @4 }; b; u8 q6 p" r" v* ]0 h" @ - DMA1_Channel1_IRQn = 9, /*!< DMA1 Channel 1 Interrupt */2 D7 @ l' _' \4 g3 _( L
- DMA1_Channel2_3_IRQn = 10, /*!< DMA1 Channel 2 and Channel 3 Interrupts */8 w, s2 {, V6 c5 u
- DMA1_Channel4_5_6_7_IRQn = 11, /*!< DMA1 Channel 4, Channel 5, Channel 6 and Channel 7 Interrupts */
x0 A; _1 L: M) R3 h9 ^ - ADC1_COMP_IRQn = 12, /*!< ADC1, COMP1 and COMP2 Interrupts */: s) K' v W( X
- LPTIM1_IRQn = 13, /*!< LPTIM1 Interrupt */
3 ~6 y, N: ?; d - TIM2_IRQn = 15, /*!< TIM2 Interrupt */6 q9 ~8 `: |8 h
- TIM21_IRQn = 20, /*!< TIM21 Interrupt */ O/ @1 z2 J9 D7 P, v" t
- I2C1_IRQn = 23, /*!< I2C1 Interrupt */4 o# a) M$ j' i @6 {! w
- SPI1_IRQn = 25, /*!< SPI1 Interrupt */
; A0 M' u1 O$ i: b( }4 Y4 g - USART2_IRQn = 28, /*!< USART2 Interrupt */
: @( s2 h. ?) G, Z - LPUART1_IRQn = 29, /*!< LPUART1 Interrupt */
6 |7 d, X# N" A- H, l# D5 X - } IRQn_Type;
复制代码
1 d. n6 s x1 r3 k: u例如将ADC1中断使能,除了对ADC1内部的相应中断位(ADC_IER)使能外,还需要使用下列语句才可以:
/ ^5 s$ U: `6 {& f7 k0 F
4 N; D$ I3 o, NNVIC_EnableIRQ(ADC1_COMP_IRQn);5 N8 g7 k: H& u# I, G
8 A/ i. V+ s$ Q
! `* h! S( A+ L4 B W
5 I8 s5 f; K% I6 U' P
|