程序功能:使用EXTI中断实现按键点亮LED。按键一次,LED状态翻转一次。
在程序中开启GPIOE.2的中断线2。并设置为下降沿触发中断。
//exti.h
#ifndef __EXTI_H__#define __EXTI_H__#include "stm32f10x.h"#include "MyTime.h"#include "bitband.h"void EXTI_Configuration(void);void EXTI2_IRQHandler(void) ;#endif
//exti.c
#include "exti.h"#include "key.h"void EXTI_Configuration(void){ EXTI_InitTypeDef EXTI_InitStruct; NVIC_InitTypeDef NVIC_InitStruct; //1)初始化 IO 口为输入 KEY_Configuration(); //2)开启 IO 口复用时钟,设置 IO 口与中断线的映射关系。 RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE); GPIO_EXTILineConfig(GPIO_PortSourceGPIOE,GPIO_PinSource2); //3)初始化线上中断,设置触发条件等 EXTI_InitStruct.EXTI_Line = EXTI_Line2; EXTI_InitStruct.EXTI_Mode = EXTI_Mode_Interrupt; EXTI_InitStruct.EXTI_Trigger = EXTI_Trigger_Falling; EXTI_InitStruct.EXTI_LineCmd = ENABLE; EXTI_Init(&EXTI_InitStruct); //4)配置中断分组(NVIC),并使能中断 NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); NVIC_InitStruct.NVIC_IRQChannel = EXTI2_IRQn; NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority = 2; NVIC_InitStruct.NVIC_IRQChannelSubPriority = 2; NVIC_InitStruct.NVIC_IRQChannelCmd = ENABLE; NVIC_Init(&NVIC_InitStruct);} //5)编写中断服务函数。 void EXTI2_IRQHandler(void) { MyDelay_ms(10); //消抖 if(KEY2==0) //按键KEY2 { LED0=!LED0; } EXTI_ClearITPendingBit(EXTI_Line2); //清除 LINE2 上的中断标志位 }
//main.c
#include "MyTime.h"#include "exti.h"int main(void){ MySysTick_Init(); //点亮灯 GPIO_Configuration(); EXTI_Configuration(); while(1); }
注:使用IO 口外部中断的一般步骤:
1)初始化 IO 口为输入。 //KEY_Configuration2)开启 IO 口复用时钟,设置 IO 口与中断线的映射关系。 3)初始化线上中断,设置触发条件等。 4)配置中断分组(NVIC),并使能中断。 5)编写中断服务函数。