概述
一开始多次尝试后,无论是在中断服务函数之前加延时还是之后加延时,都不行。最后开始检查代码,尝试设置引脚初始为高电平,终于成功。
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 rn",time_ms,time_us);
//清除中断标志位
}
delay_ms(10);
EXTI_ClearITPendingBit(EXTI_Line3);
}
总结:移植程序得逐步检查
最后
以上就是含蓄母鸡为你收集整理的## 按键触发外部中断,服务函数被多次调用的全部内容,希望文章能够帮你解决## 按键触发外部中断,服务函数被多次调用所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复