使用LL库编程时,发现外设中断即使使能也进不了中断。9 C1 L$ ~8 ~. z" J5 D
一般外设都会有自己的寄存器来控制中断的开关,比如ADC 中断使能寄存器 (ADC_IER),但是,将里面相应的位置位后,中断仍然不能相应。* W5 y2 J# `- H& C' B+ k- s
这是因为总的NVIC开关没有打开。这点也好理解。有过STM32开发经验的人都知道,NVIC有开关来控制外设的中断使能。但是在LL库如何实现呢?
! ~9 T9 a) r% O7 O翻遍了LL库并没有相应的函数。因为NVIC属于CORTEX内核的东西,外设函数是触摸不到的。(而HAL库是有类似的函数的)3 s* O" W( I8 p7 C$ f0 [" |
& o% y# y$ T4 W- {) j; f以下是NVIC寄存器
" ?3 t, Q# N0 H
* h8 `4 Y4 P( W/ L" w6 G0 a. I4 T) Z1 ^& Q6 ~
6 t. `6 S5 {6 c: d7 G
下图是对NVIC操作的函数: J8 F8 s3 {7 L7 H7 |
& X) z1 Y/ m& `- v0 C0 H! U1 ?& I$ N2 I" ]
下面是各个中断的序号4 Q. o- q1 S: E0 m& X( {5 x8 }$ h
2 C* D# b' i$ {
- /** @addtogroup Peripheral_interrupt_number_definition
& R; M5 _! \1 I' i4 f, [ - * @{
" B/ D6 {" V% \1 f - */( V7 Y- ], {! V) {4 c: i d
/ C9 ^6 u8 x" A! O$ z- /**
+ z6 s! Z2 h' r: m4 ? - * @brief stm32l011xx Interrupt Number Definition, according to the selected device 7 j I# _6 J$ @" b6 }2 B
- * in @ref Library_configuration_section
; R9 a+ h. r0 ]0 r$ ~. `( h7 f - */
# T5 G* s0 u* Y0 E6 J' N/ N
. \! `9 P- L( [! o- /*!< Interrupt Number Definition */- x+ x2 u$ J; N7 M7 P, u
- typedef enum
% p2 W) X6 ~1 @3 [; Y# |( d/ ~ - {
1 b1 a5 ?( m0 o% r' C0 j" ] - /****** Cortex-M0 Processor Exceptions Numbers ******************************************************/- T' K# W8 g& h
- NonMaskableInt_IRQn = -14, /*!< 2 Non Maskable Interrupt */
2 R# ]! o3 G1 Z4 h( e - HardFault_IRQn = -13, /*!< 3 Cortex-M0+ Hard Fault Interrupt *// b7 S/ q/ e. ^; \1 m
- SVC_IRQn = -5, /*!< 11 Cortex-M0+ SV Call Interrupt */1 p" t2 `& y i4 M3 t& x* _" q; ?
- PendSV_IRQn = -2, /*!< 14 Cortex-M0+ Pend SV Interrupt */8 Q/ O0 j/ v! o1 |9 e4 y$ ^
- SysTick_IRQn = -1, /*!< 15 Cortex-M0+ System Tick Interrupt */2 f# t6 g+ S1 L Z
- - l: t" d2 q4 n4 T# @. ]
- /****** STM32L-0 specific Interrupt Numbers *********************************************************/" |$ U1 |8 c4 [
- WWDG_IRQn = 0, /*!< Window WatchDog Interrupt */( y5 ?9 C7 I, P
- PVD_IRQn = 1, /*!< PVD through EXTI Line detect Interrupt */
% w6 ]0 W% B' R7 q! u3 J8 U' C - RTC_IRQn = 2, /*!< RTC through EXTI Line Interrupt */
9 H1 @- a9 o7 S - FLASH_IRQn = 3, /*!< FLASH Interrupt */
' w: [( M& e8 u( L: \ - RCC_IRQn = 4, /*!< RCC Interrupt */
& B2 \7 k; o7 B - EXTI0_1_IRQn = 5, /*!< EXTI Line 0 and 1 Interrupts */
. l$ |2 Z$ ?( g; h: T& S2 Z/ O - EXTI2_3_IRQn = 6, /*!< EXTI Line 2 and 3 Interrupts */
6 b3 i4 n7 r: a5 k" ^ - EXTI4_15_IRQn = 7, /*!< EXTI Line 4 to 15 Interrupts */
) l7 k+ s# V9 D- {! v ] C( t# J4 j - DMA1_Channel1_IRQn = 9, /*!< DMA1 Channel 1 Interrupt */" p( }0 m$ f5 a7 [- _- C* p
- DMA1_Channel2_3_IRQn = 10, /*!< DMA1 Channel 2 and Channel 3 Interrupts */
" {& Y0 W O( ]1 A8 `7 L - DMA1_Channel4_5_6_7_IRQn = 11, /*!< DMA1 Channel 4, Channel 5, Channel 6 and Channel 7 Interrupts */
+ K9 S" {5 |5 N: j: H - ADC1_COMP_IRQn = 12, /*!< ADC1, COMP1 and COMP2 Interrupts */+ ^8 K& s [3 ~" _. V3 l. l( W3 t
- LPTIM1_IRQn = 13, /*!< LPTIM1 Interrupt */
( t# y# x+ i1 v7 k: h - TIM2_IRQn = 15, /*!< TIM2 Interrupt */
: y! m" Y6 ?# ~+ K - TIM21_IRQn = 20, /*!< TIM21 Interrupt */
" t# r; u! J. {5 C; s7 \) ^& ` - I2C1_IRQn = 23, /*!< I2C1 Interrupt */
& y$ _0 }4 f: F4 u4 T - SPI1_IRQn = 25, /*!< SPI1 Interrupt */) `7 h) |# F6 i, m9 u
- USART2_IRQn = 28, /*!< USART2 Interrupt */
, Z2 @& z: O, P - LPUART1_IRQn = 29, /*!< LPUART1 Interrupt */
7 D. i8 s; R4 o2 p- } - } IRQn_Type;
复制代码
" X. \2 ^& A( g/ [$ _例如将ADC1中断使能,除了对ADC1内部的相应中断位(ADC_IER)使能外,还需要使用下列语句才可以:
* C. f7 U, C0 K* t( a- B! J9 t
9 o' J0 F9 U* F! W( n0 fNVIC_EnableIRQ(ADC1_COMP_IRQn);4 Q" x) T3 o" d7 l( m
7 {& D; p0 v! c2 m, O4 v
8 u+ D- s* P$ h( r" c, b, }
1 t0 y3 C" y6 W0 A* l) C
|