嵌入式S3C2440按键消抖--定时器操作

该博客介绍了如何使用定时器在S3C2440嵌入式系统中实现按键消抖。通过在驱动初始化时设置定时器,并在按键中断中设置定时时间,利用中断叠加处理物理抖动,确保只执行一次定时器中断以处理按键事件。
摘要由CSDN通过智能技术生成

主要思路:在驱动初始化函数中初始化定时器,但是不设置定时时间,定时时间在按键中断函数中来设置。这样一来在按键物理抖动的时候,中断叠加,一次等待中断还未结束,按键的抖动又产生中断,这样就会叠加,到最后只执行一次定时器中断函数,来处理按键按下之后的相关动作。

1.定义结构体  : static struct timer_list buttons_timer;这个结构体中存放定时器的各项参数

        2.在驱动初始化函数中进行定时器初始化,其实只是定义定时器超时函数

<span style="white-space:pre">	</span>init_timer(&buttons_timer);
	//buttons_timer.data     = (unsigned long) SCpnt;
	//buttons_timer.expires  = jiffies + 100*HZ;   /* 10s */
	buttons_timer.function = (void (*)(unsigned long)) buttons_timer_function;
	add_timer(&buttons_timer);  //把定时器告诉内核,超时到,调用函数
       3写出定时器超时处理函数

static void buttons_timer_function(unsigned long data)
{
	struct pin_desc * pindesc = irq_pd;
	unsigned int pinval;

	if(!pindesc)    //初始化中未设置超时时间,默认为0,所以一开始就满足超时函数执行,此时
		return;//并没有按键中断,在这里判断只有按键中断才会执行处理函数
	
	pinval = s3c2410_gpio_getpin(pindesc->pin);

	if (pinval)
	{
		/* 松开 */
		key_val = 0x80 | pindesc->key_val;
	}
	else
	{
		/* 按下 */
		key_val = pindesc->key_val;
	}

    ev_press = 1;                  /* 表示中断发生了 */
    wake_up_interruptible(&button_waitq);   /* 唤醒休眠的进程 */
	
	kill_fasync (&button_async, SIGIO, POLL_IN);
	
}
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值