完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
扫一扫,分享给好友
按键采用外部中断,当按键按下,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个回答
|
|
辛苦了,谢谢分享。
|
|
|
|
这个程序有几个问题:
1.你的LED的GPIO应该配置了吧? 2.清标志位为啥要清EXTI_Line0? 3.我从来没见过消抖放在中断里的,中断程序应该简短快捷,因为还要去响应其他中断,你这儿弄个延时很不好,会影响其他中断或任务进度的。你可以设置1个定时器,在中断中开启,然后设置10~20ms再检测连接按键管脚的电平,检测完毕就关闭,这样可以顺便学习下定时器,也让你养成一个好习惯(中断中不用延时),也会让你学会在多任务的情况下,可以不必死等,先去执行其他任务,等时间到了再执行按键 4.while(GPIO_ReadInputDataBit(GPIOE,GPIO_Pin_2)==0);这句应该是等待按键松手吧,如果不放手就死在这里了,又是死等,等待松手可以放在mian里,最好不要不松手就死等,可以等一会,不松手就执行灯亮或灭 5.写程序要有个好习惯,能不死等就不死等,死等太浪费MCU资源了,等以后你写较多任务的代码时就知道 |
|
|
|
谢谢大师回复。 1,LED的GPIO配置了,如下: void LED_Init() //端口初始化 { GPIO_InitTypeDef GPIO_InitStructure; //声明一个结构体变量,用来初始化GPIO SystemInit(); //系统时钟初始化 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC,ENABLE); /* 开启GPIO时钟 */ /* 配置GPIO的模式和IO口 */ GPIO_InitStructure.GPIO_Pin=LED; //选择你要设置的IO口 GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP; //设置推挽输出模式 GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz; //设置传输速率 GPIO_Init(GPIOC,&GPIO_InitStructure); /* 初始化GPIO */ GPIO_SetBits(GPIOC,LED); //IO口输出高电平 } 2,我是初学者,这个程序是例程里边的,我只修改了按键外部中断flag的置位,原中断里是这样的: if(GPIO_ReadOutputDataBit(GPIOC,GPIO_Pin_0)==Bit_RESET) { //LED 熄灭 // GPIO_SetBits(GPIOC,GPIO_Pin_0); } else { //LED 发光 GPIO_ResetBits(GPIOC,GPIO_Pin_0);; } |
|
|
|
谢谢大师回复。 1,LED的GPIO配置了,如下: void LED_Init() //端口初始化 { GPIO_InitTypeDef GPIO_InitStructure; //声明一个结构体变量,用来初始化GPIO SystemInit(); //系统时钟初始化 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC,ENABLE); /* 开启GPIO时钟 */ /* 配置GPIO的模式和IO口 */ GPIO_InitStructure.GPIO_Pin=LED; //选择你要设置的IO口 GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP; //设置推挽输出模式 GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz; //设置传输速率 GPIO_Init(GPIOC,&GPIO_InitStructure); /* 初始化GPIO */ GPIO_SetBits(GPIOC,LED); //IO口输出高电平 } 2,我是初学者,这个程序是例程里边的,我只修改了按键外部中断flag的置位,原中断里是这样的(原程序中按键可以控制LED亮和灭): if(GPIO_ReadOutputDataBit(GPIOC,GPIO_Pin_0)==Bit_RESET) { //LED 熄灭 GPIO_SetBits(GPIOC,GPIO_Pin_0); } else { //LED 发光 GPIO_ResetBits(GPIOC,GPIO_Pin_0);; } 3,我也知道在中断中延时是不好的,但是这个程序我只想弄明白我修改了中断的标志位,在主函数中为什么不起作用? |
|
|
|
谢谢大师,我已经解决了,是你说的第2点问题,我修改为EXTI_Line2就可以了,看来是例程里写错了。感谢大师指点! |
|
|
|
我也是个初学者,不是什么大师,出来工作数年后才开始自学。一开始是很多困难,慢慢坚持下来就好了。我建议你不要看他们的例程,在网上找下比较有名气的公司开发板的例程,然后移植过来,这样可以让你学会怎么去移植,还可以养成良好代码习惯
|
|
|
|
哦还有,SystemInit(); 这个函数可以不要,因为在启动文件(.s格式)中已经调用了这个函数,F1的配置为72M,F0的配置为48M,F4的配置为168M,如果你自己想重新配置时钟的话,那就直接修改这个函数就可以了
|
|
|
|
meimengxing2014 发表于 2016-9-8 12:32 好的,感谢!听君一席话胜读十年书,向你学习! |
|
|
|
你正在撰写答案
如果你是对答案或其他答案精选点评或询问,请使用“评论”功能。
2136 浏览 1 评论
AD7686芯片不传输数据给STM32,但是手按住就会有数据。
1970 浏览 3 评论
4566 浏览 0 评论
如何解决MPU-9250与STM32通讯时,出现HAL_ERROR = 0x01U
2116 浏览 1 评论
hal库中i2c卡死在HAL_I2C_Master_Transmit
2629 浏览 1 评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-12-24 00:30 , Processed in 0.715352 second(s), Total 87, Slave 71 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号