完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
扫一扫,分享给好友
本帖最后由 hyqzh1 于 2016-9-7 09:52 编辑
按键采用外部中断,当按键按下,flag标志位置位或清零,在main中判断flag使LED亮灭,为何程序编译烧录后,当按键按下LED没反应?请大神赐教! 程序如下: 主函数: int main() { LED_Init(); //LED初始化 exti_init(); //外部中断初始化 while(1) { if(flag==1) GPIO_SetBits(GPIOC,GPIO_Pin_0); else GPIO_ResetBits(GPIOC,GPIO_Pin_0); } } 外部中断如下: void EXTI2_IRQHandler() //外部中断2中断函数 { if(EXTI_GetITStatus(EXTI_Line2)==SET) { EXTI_ClearITPendingBit(EXTI_Line0);//清除EXTI线路挂起位 delay_ms(10);//消抖处理 if(GPIO_ReadInputDataBit(GPIOE,GPIO_Pin_2)==Bit_RESET) //k_left按键按下 { if(flag==1) flag=0; else flag=1; } while(GPIO_ReadInputDataBit(GPIOE,GPIO_Pin_2)==0); } } 中断初始化如下(原例程,没有改动): void exti_init() //外部中断初始化 { GPIO_InitTypeDef GPIO_InitStructure; EXTI_InitTypeDef EXTI_InitStructure; NVIC_InitTypeDef NVIC_InitStructure; /* 开启GPIO时钟 */ RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE); RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOE,ENABLE); GPIO_InitStructure.GPIO_Pin=k_left; GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IPU; GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz; GPIO_Init(GPIOE,&GPIO_InitStructure); GPIO_EXTILineConfig(GPIO_PortSourceGPIOE, GPIO_PinSource2);//选择GPIO管脚用作外部中断线路 //此处一定要记住给端口管脚加上中断外部线路 /* 设置外部中断的模式 */ EXTI_InitStructure.EXTI_Line=EXTI_Line2; EXTI_InitStructure.EXTI_Mode=EXTI_Mode_Interrupt; EXTI_InitStructure.EXTI_Trigger=EXTI_Trigger_Falling; EXTI_InitStructure.EXTI_LineCmd = ENABLE; EXTI_Init(&EXTI_InitStructure); /* 设置NVIC参数 */ NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1); NVIC_InitStructure.NVIC_IRQChannel = EXTI2_IRQn; //打开EXTI2的全局中断 NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0; //抢占优先级为0 NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; //响应优先级为0 NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //使能 NVIC_Init(&NVIC_InitStructure); } |
|
相关推荐
8个回答
|
|
给你个建议,在程序的一些部位加printf打印函数,连接上串口到电脑,可以看程序执行到哪里,
|
|
|
|
把 EXTI_ClearITPendingBit(EXTI_Line0);//清除EXTI线路挂起位
放在函数的最后 void EXTI2_IRQHandler() //外部中断2中断函数 { if(EXTI_GetITStatus(EXTI_Line2)==SET) { void EXTI2_IRQHandler() //外部中断2中断函数 { if(EXTI_GetITStatus(EXTI_Line2)==SET) { delay_ms(10);//消抖处理 if(GPIO_ReadInputDataBit(GPIOE,GPIO_Pin_2)==Bit_RESET) //k_left按键按下 { if(flag==1) flag=0; else flag=1; } while(GPIO_ReadInputDataBit(GPIOE,GPIO_Pin_2)==0); } } delay_ms(10);//消抖处理 if(GPIO_ReadInputDataBit(GPIOE,GPIO_Pin_2)==Bit_RESET) //k_left按键按下 { if(flag==1) flag=0; else flag=1; } while(GPIO_ReadInputDataBit(GPIOE,GPIO_Pin_2)==0); void EXTI2_IRQHandler() //外部中断2中断函数 { if(EXTI_GetITStatus(EXTI_Line2)==SET) { EXTI_ClearITPendingBit(EXTI_Line0);//清除EXTI线路挂起位 delay_ms(10);//消抖处理 if(GPIO_ReadInputDataBit(GPIOE,GPIO_Pin_2)==Bit_RESET) //k_left按键按下 { if(flag==1) flag=0; else flag=1; } while(GPIO_ReadInputDataBit(GPIOE,GPIO_Pin_2)==0); } EXTI_ClearITPendingBit(EXTI_Line0);//清除EXTI线路挂起位 } |
|
|
|
把 EXTI_ClearITPendingBit(EXTI_Line0);//清除EXTI线路挂起位
放在函数的最后 void EXTI2_IRQHandler() //外部中断2中断函数 { if(EXTI_GetITStatus(EXTI_Line2)==SET) { void EXTI2_IRQHandler() //外部中断2中断函数 { if(EXTI_GetITStatus(EXTI_Line2)==SET) { delay_ms(10);//消抖处理 if(GPIO_ReadInputDataBit(GPIOE,GPIO_Pin_2)==Bit_RESET) //k_left按键按下 { if(flag==1) flag=0; else flag=1; } while(GPIO_ReadInputDataBit(GPIOE,GPIO_Pin_2)==0); } } delay_ms(10);//消抖处理 if(GPIO_ReadInputDataBit(GPIOE,GPIO_Pin_2)==Bit_RESET) //k_left按键按下 { if(flag==1) flag=0; else flag=1; } while(GPIO_ReadInputDataBit(GPIOE,GPIO_Pin_2)==0); void EXTI2_IRQHandler() //外部中断2中断函数 { if(EXTI_GetITStatus(EXTI_Line2)==SET) { EXTI_ClearITPendingBit(EXTI_Line0);//清除EXTI线路挂起位 delay_ms(10);//消抖处理 if(GPIO_ReadInputDataBit(GPIOE,GPIO_Pin_2)==Bit_RESET) //k_left按键按下 { if(flag==1) flag=0; else flag=1; } while(GPIO_ReadInputDataBit(GPIOE,GPIO_Pin_2)==0); } EXTI_ClearITPendingBit(EXTI_Line0);//清除EXTI线路挂起位 } |
|
|
|
把 EXTI_ClearITPendingBit(EXTI_Line0);//清除EXTI线路挂起位
放在函数的最后 void EXTI2_IRQHandler() //外部中断2中断函数 { if(EXTI_GetITStatus(EXTI_Line2)==SET) { void EXTI2_IRQHandler() //外部中断2中断函数 { if(EXTI_GetITStatus(EXTI_Line2)==SET) { delay_ms(10);//消抖处理 if(GPIO_ReadInputDataBit(GPIOE,GPIO_Pin_2)==Bit_RESET) //k_left按键按下 { if(flag==1) flag=0; else flag=1; } while(GPIO_ReadInputDataBit(GPIOE,GPIO_Pin_2)==0); } } delay_ms(10);//消抖处理 if(GPIO_ReadInputDataBit(GPIOE,GPIO_Pin_2)==Bit_RESET) //k_left按键按下 { if(flag==1) flag=0; else flag=1; } while(GPIO_ReadInputDataBit(GPIOE,GPIO_Pin_2)==0); void EXTI2_IRQHandler() //外部中断2中断函数 { if(EXTI_GetITStatus(EXTI_Line2)==SET) { EXTI_ClearITPendingBit(EXTI_Line0);//清除EXTI线路挂起位 delay_ms(10);//消抖处理 if(GPIO_ReadInputDataBit(GPIOE,GPIO_Pin_2)==Bit_RESET) //k_left按键按下 { if(flag==1) flag=0; else flag=1; } while(GPIO_ReadInputDataBit(GPIOE,GPIO_Pin_2)==0); } EXTI_ClearITPendingBit(EXTI_Line0);//清除EXTI线路挂起位 } |
|
|
|
把 EXTI_ClearITPendingBit(EXTI_Line0);//清除EXTI线路挂起位
放在函数的最后 void EXTI2_IRQHandler() //外部中断2中断函数 { if(EXTI_GetITStatus(EXTI_Line2)==SET) { void EXTI2_IRQHandler() //外部中断2中断函数 { if(EXTI_GetITStatus(EXTI_Line2)==SET) { delay_ms(10);//消抖处理 if(GPIO_ReadInputDataBit(GPIOE,GPIO_Pin_2)==Bit_RESET) //k_left按键按下 { if(flag==1) flag=0; else flag=1; } while(GPIO_ReadInputDataBit(GPIOE,GPIO_Pin_2)==0); } } delay_ms(10);//消抖处理 if(GPIO_ReadInputDataBit(GPIOE,GPIO_Pin_2)==Bit_RESET) //k_left按键按下 { if(flag==1) flag=0; else flag=1; } while(GPIO_ReadInputDataBit(GPIOE,GPIO_Pin_2)==0); void EXTI2_IRQHandler() //外部中断2中断函数 { if(EXTI_GetITStatus(EXTI_Line2)==SET) { EXTI_ClearITPendingBit(EXTI_Line0);//清除EXTI线路挂起位 delay_ms(10);//消抖处理 if(GPIO_ReadInputDataBit(GPIOE,GPIO_Pin_2)==Bit_RESET) //k_left按键按下 { if(flag==1) flag=0; else flag=1; } while(GPIO_ReadInputDataBit(GPIOE,GPIO_Pin_2)==0); } EXTI_ClearITPendingBit(EXTI_Line0);//清除EXTI线路挂起位 } |
|
|
|
把 EXTI_ClearITPendingBit(EXTI_Line0);//清除EXTI线路挂起位
放在函数的最后 void EXTI2_IRQHandler() //外部中断2中断函数 { if(EXTI_GetITStatus(EXTI_Line2)==SET) { void EXTI2_IRQHandler() //外部中断2中断函数 { if(EXTI_GetITStatus(EXTI_Line2)==SET) { delay_ms(10);//消抖处理 if(GPIO_ReadInputDataBit(GPIOE,GPIO_Pin_2)==Bit_RESET) //k_left按键按下 { if(flag==1) flag=0; else flag=1; } while(GPIO_ReadInputDataBit(GPIOE,GPIO_Pin_2)==0); } } delay_ms(10);//消抖处理 if(GPIO_ReadInputDataBit(GPIOE,GPIO_Pin_2)==Bit_RESET) //k_left按键按下 { if(flag==1) flag=0; else flag=1; } while(GPIO_ReadInputDataBit(GPIOE,GPIO_Pin_2)==0); void EXTI2_IRQHandler() //外部中断2中断函数 { if(EXTI_GetITStatus(EXTI_Line2)==SET) { EXTI_ClearITPendingBit(EXTI_Line0);//清除EXTI线路挂起位 delay_ms(10);//消抖处理 if(GPIO_ReadInputDataBit(GPIOE,GPIO_Pin_2)==Bit_RESET) //k_left按键按下 { if(flag==1) flag=0; else flag=1; } while(GPIO_ReadInputDataBit(GPIOE,GPIO_Pin_2)==0); } EXTI_ClearITPendingBit(EXTI_Line0);//清除EXTI线路挂起位 } |
|
|
|
把 EXTI_ClearITPendingBit(EXTI_Line0);//清除EXTI线路挂起位
放在函数的最后 void EXTI2_IRQHandler() //外部中断2中断函数 { if(EXTI_GetITStatus(EXTI_Line2)==SET) { void EXTI2_IRQHandler() //外部中断2中断函数 { if(EXTI_GetITStatus(EXTI_Line2)==SET) { delay_ms(10);//消抖处理 if(GPIO_ReadInputDataBit(GPIOE,GPIO_Pin_2)==Bit_RESET) //k_left按键按下 { if(flag==1) flag=0; else flag=1; } while(GPIO_ReadInputDataBit(GPIOE,GPIO_Pin_2)==0); } } delay_ms(10);//消抖处理 if(GPIO_ReadInputDataBit(GPIOE,GPIO_Pin_2)==Bit_RESET) //k_left按键按下 { if(flag==1) flag=0; else flag=1; } while(GPIO_ReadInputDataBit(GPIOE,GPIO_Pin_2)==0); void EXTI2_IRQHandler() //外部中断2中断函数 { if(EXTI_GetITStatus(EXTI_Line2)==SET) { EXTI_ClearITPendingBit(EXTI_Line0);//清除EXTI线路挂起位 delay_ms(10);//消抖处理 if(GPIO_ReadInputDataBit(GPIOE,GPIO_Pin_2)==Bit_RESET) //k_left按键按下 { if(flag==1) flag=0; else flag=1; } while(GPIO_ReadInputDataBit(GPIOE,GPIO_Pin_2)==0); } EXTI_ClearITPendingBit(EXTI_Line0);//清除EXTI线路挂起位 } |
|
|
|
把 EXTI_ClearITPendingBit(EXTI_Line0);//清除EXTI线路挂起位
放在函数的最后 void EXTI2_IRQHandler() //外部中断2中断函数 { if(EXTI_GetITStatus(EXTI_Line2)==SET) { void EXTI2_IRQHandler() //外部中断2中断函数 { if(EXTI_GetITStatus(EXTI_Line2)==SET) { delay_ms(10);//消抖处理 if(GPIO_ReadInputDataBit(GPIOE,GPIO_Pin_2)==Bit_RESET) //k_left按键按下 { if(flag==1) flag=0; else flag=1; } while(GPIO_ReadInputDataBit(GPIOE,GPIO_Pin_2)==0); } } delay_ms(10);//消抖处理 if(GPIO_ReadInputDataBit(GPIOE,GPIO_Pin_2)==Bit_RESET) //k_left按键按下 { if(flag==1) flag=0; else flag=1; } while(GPIO_ReadInputDataBit(GPIOE,GPIO_Pin_2)==0); void EXTI2_IRQHandler() //外部中断2中断函数 { if(EXTI_GetITStatus(EXTI_Line2)==SET) { EXTI_ClearITPendingBit(EXTI_Line0);//清除EXTI线路挂起位 delay_ms(10);//消抖处理 if(GPIO_ReadInputDataBit(GPIOE,GPIO_Pin_2)==Bit_RESET) //k_left按键按下 { if(flag==1) flag=0; else flag=1; } while(GPIO_ReadInputDataBit(GPIOE,GPIO_Pin_2)==0); } EXTI_ClearITPendingBit(EXTI_Line0);//清除EXTI线路挂起位 } |
|
|
|
你正在撰写答案
如果你是对答案或其他答案精选点评或询问,请使用“评论”功能。
嵌入式学习-飞凌嵌入式ElfBoard ELF 1板卡-shell编程入门之提取字符并设置rtc时间
221 浏览 0 评论
使用LIS2DW12TR加速度传感器可以计算物体重力方向运动的距离吗
318 浏览 1 评论
【敏矽微ME32G070开发板免费体验】介绍、环境搭建、工程测试
300 浏览 0 评论
敏矽微ME32G070开发板开发资料(规格书、库和例程、原理图)
1319 浏览 0 评论
《DNESP32S3使用指南-IDF版_V1.6》第十一章 KEY实验
472 浏览 0 评论
【youyeetoo X1 windows 开发板体验】少儿AI智能STEAM积木平台
11935 浏览 31 评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-12-13 13:30 , Processed in 2.066802 second(s), Total 85, Slave 69 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号