使用LL庫對STM32L0程式設計時,外設中斷不起作用怎麼回事
阿新 • • 發佈:2019-01-29
使用LL庫程式設計時,發現外設中斷即使使能也進不了中斷。
一般外設都會有自己的暫存器來控制中斷的開關,比如ADC 中斷使能暫存器 (ADC_IER),但是,將裡面相應的位置位後,中斷仍然不能相應。
這是因為總的NVIC開關沒有開啟。這點也好理解。有過STM32開發經驗的人都知道,NVIC有開關來控制外設的中斷使能。但是在LL庫如何實現呢?
翻遍了LL庫並沒有相應的函式。因為NVIC屬於CORTEX核心的東西,外設函式是觸控不到的。(而HAL庫是有類似的函式的)
以下是NVIC暫存器
下圖是對NVIC操作的函式
下面是各個中斷的序號
/** @addtogroup Peripheral_interrupt_number_definition * @{ */ /** * @brief stm32l011xx Interrupt Number Definition, according to the selected device * in @ref Library_configuration_section */ /*!< Interrupt Number Definition */ typedef enum { /****** Cortex-M0 Processor Exceptions Numbers ******************************************************/ NonMaskableInt_IRQn = -14, /*!< 2 Non Maskable Interrupt */ HardFault_IRQn = -13, /*!< 3 Cortex-M0+ Hard Fault Interrupt */ SVC_IRQn = -5, /*!< 11 Cortex-M0+ SV Call Interrupt */ PendSV_IRQn = -2, /*!< 14 Cortex-M0+ Pend SV Interrupt */ SysTick_IRQn = -1, /*!< 15 Cortex-M0+ System Tick Interrupt */ /****** STM32L-0 specific Interrupt Numbers *********************************************************/ WWDG_IRQn = 0, /*!< Window WatchDog Interrupt */ PVD_IRQn = 1, /*!< PVD through EXTI Line detect Interrupt */ RTC_IRQn = 2, /*!< RTC through EXTI Line Interrupt */ FLASH_IRQn = 3, /*!< FLASH Interrupt */ RCC_IRQn = 4, /*!< RCC Interrupt */ EXTI0_1_IRQn = 5, /*!< EXTI Line 0 and 1 Interrupts */ EXTI2_3_IRQn = 6, /*!< EXTI Line 2 and 3 Interrupts */ EXTI4_15_IRQn = 7, /*!< EXTI Line 4 to 15 Interrupts */ DMA1_Channel1_IRQn = 9, /*!< DMA1 Channel 1 Interrupt */ DMA1_Channel2_3_IRQn = 10, /*!< DMA1 Channel 2 and Channel 3 Interrupts */ DMA1_Channel4_5_6_7_IRQn = 11, /*!< DMA1 Channel 4, Channel 5, Channel 6 and Channel 7 Interrupts */ ADC1_COMP_IRQn = 12, /*!< ADC1, COMP1 and COMP2 Interrupts */ LPTIM1_IRQn = 13, /*!< LPTIM1 Interrupt */ TIM2_IRQn = 15, /*!< TIM2 Interrupt */ TIM21_IRQn = 20, /*!< TIM21 Interrupt */ I2C1_IRQn = 23, /*!< I2C1 Interrupt */ SPI1_IRQn = 25, /*!< SPI1 Interrupt */ USART2_IRQn = 28, /*!< USART2 Interrupt */ LPUART1_IRQn = 29, /*!< LPUART1 Interrupt */ } IRQn_Type;
例如將ADC1中斷使能,除了對ADC1內部的相應中斷位(ADC_IER)使能外,還需要使用下列語句才可以:
NVIC_EnableIRQ(ADC1_COMP_IRQn);