一开始多次尝试后,无论是在中断服务函数之前加延时还是之后加延时,都不行。最后开始检查代码,尝试设置引脚初始为高电平,终于成功。
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);
}
总结:移植程序得逐步检查