使用LL库编程时,发现外设中断即使使能也进不了中断。
; `+ u0 @" j; R一般外设都会有自己的寄存器来控制中断的开关,比如ADC 中断使能寄存器 (ADC_IER),但是,将里面相应的位置位后,中断仍然不能相应。; F8 X; K4 [# {2 b
这是因为总的NVIC开关没有打开。这点也好理解。有过STM32开发经验的人都知道,NVIC有开关来控制外设的中断使能。但是在LL库如何实现呢?; k, w8 q& H Z! Q3 y
翻遍了LL库并没有相应的函数。因为NVIC属于CORTEX内核的东西,外设函数是触摸不到的。(而HAL库是有类似的函数的)! X0 L( w6 X! L L$ l. `
8 e& }' C! t. v7 F
以下是NVIC寄存器1 T& A" I' e% N, T) `- j
$ I& e \; ?' x9 n( K; S+ L! d* k
7 T* o6 t- H8 E- w
下图是对NVIC操作的函数9 K! i4 O* U6 ?! P; k" x
: H6 X8 B. A5 e0 J# h3 y) H
2 J2 O6 \1 b9 ^5 u下面是各个中断的序号
2 |0 \: C3 L7 v, \& z+ m, y& ^. m) S; R. G% Q) _! o8 X* Q4 P7 W5 [
- /** @addtogroup Peripheral_interrupt_number_definition
+ \) Q2 H+ q) B6 D - * @{+ M3 z; g% O8 ?" n" v7 g4 ]
- */4 P' q5 N2 X6 B. l4 {5 h+ D
6 Z( k! U5 g- U; Z' U$ V$ `" r+ K- /**
# f% k# L2 v3 h - * @brief stm32l011xx Interrupt Number Definition, according to the selected device
& [/ @4 L/ \& c, K) j( s* x - * in @ref Library_configuration_section
0 X7 C6 m) Q L6 l - */
- F4 p3 \$ Q$ B8 v - 8 I* \& c7 X7 l4 F7 D% k r% u" P
- /*!< Interrupt Number Definition */
$ u& }; q0 H- }- [$ e6 G- u" E - typedef enum3 U0 E( v6 S# w ?# Y% N
- {
, z3 C. F, f% u" ]: h1 t* b3 w. ? - /****** Cortex-M0 Processor Exceptions Numbers ******************************************************/3 M5 Q6 e( @ I
- NonMaskableInt_IRQn = -14, /*!< 2 Non Maskable Interrupt */0 t o8 R3 }! S7 P7 H- G, S
- HardFault_IRQn = -13, /*!< 3 Cortex-M0+ Hard Fault Interrupt */
( o( {* g; t- w - SVC_IRQn = -5, /*!< 11 Cortex-M0+ SV Call Interrupt */0 u2 H3 J3 f% p. k3 L) p8 n3 _
- PendSV_IRQn = -2, /*!< 14 Cortex-M0+ Pend SV Interrupt */# p# ?' F D5 `
- SysTick_IRQn = -1, /*!< 15 Cortex-M0+ System Tick Interrupt */' C$ h5 q* }& Q( W2 m) M
- " ~7 H) u% ]" ^* ~( R% s
- /****** STM32L-0 specific Interrupt Numbers *********************************************************/
/ r+ t) [2 J6 r9 s0 y2 \: T6 u) { - WWDG_IRQn = 0, /*!< Window WatchDog Interrupt */3 u, a# v( g$ `4 ~8 Z
- PVD_IRQn = 1, /*!< PVD through EXTI Line detect Interrupt */( m6 t! q& V9 C0 t* s, c- B
- RTC_IRQn = 2, /*!< RTC through EXTI Line Interrupt */. ?2 |0 ?; _+ {" G5 \
- FLASH_IRQn = 3, /*!< FLASH Interrupt *// q: q/ f. E! \ t
- RCC_IRQn = 4, /*!< RCC Interrupt */
! ^5 c8 J& t+ b7 z3 | - EXTI0_1_IRQn = 5, /*!< EXTI Line 0 and 1 Interrupts */
2 `5 K( m- f( w7 s5 Y4 S+ O& ^ - EXTI2_3_IRQn = 6, /*!< EXTI Line 2 and 3 Interrupts */
" ]7 ^& ^. Z5 i0 J5 N2 I- ~8 T7 N! H - EXTI4_15_IRQn = 7, /*!< EXTI Line 4 to 15 Interrupts */
. M, H+ L" y# @- t - DMA1_Channel1_IRQn = 9, /*!< DMA1 Channel 1 Interrupt */% C$ M/ ^6 U, l6 t
- DMA1_Channel2_3_IRQn = 10, /*!< DMA1 Channel 2 and Channel 3 Interrupts */
) F2 ?' A8 s F" R" M7 p - DMA1_Channel4_5_6_7_IRQn = 11, /*!< DMA1 Channel 4, Channel 5, Channel 6 and Channel 7 Interrupts */
( V9 G3 C4 Z$ P$ \! @# y - ADC1_COMP_IRQn = 12, /*!< ADC1, COMP1 and COMP2 Interrupts */$ d) W6 O h$ X) T8 S( c7 u
- LPTIM1_IRQn = 13, /*!< LPTIM1 Interrupt */6 F z5 T$ R- c* G) M( F
- TIM2_IRQn = 15, /*!< TIM2 Interrupt */8 {: d* ~ O# s- l1 P+ M3 s; H3 L
- TIM21_IRQn = 20, /*!< TIM21 Interrupt */
" s% Y; X4 R7 M4 D- {- R - I2C1_IRQn = 23, /*!< I2C1 Interrupt */
% ^+ j( @7 y9 \ - SPI1_IRQn = 25, /*!< SPI1 Interrupt */
8 Y3 A$ W- `7 y7 F' s; `5 A/ f0 b( d0 ] - USART2_IRQn = 28, /*!< USART2 Interrupt */, Q, W) s3 K# E" h$ f* L
- LPUART1_IRQn = 29, /*!< LPUART1 Interrupt */' l; R+ @+ V, Q, z
- } IRQn_Type;
复制代码 7 K0 S0 c3 x. |3 }( a3 v. @
例如将ADC1中断使能,除了对ADC1内部的相应中断位(ADC_IER)使能外,还需要使用下列语句才可以:
6 L' z2 F8 g$ q3 \4 g* E/ P( q& D. D* c2 R N* x, C3 o! D
NVIC_EnableIRQ(ADC1_COMP_IRQn);% o2 d$ E; l& {/ h9 ~' h9 s- y. C/ r: r
# j: ?7 ]0 Z. l1 v/ S3 a
5 J0 F4 C# Y% _, d1 P) a7 p- t0 O: i( n
|