stm32 程序设计 序言 - 从按键检测谈中断在单片机开发中的重要性

本文介绍了一种在STM32单片机上实现按键长按检测的方法,通过使用外部中断来检测按键按下,结合定时器中断进行消抖及计数,确保只有在按键被长按时才执行特定操作。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

引用块内容

大家都知道按键检测一般利用外部中断进行处理,在中断服务函数里面做延时消抖,以stm32f4为例,程序结构如下:
中断服务函数
{
if 判断中断标志位
延时15ms
检测是否按下
执行相应的操作
清除标志位
}
代码结构如下:
void EXTI0_IRQHandler(void )
{
if(EXTI_GetITStatus(EXTI_Line0)!=RESET)
{
delay_ms(15);
if(KEY_UP==1)
{
LED0_ON;
LED1_OFF;
}
}
EXTI_ClearITPendingBit(EXTI_Line0);
}
上述代码里delay_ms(15)表示需要消抖约15ms。程序实现的功能是检测到按键按下,并执行LED0_ON和LED1_OFF操作。
实际项目中,需要用到按键检测这个功能去实现某些特定的操作,如启动报警,设备关机等。这时我们就需要设定按键操作的时间,为什么呢,因为现场很多环境因素、人为意外碰触都会碰到按键,此时单片机会检测到按键按下了,会导致设备意外的操作,甚至关机。因此我们就有了新的需求:按键长按检测。那么怎么实现长按按键3秒后,执行上述的操作呢。
如果按照上面的思路,第一反应一般是,我延迟3s,把上面的时间延迟改为delay_ms(3000),不就可以了吗。一个新的思路出来了,大家就要想想程序有啥漏洞,以下几点需要注意:
(1) 会不会影响到其他程序运行。中断里面延迟3s,对单片机来讲,已经很长了,这样低优先级或者同优先级的中断任务就会停止运行。如果有个流水灯程序,流水灯有可能暂停三秒。
(2) 如果在延时3s的时间里,操作者松手2秒,再按上,程序一样运行。这也就是所谓的抖动。
为了解决上面的问题,提出下面解决思路:
(1) 为了及时相应按键按下这个动作,仍然采用外部中断检测按键按下这个触发信号。
(2) 进入外部中断函数后,不能采用延时消抖了,这里开启定时器中断消抖,同时关闭外部中断。定时器15ms进入一次中断,并检测按键是否按下,这样就可以避开中途按键抖动。
(3) 定时器中断中对有效的按键按下进行计数,同时对总时间进行计时。当总的时间到达3s后,再检查有效的按键计数,如果达到或接近3s,就认为按键已经按下3s,同时执行操作,关掉定时器,同时开启外部中断。
(4) 在定时器检测的过程中,因为采用中断,因此不会干扰到其他程序的运行。
注意事项:一般的开发板上的按键实现长按功能效果不佳,因为按键弹性和接触性不是很好,项目中如果需要长按检测功能,建议选择合适的按键。

初学者因为没有实际项目经验,在编写程序中,会有意无意的用delay函数去实现延时功能。加上大多数开发板程序都是入门级,因此单一的程序学习过后,觉得很简单,当程序结构复杂,需要实时处理大量数据时候,就尽量不用delay、还有while等延时函数,会导致数据丢包,程序卡顿。当然了,这里只讲裸机程序架构,实时操作系统的另当别论。
接下来会不定期上传常用的中断在实际项目中的应用,欢迎大家讨论,指出不足,共同进步。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

青山亦如是

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值