我是靠谱客的博主 含蓄母鸡,最近开发中收集的这篇文章主要介绍## 按键触发外部中断,服务函数被多次调用,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

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

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);  
	
}

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

最后

以上就是含蓄母鸡为你收集整理的## 按键触发外部中断,服务函数被多次调用的全部内容,希望文章能够帮你解决## 按键触发外部中断,服务函数被多次调用所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(44)

评论列表共有 0 条评论

立即
投稿
返回
顶部