STM32下使用定时器来来解决机械按键抖动

       在使用机械按键过程中,每当我们按下一次按键,可能不止有一次电平信号的变化,这会导致我们自己设计的程序在理想状态下是可行的,但真正使用时却会有这样那样的问题,而这一切问题的来源可能来自一个会抖动的机械按键,在我们按下时,因为反弹的原因,会导致电平信号的改变触发次数为两次以上,这显然是不行的,如何消除机械按键的抖动问题,在我看来,有三种方式,分别是:物理减震法、延时法、定时器触发法。

物理减震法

  通过在按键内部塞棉花的方式,使棉花成为按键反弹时的缓冲物,以此消除按键抖动。

延时法

在STM32里面,当我们按下按键时,因为存在抖动,所以会有二次以及多处触发按键的问题,因此我们可以通过使用延时函数卡住CPU的方式,当我们按下按键时,反弹产生的电平变化是一瞬间的事情,相当于一个毛刺,而我们按下到松开的这段时间却比一个毛刺的时间长度多得多,因此,我们可以在按下的瞬间,让CPU卡一定的时间再去判断按键所在的GPIO当前的电平,如果此时的GPIO口的电平为按键按下时的电平状态,则代表这是一次按键的触发,CPU执行按键触发后所发生的工作一次。但是,使用这种方式,也会存在一些问题,其一便是浪费CPU的资源,在我们按下按键时,CPU只能等待,而不能做其他工作,这对一下实时性要求相对高的任务来说显然是不行的。

定时器触发法

在STM32里,我们也可以使用定时器的方式来实现按键消抖,其原理和第二种方法有些类似,都是通过过一段时间来判断按键是否还在的方式来实现只触发一次CPU执行按键按下后的工作,而相对第二种方式,它的优点为它并不使用延时函数,而是采用定时器的方式,当我们按下按键时,按键所对应的GPIO口的中断服务函数执行,将原本为0的标志位置一,然后该标志位会触发定时器的其中一个时间片进行计数,当达到我们所设置的定时时长后,会将标志位置零,再去判断此时的电平情况,若此时为按键按下时的电平状态,则执行按下一次该按键后的操作,若此时为按键松开时的电平状态,则不会执行按键后的工作,在按下按键的这段时间内CPU不会进入延时函数中而是正常工作。

以下为使用定时器进行按键消抖的相关代码
 

/*
函数名称:EXTIO_IRQHandler
函数功能:EXTI0的外部中断服务函数
返回值:void
形参:void
函数说明:
当按下按键后,会触发中断服务函数,将原本为0的标志位置一
*/
u8 flag=0;
void EXTI0_IRQHandler(void)
{
	if(EXTI->PR&(1<<0))
	{
		EXTI->PR|=(1<<0);
		flag=1;
	}
}
/*
函数名称:
函数功能:TIM7的更新中断服务函数
返回值:void
形参:void
函数说明:
利用定时器的中断函数实现机械按键的消抖功能
*/
void TIM7_IRQHandler(void)
{
	static u16 a[3]={0};//创建时间片
	if(flag==1)//判断标志位
	{
		a[0]++;
		if(a[0]==100)//中断函数执行100次后执行下一步
		{
			a[0]=0;
			flag=0;//清除标志位
			if(KEY1)//判断此时的按键电平
				{
					//按键按下后所要进行的工作
				}
}

  • 2
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
好的,使用定时器也是一种实现按键长按短按双击的方法。 具体实现方法可以参考以下步骤: 1. 初始化定时器。选择合适的定时器,并设置定时器的时钟源、计数模式、计数周期等参数。一般推荐使用定时器的计数模式为向上计数,并且设置一个合适的计数周期。 2. 初始化按键。选择合适的引脚作为按键输入,配置引脚的输入模式和上拉/下拉电阻。一般推荐使用上拉电阻,使按键默认为高电平。 3. 在定时器中断服务函数中实现按键状态的检测和处理。在定时器中断服务函数中,读取按键状态,并根据当前状态和前一次状态的变化,判断按键事件的类型。如果按键被按下,则记录按下时间;如果按键被释放,则记录释放时间,并根据时间间隔判断按键事件的类型。 4. 根据按键事件的类型,执行相应的操作。例如,长按事件可以用于开启或关闭某个功能;短按事件可以用于切换不同的模式;双击事件可以用于执行快速操作。 注意事项: 1. 在定时器中断服务函数中,需要注意防处理。对于按键输入信号,由于存在抖动现象,因此需要使用软件或硬件方式进行防处理,以确保检测到的按键状态是稳定的。 2. 在定时器中断服务函数中,需要注意按键状态的检测间隔。检测间隔过短会导致系统负载过高,检测间隔过长会影响按键检测的灵敏度,因此需要选择一个合适的检测间隔。 3. 在定时器中断服务函数中,需要注意定时器的溢出问题。如果定时器的计数周期比较短,容易出现定时器溢出的情况,需要进行相应的处理。 总之,使用定时器实现按键长按短按双击需要结合具体的硬件平台和软件环境进行综合考虑,根据实际需求选择合适的方法。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值