你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

STM32 外部中断按键控制问题

[复制链接]
西奥伟 提问时间:2018-12-5 18:04 /
本帖最后由 西奥伟 于 2018-12-12 15:15 编辑

最近在做一个电源有关的项目,通过按键控制开关机,按键是使用的外部中断,但是,为什么我Debug在线调试时,按键能够正常实现其功能,如果我取消Debug调试,正常运行,按键能够控制,但是,始终不能保持我的电源GPIO的引脚置高,按键按一下,电源指示灯闪烁一下,不能稳定亮起来。
这是我的程序,请教一下各位,看看我的代码写的是否有问题。

1

1

2

2

3

3

4

4

5

5



首先,感谢所有坛友对我提出的问题进行耐心的解答。然后,我已经找到最终导致出现问题的原因了,总结了一下是由于硬件设计的原因,我的项目是通过按键来实现短按开机,长按关机,短按时,需要把对应的GPIO置为高电平,才能够开机供电,但是,我使用的外部中断,还未等对应的GPIO置为高电平,单片机的CPU的时间戳就已经过了这一步。(也就是说正常工作模式下,根本就没有电源,给外设供电)这也是为什么我调试的时候,能够成功的原因,因为Debug会一直持续为单片机供电,让单片机有电源。

问题的出处

问题的出处


评分

参与人数 1 ST金币 +20 收起 理由
STMCU + 20

查看全部评分

收藏 1 评论18 发布时间:2018-12-5 18:04

举报

18个回答
watershade 回答时间:2018-12-12 12:12:41
我看了一下逻辑上应该没问题。代码也很工整。如果一直按着按键超过5秒,就认为是一次假的按键事件。如果短按的话就会让电源引脚保持高电平。
但是不妨先在中断处理的地方加上一个延时,做一下软件滤波。然后关闭中断,不要让它反复进中断。
我认为是反复进了中断,尽管你的中断处理函数已经做了一些处理。但是我们知道按键抖动的话,你的main函数的延时可能根本比起作用。
在你确认按键事件之后,再开按键的中断。

logic.JPG
五哥1 回答时间:2018-12-12 10:41:36
HAL库的,程序不完整,看的很累,分析,在DEBUG中能正常,但是在运行中又有问题,我认为有串口类的程序,执行到这,没有了,程序不报错,但是程序会不正常,不是你想要的结果,或者你的相应位置的延时不足,在DEBUG中完美的躲过这个,但是一运行就出问题。完全是根据多次工作实践瞎猜的。
shenxiaolin_mai 回答时间:2018-12-12 17:18:17
这个有问题的,不应该用外部中断来做计数而是增加定时器计数,外部中断触发之后,记录下当前中断的状态,开启定时器计数,计数器到了50ms之后,再去判断这个电平和开始记录的电平是否有变化,如果没有变化,将这值设置为有效值,如果有变化,说明外部干扰引起,舍弃该状态。
jeffhe1 回答时间:2018-12-12 09:29:44
按鍵是否有 做 debounce , 會不會這影響的
tanic 回答时间:2018-12-12 09:51:18
本帖最后由 tanic 于 2018-12-12 10:03 编辑

最好把原理图拿上来看看
chenyang601 回答时间:2018-12-12 10:05:20
做过按键采集程序,是一定要做消抖处理的。除非你外部配有触发器,不然,中断处理的时候,读到的电平是有问题的。而且还会反复。
qinlu123 回答时间:2018-12-12 10:36:41
按键最好不要用外部中断模式,因为按一次按键会触发多次中断处理起来很麻烦。不妨试试我的驱动。

Key_Test-V1.1.rar

下载

5.2 MB, 下载次数: 24, 下载积分: ST金币 -1

七哥 回答时间:2018-12-12 10:41:44
本帖最后由 toofree 于 2018-12-12 10:45 编辑

没有工程的代码不看,因为无法验证。手敲代码太累,也没有在纸上写程序的习惯。
ST的样例中,无论是上沿、下沿、上下沿触发外部中断,在中断服务中都会判断IO当前状态,你这里没有。
至于去抖,除了软件去抖外,按键IO一般会加RC,纯属个人习惯。

队长shiwo 回答时间:2018-12-12 10:42:29
按键按下不消抖的话,不知道按了多少下的了,一般加个软件延时消抖
Bowen 回答时间:2018-12-12 11:07:22
除了软件去抖外,按键IO一般会加RC,赞成!
西奥伟 回答时间:2018-12-12 14:48:17
toofree 发表于 2018-12-12 10:41
没有工程的代码不看,因为无法验证。手敲代码太累,也没有在纸上写程序的习惯。
ST的样例中,无论是上沿 ...

HAL库的中断服务函数里面做了IO判断的,只是它将这一步封装到了HAL_GPIO_EXTI_IRQHandler里面
西奥伟 回答时间:2018-12-12 14:49:40
watershade 发表于 2018-12-12 12:12
我看了一下逻辑上应该没问题。代码也很工整。如果一直按着按键超过5秒,就认为是一次假的按键事件。如果短 ...

谢谢楼主的回答,我尝试一下
西奥伟 回答时间:2018-12-12 14:52:00
qinlu123 发表于 2018-12-12 10:36
按键最好不要用外部中断模式,因为按一次按键会触发多次中断处理起来很麻烦。不妨试试我的驱动。 ...

谢谢前辈的指教,因为,我需要使用到外部中断唤醒STM32的低功耗模式
GKoSon 回答时间:2018-12-12 14:54:13
看上去有点晕 小事大办的感觉  我已经开始用buttondriver了 遇到过一个问题:板子外面有电阻的 按键可以是浮空输入 外面没有电阻的 按键一定要上拉输入 你看看板子
西奥伟 回答时间:2018-12-12 14:57:16
五哥1 发表于 2018-12-12 10:41
HAL库的,程序不完整,看的很累,分析,在DEBUG中能正常,但是在运行中又有问题,我认为有串口类的程序,执 ...

谢谢前辈的指教
12下一页

所属标签

相似问题

关于意法半导体
我们是谁
投资者关系
意法半导体可持续发展举措
创新和工艺
招聘信息
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
关注我们
st-img 微信公众号
st-img 手机版