stm32之EXTI外部中断
外部中断配置主要涉及AFIO中断引脚选择,EXTI边缘沿检测及配置,NVIC中断控制器
AFIO同时只能检测到不同GPIOx下的同一个pin口,因为不同GPIOx的pin共用一个AFIO通道。NVIC中断控制器通常4位,可自由分配抢占优先级位数和子优先级位数。
// 1.使能GPIO时钟 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE); // 2.初始化GPIO GPIO_InitTypeDef GPIO_InitStruct; GPIO_InitStruct.GPIO_Mode = GPIO_Mode_IPD; // 下拉输入 GPIO_InitStruct.GPIO_Pin = GPIO_Pin_0; // 使用 PA0 引脚 GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOA, &GPIO_InitStruct); // 3.配置AFIO GPIO_EXTILineConfig(GPIO_PortSourceGPIOA, GPIO_PinSource0); //使用PA0引脚作为中断输出引脚 // 4.配置EXTI EXTI_InitTypeDef EXTI_InitStruct; EXTI_InitStruct.EXTI_Line = EXTI_Line0; EXTI_InitStruct.EXTI_LineCmd = ENABLE; EXTI_InitStruct.EXTI_Mode = EXTI_Mode_Interrupt; // 中断模式 EXTI_InitStruct.EXTI_Trigger = EXTI_Trigger_Falling; // 下降沿触发 EXTI_Init(&EXTI_InitStruct); // 5.初始化NVIC NVIC_InitTypeDef NVIC_InitStruct; NVIC_InitStruct.NVIC_IRQChannel = EXTI0_IRQn; NVIC_InitStruct.NVIC_IRQChannelCmd = ENABLE; NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority = 2; //抢占优先级 NVIC_InitStruct.NVIC_IRQChannelSubPriority = 2; //子优先级,与抢占优先级一共4位 NVIC_Init(&NVIC_InitStruct); // 中断处理函数 void EXTI0_IRQHandler(void) { if (EXTI_GetITStatus(EXTI_Line0) != RESET) { EXTI_ClearITPendingBit(EXTI_Line0); // 清除中断标志 } }