void EXTI_INIT(void)
{
GPIO_InitTypeDef GPIO_InitStruct; //GPIO结构体名称
EXTI_InitTypeDef EXTI_InitStruct; //EXTID中断结构体名称
NVIC_InitTypeDef NVIC_InitStruct; //NVIC结构体名称
//GPIO时钟开启
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);
//AFIO时钟开启
RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);
//GPIO初始化
GPIO_InitStruct.GPIO_Mode=GPIO_Mode_IPU;
GPIO_InitStruct.GPIO_Pin=GPIO_Pin_4;
GPIO_Init(GPIOA, &GPIO_InitStruct);
GPIO_EXTILineConfig(GPIO_PortSourceGPIOA,GPIO_Pin_4);//GPIO中断源选择
//nvic组选择 组包含抢站优先级 子优先级的配置
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
//NVIC配置
NVIC_InitStruct.NVIC_IRQChannel= EXTI4_IRQn; //中断选择 5-9和10-15共用函数和此参数 若需要判断5-9和10-15那个产生了中断,可根据检测中断的LINE进行判断
NVIC_InitStruct.NVIC_IRQChannelCmd=ENABLE;
NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority=1;
NVIC_InitStruct.NVIC_IRQChannelSubPriority=1;
NVIC_Init(&NVIC_InitStruct);
//中断配置
EXTI_InitStruct.EXTI_Line=EXTI_Line4; //和PA4=EXTI_Line4想应
EXTI_InitStruct.EXTI_LineCmd=ENABLE;
EXTI_InitStruct.EXTI_Mode=EXTI_Mode_Interrupt;//中断OR事件
EXTI_InitStruct.EXTI_Trigger=EXTI_Trigger_Falling;//沿检测,上,下,上/下
EXTI_Init(&EXTI_InitStruct);
}
中断服务函数在启动文件中
void EXTI4_IRQHandler(void)
{
if(EXTI_GetITStatus(EXTI_Line4)==1)//检测是否产生中断
{
GPIO_ResetBits(GPIOB,GPIO_Pin_0);
systick_s(1);
GPIO_SetBits(GPIOB,GPIO_Pin_0);
systick_s(1);
}
EXTI_ClearITPendingBit(EXTI_Line4);//清除中断标志位
}
备注;5-9和10-15共用函数和此参数 若需要判断5-9和10-15那个产生了中断,可根据检测中断的LINE进行判断
如PA0,PB0.PC0,PD0共用LINE,则需要使用GPIO的READINPUTBIT(按钮输入函数)来检测是那个产生的中断。