程序功能:使用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)编写中断服务函数。