程序功能:使用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_Configuration
2)开启 IO 口复用时钟,设置 IO 口与中断线的映射关系。 
3)初始化线上中断,设置触发条件等。 
4)配置中断分组(NVIC),并使能中断。 
5)编写中断服务函数。