使用LL库编程时,发现外设中断即使使能也进不了中断。
1 Y" i' g, a% l& r一般外设都会有自己的寄存器来控制中断的开关,比如ADC 中断使能寄存器 (ADC_IER),但是,将里面相应的位置位后,中断仍然不能相应。
: y4 M( ~5 E, M# i这是因为总的NVIC开关没有打开。这点也好理解。有过STM32开发经验的人都知道,NVIC有开关来控制外设的中断使能。但是在LL库如何实现呢?2 B" P! F7 K4 B4 ?
翻遍了LL库并没有相应的函数。因为NVIC属于CORTEX内核的东西,外设函数是触摸不到的。(而HAL库是有类似的函数的)0 H9 L1 \ s+ G1 ~0 ^ ~, Y
3 @, H" g/ k: A& _: z. g- _
以下是NVIC寄存器
4 f* `2 j7 X" o) C9 ^' x. q. `& v% @
/ C3 F; v, ?- V& S, Q3 K! z9 S) Z
下图是对NVIC操作的函数
6 f" ~9 F: @5 I% p( ~% }' ?- c
. D' j+ `4 ^" B# w( m6 @8 ?! L8 [
: A& ~4 h) \' Y6 [# e8 D. P* w, S6 {下面是各个中断的序号
8 t6 Z. g: v2 n$ g( k) G+ H5 C5 q4 z) Y3 m0 e9 j
- /** @addtogroup Peripheral_interrupt_number_definition
* I' i' z7 z4 q5 s5 o5 {5 f# Z - * @{. Z/ W# ]; B6 R& y# [
- */
! R( p/ O! F5 G# N5 {+ H - 1 d6 v6 T1 @( n. ] U# T( r
- /**3 Q- }" s" e) m# [6 b
- * @brief stm32l011xx Interrupt Number Definition, according to the selected device + ~0 S$ r/ s3 f, a" c
- * in @ref Library_configuration_section
6 H# S9 S0 U0 p3 C9 m9 t - */% ]3 g0 f/ c2 f2 f2 G
- 3 b* c8 O/ e# m0 g; z9 ]
- /*!< Interrupt Number Definition */
0 A$ m- K+ W1 o( ?3 e. c - typedef enum
3 X' P' O, K" t5 G - {, i, a! ]; k3 u0 p) F
- /****** Cortex-M0 Processor Exceptions Numbers ******************************************************/+ D# J; Z" V8 b, v* m
- NonMaskableInt_IRQn = -14, /*!< 2 Non Maskable Interrupt */
4 {3 v2 E1 a1 c7 _" ^ - HardFault_IRQn = -13, /*!< 3 Cortex-M0+ Hard Fault Interrupt */
/ U% `; K0 A) ?7 G8 l+ K - SVC_IRQn = -5, /*!< 11 Cortex-M0+ SV Call Interrupt */
4 }: L( k( S; J* t. k - PendSV_IRQn = -2, /*!< 14 Cortex-M0+ Pend SV Interrupt */% @3 F( o/ C/ H2 ]+ e, k5 M
- SysTick_IRQn = -1, /*!< 15 Cortex-M0+ System Tick Interrupt */5 B) }) j: I# G
& G5 P5 e: I* ]/ i- U- Q- /****** STM32L-0 specific Interrupt Numbers *********************************************************/: S" D: r6 o( N# S6 y& ?5 k: O: C, n
- WWDG_IRQn = 0, /*!< Window WatchDog Interrupt */+ A4 J' A- M6 ?
- PVD_IRQn = 1, /*!< PVD through EXTI Line detect Interrupt */. b9 w! {2 u4 l6 i1 p7 {
- RTC_IRQn = 2, /*!< RTC through EXTI Line Interrupt */
0 r2 [1 V% |. S# N - FLASH_IRQn = 3, /*!< FLASH Interrupt */
! s8 l6 j! U& ^& T( \& i9 d - RCC_IRQn = 4, /*!< RCC Interrupt */8 g7 T5 }. {4 Y+ P5 U
- EXTI0_1_IRQn = 5, /*!< EXTI Line 0 and 1 Interrupts */1 W7 o L4 t P* X2 A
- EXTI2_3_IRQn = 6, /*!< EXTI Line 2 and 3 Interrupts */
" `2 ^1 U/ \7 \! j/ x3 |0 W - EXTI4_15_IRQn = 7, /*!< EXTI Line 4 to 15 Interrupts */
7 D7 n7 X* [; w! a - DMA1_Channel1_IRQn = 9, /*!< DMA1 Channel 1 Interrupt */9 W, R1 ]' D9 k
- DMA1_Channel2_3_IRQn = 10, /*!< DMA1 Channel 2 and Channel 3 Interrupts */
* v/ T: Y! k. j; J8 j, ~) ]/ _ - DMA1_Channel4_5_6_7_IRQn = 11, /*!< DMA1 Channel 4, Channel 5, Channel 6 and Channel 7 Interrupts */ w# q( @0 f* y' F; Q2 N3 e- Z7 u
- ADC1_COMP_IRQn = 12, /*!< ADC1, COMP1 and COMP2 Interrupts */
! T9 Q1 L# @# x, M' b - LPTIM1_IRQn = 13, /*!< LPTIM1 Interrupt */( q9 Q; J; I& y- E$ o) y( p$ t
- TIM2_IRQn = 15, /*!< TIM2 Interrupt */* z# h2 y$ J6 B- b
- TIM21_IRQn = 20, /*!< TIM21 Interrupt */
* |3 C: j7 L) f% D7 Q) m4 ` - I2C1_IRQn = 23, /*!< I2C1 Interrupt */
- q) g; a, E) g6 a3 X/ {1 B) e - SPI1_IRQn = 25, /*!< SPI1 Interrupt */
8 w; T6 X/ [( J% w# q8 N; \/ w7 A$ o - USART2_IRQn = 28, /*!< USART2 Interrupt */
# @* C" ~: @" @! s. @ - LPUART1_IRQn = 29, /*!< LPUART1 Interrupt */
) L3 ]& [, S0 f - } IRQn_Type;
复制代码 % c$ v9 {3 O( y t5 \
例如将ADC1中断使能,除了对ADC1内部的相应中断位(ADC_IER)使能外,还需要使用下列语句才可以:
( ^2 O4 e m& v9 R% N+ @
6 W2 X* A* }" K: ?3 o- S; F7 VNVIC_EnableIRQ(ADC1_COMP_IRQn);9 P, P- B4 q1 L& z% @
& Q4 X: c, l/ z B/ C9 a& G
# @, }3 W" j9 f6 }
* \0 _5 \9 {6 r7 W" t |