1 Principle
1.1 EXTI
EXTI(External interrupt/event controller), the peripheral used for external interrupts, interrupts the controller and generates interrupts.
Functional block diagram of EXTI
Input Line: GPIO corresponds to 20 (EXTI_Line1. EXTI_Line19)
Rising/Descending Rim Trigger Selection Register: Configuring Trigger Conditions
Software interrupt register: whether interrupts occur
Interrupt Shielding Register: Is the Interrupt Request Corresponding
1.2 NVIC
NVIC - ----------------------- Configure interrupt priority, send interrupt signal to the kernel, and the kernel reacts according to interrupt service program.
2 code
An example of external interruption is given, and key interruption is realized to realize lamp switch.
Some macro definitions of keys:
#define KEY_GPIO_PIN GPIO_Pin_1 #define KEY_GPIO_PORT GPIOA #define KEY_GPIO_CLK RCC_AHBPeriph_GPIOA #define KEY_ON 1 #define KEY_OFF 0
Step 1: Configure GPIO that generates interruptions
(1) Define GPIO initialization structure
GPIO_InitTypeDef GPIO_InitStruct;
(2) Initialization of GPIO
//************************ 1 - Initialization of GPIO****************************************** RCC_AHBPeriphClockCmd(KEY_INT_CLK, ENABLE); //Clock opening GPIO_InitStruct.GPIO_Pin = KEY_INT_PIN; GPIO_InitStruct.GPIO_Mode = GPIO_Mode_IN; GPIO_InitStruct.GPIO_PuPd = GPIO_PuPd_NOPULL; //Floating space GPIO_Init(KEY_INT_PORT, &GPIO_InitStruct); //Initialization
Step 2: Initialize EXTI
(1) Define EXTI initialization structure
EXTI_InitTypeDef EXTI_InitStruct;
(2) Initialization of EXTI
//********************** 2 - Initialization EXTI****************************************** RCC_APB2PeriphClockCmd(RCC_APB2Periph_SYSCFG, ENABLE); //Clock opening SYSCFG_EXTILineConfig(EXTI_PortSourceGPIOA,EXTI_PinSource1); //Select the input line EXTI_InitStruct.EXTI_Line = EXTI_Line0; //Select EXTI Line EXTI_InitStruct.EXTI_Mode = EXTI_Mode_Interrupt; //Choice mode EXTI_InitStruct.EXTI_Trigger = EXTI_Trigger_Rising; //Select Rising Edge Trigger EXTI_InitStruct.EXTI_LineCmd = ENABLE; //EXTI_Line Enabling Selection EXTI_Init(&EXTI_InitStruct) //Initialization structure
Step 3: Configure interrupt priority
(1) Define NVIC initialization structure
NVIC_InitTypeDef NVIC_InitStruct;
(2) Configuring interrupt priority
//************************ 3 - Configuration Interruption Priority **************************************** NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1); //Configure Group Priority NVIC_InitStruct.NVIC_IRQChannel = EXTI0_IRQn; //Select interrupt source NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority = 1; //Preemption Priority NVIC_InitStruct.NVIC_IRQChannelSubPriority = 1; //Sub priority NVIC_InitStruct.NVIC_IRQChannelCmd = ENABLE; //General interruption NVIC_Init(&NVIC_InitStruct); //Initialization structure
Step 4: Write interrupt service functions
(1) Declare the interrupt service function in the startup file
(I use the EXTI0 line, and the interrupt service function has been written by default in the startup file and is weakly defined.)
(2) Implement the interrupt service function in stm32l1xx_it.c (according to your model) and declare it in the header file
void EXTI0_IRQHandler(void) { if(EXTI_GetITStatus(EXTI_Line0) != RESET) { LED_TOGGLE; } EXTI_ClearITPendingBit(EXTI_Line0); }