OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 1210|回复: 8

关于CORTEX-M0+单片机的程序崩溃问题

[复制链接]

12

主题

67

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
451
金钱
451
注册时间
2024-8-27
在线时间
55 小时
发表于 2026-5-25 09:35:55 | 显示全部楼层 |阅读模式
1金钱

按键扫描

按键扫描

按键按下检测

按键按下检测

原理图

原理图
41d6840b-546d-406b-8308-be672566eced.png ,如图所示按键检测程序只要放入定时器中断中执行就会出现各种显示异常或崩溃(只是把按键电平检测及状态扫描放在中断,其它事件处理还是在主程序,且中断中没有占用系统资源大的程序),但按键检测只要放在主程序中执行就正常(但会出现反应延迟大或不灵的现像,反以想放在中断中执行,提升实时响应性),想过各种办法,就算在中断中什么都不做,只放一个按键检测功能都还是会出问题,相关变量也用VOLATILE了,还是解决不了,求各位大佬指点下是什么原因造成的程序异常或者崩溃(有时会出现黑屏,立即重启后也黑屏,要关机过几秒重启才会有显示),咸激不尽。

回复

使用道具 举报

25

主题

684

帖子

0

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
1358
金钱
1358
注册时间
2012-4-25
在线时间
198 小时
发表于 2026-5-25 16:29:31 | 显示全部楼层
4个按键10行代码搞定的事,你整这么复杂。
会死机,肯定是变量越界访问了,
1-1
回复

使用道具 举报

12

主题

67

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
451
金钱
451
注册时间
2024-8-27
在线时间
55 小时
 楼主| 发表于 2026-5-25 20:05:54 | 显示全部楼层
mygod 发表于 2026-5-25 16:29
4个按键10行代码搞定的事,你整这么复杂。
会死机,肯定是变量越界访问了,

不好意思大佬,能说的具体些吗?本人新手一枚,变量越界具体是指哪个变量,是按键数组变量吗?还是您说的10行代码是非阻塞的方式吗?能具体说下思路吗?感激不尽。。。
回复

使用道具 举报

69

主题

6722

帖子

0

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
13584
金钱
13584
注册时间
2012-11-26
在线时间
3863 小时
发表于 2026-5-26 17:50:19 | 显示全部楼层
去网上找个按键驱动,移植一下,这种驱动满天飞,还支持长按短按的
学无止境
回复

使用道具 举报

12

主题

67

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
451
金钱
451
注册时间
2024-8-27
在线时间
55 小时
 楼主| 发表于 2026-5-27 08:43:40 | 显示全部楼层
好吧,其实我的这些代码思路也是从网上学到的,新人自已摸索很艰难,我再找找问题,总之多谢两位大佬指点,
回复

使用道具 举报

1

主题

99

帖子

0

精华

高级会员

Rank: 4

积分
902
金钱
902
注册时间
2020-6-12
在线时间
320 小时
发表于 2026-6-2 14:45:08 | 显示全部楼层
看起来  按键检测中没有while可能会卡住中断的情况。   可以在主程序中测试 按键检测软件执行 花费的耗时,    肯定超过了中断周期。  所以会导致中断崩溃。 再去想办法优化执行耗时。
回复

使用道具 举报

8

主题

602

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
3028
金钱
3028
注册时间
2016-5-13
在线时间
191 小时
发表于 2026-6-4 14:53:02 | 显示全部楼层
这新手新的不能再新了。捂脸笑。崭新崭新的。
中断里面你敢放这个,我醉了。
按键检测你放main的while里呀。
中断不是这么用的。
你觉得响应慢,是因为你没有加去抖,没有加按钮状态锁。
虽然不明白你们在说什么,但感觉很厉害的样子。
回复

使用道具 举报

8

主题

602

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
3028
金钱
3028
注册时间
2016-5-13
在线时间
191 小时
发表于 2026-6-4 15:00:43 | 显示全部楼层
本帖最后由 电脑小白 于 2026-6-4 15:02 编辑

比如:
uint8_t IN1_lock=0;
……
while(1){
……
if(IN1==0&&IN1_lock==0){
    delay10毫秒
    if(IN1==0){
       IN1_lock=1;
    }
}
if(IN1!=0&&IN1_lock!=0){
    delay10毫秒
    if(IN11!=0){
      IN1_lock=0;
    }
}
……
//使用的时候只需要判断IN1_lock是否==1
if(IN1_lock!=0){
//disp你先要的东西,实现你要的功能
}
……

}//end whlie

虽然不明白你们在说什么,但感觉很厉害的样子。
回复

使用道具 举报

8

主题

602

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
3028
金钱
3028
注册时间
2016-5-13
在线时间
191 小时
发表于 2026-6-9 10:42:05 | 显示全部楼层
虽然不明白你们在说什么,但感觉很厉害的样子。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /1 下一条

正点原子公众号

如发现本坛存在违规或侵权内容, 请点击这里发送邮件举报 (或致电020-38271790)。请提供侵权说明和联系方式。我们将及时审核依法处理,感谢配合。

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2026-6-25 03:24

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表