[经验] GPIO意外中断及处理

Gen_X   2024-7-18 11:37 楼主

芯片:STM32G030,  GPIO:PA12 ,功能:中断后LCD菜单选择

现象:每10秒左右就发生1-3次中断,至少一次不固定。

原因:GPIO外部中断输入方式,上拉,按钮将此PIN接地,产生FALLING中断。

           猜测由于上拉电阻(内部10k)较大,引脚未接电容降噪,导致悬空不稳定。

处理:中断后10mS防抖动确认(未能消除误动),然后增加了延时按键释放确认,结果“中断”非常准确。

遗憾:只是应急软件处理了,但不知道原因。这个引线长度只有25mm 长度 PCB引线,并且4周都包围在GND中,没有外部干扰源,

           电源为5VDC-3.3V,47uF+0.1+0.1,不应该有问题,想不通。望高人指点。

چوآن شـين

回复评论 (15)

按键处理最好用定时中断。定时器设为10ms中断一次,每次扫描一下按键,连续N次,比如8次为0则肯定为0

连续N次为1肯定为1.这样抖动自然消除。而且非常稳定。

点赞  2024-7-18 12:26

楼上的是一种方法,你这个问题大概率是软件的毛病,硬件的话就是开关有毛病。

软件的话IO配置,也要仔细看看。因为程序运行过程中IO配置有可能改动。

点赞  2024-7-18 13:46

每10秒左右就发生1-3次中断 ?

是不是哪里把噪声或者干扰引进去了

默认摸鱼,再摸鱼。2022、9、28
点赞  2024-7-18 14:15
引用: damiaa 发表于 2024-7-18 12:26 按键处理最好用定时中断。定时器设为10ms中断一次,每次扫描一下按键,连续N次,比如8次为0则肯定为0 连 ...

非常感谢!方法可以。

但实际的按键较快的操作在8-12ms,也就是说做个3ms中断读GPIO,读到约2-4次,如果不是PCB面积紧张,我宁愿选择价格0.01的电容,加上简单的防抖软件即可。

换句还说,对于“开关”的中断方式输入,最好是软硬结合,否则意外太多,关键是使用了较多的资源。要不是低电平触发,我一定会修改为上升沿触发中断,应该更稳定一点。

چوآن شـين
点赞  2024-7-18 16:08
引用: Gen_X 发表于 2024-7-18 16:08 非常感谢!方法可以。 但实际的按键较快的操作在8-12ms,也就是说做个3ms中断读GPIO,读到约2-4次,如 ...

按键一般没那么快,手的动作最快也是零点几秒,也就是几百毫秒。最快0.1秒。这是一

其二 如果按键实在快,你担心一次扫不到那么多次,你可以把定时中断搞成1毫秒,2毫秒一次。也可以减少采用次数判断的那个N。

反正一句话,足够你怎么弄得稳定。不用担心。 外加电容什么的是没得用处的。

 

点赞  2024-7-18 16:15

以前又个帖子,看看有没有用https://bbs.eeworld.com.cn/thread-501060-1-1.html

点赞  2024-7-18 17:05

每10秒左右就发生1-3次中断,至少一次不固定。是软件的现象嘛?可以拿示波器抓一下这个中断引脚,看看情况

点赞  2024-7-18 17:12

硬软件都没有修改,只在防抖动延时后加了一句:

__HAL_GPIO_EXTI_CLEAR_FALLING_IT(GPIO_Pin);

就好了,真不知道什么原因。

我习惯认为HAL库在每个中断的入口都执行了“CLEAR”(实际是这样),所以一般中断CALLBACK里我都不加“CLEAR”,这样是HAL库的有点,但这回改了我的认知:

如果不是时间资源绝对紧张,看样子“CLEAR”可以再加,不要怕多余,最少能防止中断后的“意外"残余中断触发。当然,要承认误触发是存在的,但通过防抖可以排除。

总结原因:是个人习惯,CALLBACK中一般都不加中断标志的“CLEAR”,致使多次不稳定终断残余(毛刺)引起多次引发中断。

感谢@wangerxian 以及其他网友的耐心解答和分析。

本帖最后由 Gen_X 于 2024-7-19 08:38 编辑
چوآن شـين
点赞  2024-7-19 08:29

通过这个小小的”项目“,本人领教了STM32G030做的小系统在220VAC-3.3vDC的回路里还是可以使用的,稳定性超过了我的认知,过去用过PIC16和51做的变压器+线性稳压的测控回路,吃尽了苦头,一至于很长一段时间认为单片机用在工控里有点可怕。

也许使以前器件的原因,CPU手都不能靠近,轻则死机,重则程序跑飞,所以才有软硬兼施的WDT的刚需。现在的32ARM运行中像猫一样温顺,从不发脾气。

本帖最后由 Gen_X 于 2024-7-19 09:07 编辑
چوآن شـين
点赞  2024-7-19 08:47

学习了,谢谢分享,对软件滤波的应用理解更深了

点赞  2024-7-19 10:48

 电源为5VDC-3.3V,47uF+0.1+0.1,不应该有问题,想不通。望高人指点。

上逻辑分析仪,或者示波器,抓一下IO的波形。

点赞 (1) 2024-7-20 06:16

问题解决了吗? 是什么造成的?

点赞  2024-7-20 19:58

不相关的一个PWM,是每10秒一个的,虽然PCB不在同一层,并且没有平行段,

但因为有立体交叉,导致有不想要的中断产生(10秒周期可以证明,但中断次数每周期次数1-3次不定)。

这个“无关”的PWM每次产生是上沿会有感应中断,有时下沿也会有,所以感觉中断次数比较多,并且10ms“消抖”都能穿越,本人也想不通!

本帖最后由 Gen_X 于 2024-7-22 09:50 编辑
چوآن شـين
点赞  2024-7-21 19:31
引用: damiaa 发表于 2024-7-18 16:15 按键一般没那么快,手的动作最快也是零点几秒,也就是几百毫秒。最快0.1秒。这是一 其二 如果按键 ...

这个方法可以,在资源充足的情况下软件能实现的肯定用软件最好。

我自己测量过我的手按键最快速度是11ms,偶尔能到9ms,多数人在16以上;

一般电子类微动开关都在15-30之间(最快);

中间继电器机电类产品一般大概在10-30ms;

接触器和大部分的机械开关在35~50ms以上,有大到150ms以上,

所以大家防抖时间根据开关实际情况,一般选在8-23内。

چوآن شـين
点赞  2024-7-24 07:57
加入延时释放,其实进行了降噪处理,说明软件没问题,试试用示波器打打GPIO:PA12的波形。
点赞 (1) 2024-9-30 14:37
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 京公网安备 11010802033920号
    写回复