本帖最后由 西奥伟 于 2018-12-12 15:15 编辑 最近在做一个电源有关的项目,通过按键控制开关机,按键是使用的外部中断,但是,为什么我Debug在线调试时,按键能够正常实现其功能,如果我取消Debug调试,正常运行,按键能够控制,但是,始终不能保持我的电源GPIO的引脚置高,按键按一下,电源指示灯闪烁一下,不能稳定亮起来。 这是我的程序,请教一下各位,看看我的代码写的是否有问题。 1 2 3 4 5 首先,感谢所有坛友对我提出的问题进行耐心的解答。然后,我已经找到最终导致出现问题的原因了,总结了一下是由于硬件设计的原因,我的项目是通过按键来实现短按开机,长按关机,短按时,需要把对应的GPIO置为高电平,才能够开机供电,但是,我使用的外部中断,还未等对应的GPIO置为高电平,单片机的CPU的时间戳就已经过了这一步。(也就是说正常工作模式下,根本就没有电源,给外设供电)这也是为什么我调试的时候,能够成功的原因,因为Debug会一直持续为单片机供电,让单片机有电源。 é®é¢çåºå¤ |
但是不妨先在中断处理的地方加上一个延时,做一下软件滤波。然后关闭中断,不要让它反复进中断。
我认为是反复进了中断,尽管你的中断处理函数已经做了一些处理。但是我们知道按键抖动的话,你的main函数的延时可能根本比起作用。
在你确认按键事件之后,再开按键的中断。
最好把原理图拿上来看看
Key_Test-V1.1.rar
2018-12-12 10:36 上传
点击文件名下载附件
下载积分: ST金币 -15.2 MB, 下载次数: 26, 下载积分: ST金币 -1
没有工程的代码不看,因为无法验证。手敲代码太累,也没有在纸上写程序的习惯。
ST的样例中,无论是上沿、下沿、上下沿触发外部中断,在中断服务中都会判断IO当前状态,你这里没有。
至于去抖,除了软件去抖外,按键IO一般会加RC,纯属个人习惯。
HAL库的中断服务函数里面做了IO判断的,只是它将这一步封装到了HAL_GPIO_EXTI_IRQHandler里面
谢谢楼主的回答,我尝试一下
谢谢前辈的指教,因为,我需要使用到外部中断唤醒STM32的低功耗模式
谢谢前辈的指教