## 按键触发外部中断,服务函数被多次调用

一开始多次尝试后,无论是在中断服务函数之前加延时还是之后加延时,都不行。最后开始检查代码,尝试设置引脚初始为高电平,终于成功。

GPIO_InitStruct.GPIO_Pin = GPIO_Pin_3;
GPIO_InitStruct.GPIO_Mode = GPIO_Mode_OUT ;
GPIO_InitStruct.GPIO_PuPd = GPIO_PuPd_UP;
GPIO_Init(GPIOE, &GPIO_InitStruct);
GPIO_SetBits(GPIOE,GPIO_Pin_3);//设置默认电平,防止被误触发

SYSCFG_EXTILineConfig(EXTI_PortSourceGPIOE,GPIO_PinSource3);

EXTI_InitStruct.EXTI_Line = EXTI_Line3 ; 
EXTI_InitStruct.EXTI_Mode= EXTI_Mode_Interrupt ;
EXTI_InitStruct.EXTI_Trigger= EXTI_Trigger_Falling;
EXTI_InitStruct.EXTI_LineCmd= ENABLE;
EXTI_Init(&EXTI_InitStruct);

NVIC_InitStructure.NVIC_IRQChannel = EXTI3_IRQn;//外部中断0
  NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x00;//抢占优先级0
  NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x00;//子优先级2
  NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;//使能外部中断通道
  NVIC_Init(&NVIC_InitStructure);//配置
void EXTI3_IRQHandler(void)
{
	int time=0;
	int time_ms,time_us,data;
	time = count;
	
	if(EXTI_GetITStatus(EXTI_Line3) != RESET) 
	{
	printf("UTC Date:%04d/%02d/%02d   ",gpsx.utc.year,gpsx.utc.month,gpsx.utc.date);	//显示UTC日期
			    
	printf("UTC Time:%02d:%02d:%02d s  ",gpsx.utc.hour+8,gpsx.utc.min,gpsx.utc.sec);	//显示UTC时间
 
	time_ms = time/1000;
	time_us = time%1000;
	printf("%d ms %d us  \r\n",time_ms,time_us);
		
    //清除中断标志位
	}
	delay_ms(10);	
	EXTI_ClearITPendingBit(EXTI_Line3);  
	
}

总结:移植程序得逐步检查

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值