使用GPIO作为中断源,即EXTI,在程序中通过以下步骤实现:
1)使能EXTIx线的时钟和第二功能AFIO时钟:(以下用PB0作为EXTI的输入)
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB | RCC_APB2Periph_AFIO,ENABLE);
GPIO被配置成EXTI的输入,是复用功能,所以要将AFIO时钟打开。
2)配置EXTIx的中断优先级:
NVIC_Configuration();
这是通过配置NVIC(Nested Vector Interrupt Controller)来实现,其实就是通过对NVIC的初始化(NVIC_Init())
static void NVIC_Configuration(void)
{
NVIC_InitTypeDef NVIC_InitStructure;
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1); //选择哪个中断向量组
/*配置P[A | B | C | D |E]0为中断源*/
NVIC_InitStructure.NVIC_IRQChanne l= EXTI0_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
}
对NVIC初始化实际上就是定义并填充一个NVIC_InitTypeDef类型的结构体。
由NVIC_IRQChannel成员来选择要配置的中断向量,
由NVIC_IRQChannelPreemptionPriority 来配置中断的抢占式优先级,
由NVIC_IRQChannelSubPriority 来配置中断的响应优先级,
由NVIC_IRQChannelCmd 来打开(使能)或者关闭(失能)该中断。
3)配置EXTI中断0.首先这是一个GPIO,要先进行如下配置:
GPIO_Initstructure.GPIO_Pin = GPIO_Pin_0;
GPIO_Initstructure.GPIO_Mode = GPIO_Mode_IPD; //上拉输入
GPIO_Init(GPIOB,&GPIO_Initstructure);
再进行中断配置,如下所示:
GPIO_EXTILineConfig(GPIO_PortSourceGPIOB, GPIO_PinSource0);