这里以自己画的板子为例,实现按键1的中断,按键1接的是PB3
PB3的第一引脚功能是JTDO,这里我们要使JTDO功能失能,代码如下:
GPIO_PinRemapConfig(GPIO_Remap_SWJ_JTAGDisable, ENABLE);
外部中断一般配置步骤如下:
1.初始化IO口为输入(GPIO_Init())
GPIO_InitTypeDef GPIO_InitStructure;
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
GPIO_Init(GPIOB, &GPIO_InitStructure);
2.开启IO口时钟和IO端口复用时钟:
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB|RCC_APB2Periph_AFIO, ENABLE);
3.设置IO口与中断线的映射关系
GPIO_EXTILineConfig(GPIO_PortSourceGPIOB, GPIO_PinSource3);//选择 GPIO 管脚用作外部中断线路
/*参数格式:参数1:GPIO_PortSourceGPIOX,X可以是A、B、C、D、E
参数2:GPIO_PinSourceN,N可以是0~15 */
4.初始化外部中断EXTI,设置触发条件等
EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt; //中断请求模式
EXTI_InitStructure.EXTI_Line = EXTI_Line3; //外部中断线
EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling; //设置输入线路下降沿为中断请求
EXTI_InitStructure.EXTI_LineCmd = ENABLE; //使能
EXTI_Init(&EXTI_InitStructure);//初始化
5.配置中断分组(NVIC),并使能中断。
NVIC_InitStructure.NVIC_IRQChannel =EXTI3_IRQn; //外部中断线3的中断
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority =0;//抢占优先级
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1; //响应优先级
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
6.编写中断服务函数
void EXTI3_IRQHandler(void)//中断线3的中断函数
{
if(EXTI_GetITStatus(EXTI_Line3)!=RESET)
{
Delay_ms(100);
if(GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_3)==0)
{
printf("key1\r\n");
}
EXTI_ClearITPendingBit(EXTI_Line3);//清除EXTI线路挂起位
}
}
该函数功能:每按下按键1,就通过串口发送一个字符串“key1”,记得清除中断标志位
EXTI_ClearITPendingBit();
注:每个中断线的中断函数都有固定的名称