linux驱动开发--定时器

在我们的按键外部中断程序中,如何使用定时器进行消抖处理:

首先在init函数中进行定时器的初始化

init_timer(&catc->timer);

catc->timer.data = (long) catc;          //要想传递的参数

catc->timer.function =buttons_timer_function;    //定时器中断的执行函数

//buttons_timer.expires  = 0;                        //设置的超时时间
add_timer(&buttons_timer);                      //增加到链表里面

因为我们第一次没有设置超时时间,也就是默认为  (//buttons_timer.expires  = 0;                        //设置的超时时间)

所以程序会直接跳转到  定时器中断函数中执行,所以我们在前面要进行判断  

if(!pindesc)

    return;

消除第一次定时器中断的影响

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

	if (!pindesc)
		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);
}

接下来来看我们的外部中断函数

第一条语句是获取当前的状态,

第二条语句是设置定时器时间,也就是在当前时间基准上增加

            当等待定时器时间到达的过程中,如果再次发生外部中断,说明就是按键的波动产生的,我们就又在基准时间上延后10ms,

            也就是我们认定10ms之内没有产生波动,认定按键稳定,再来判断按键的状态

static irqreturn_t buttons_irq(int irq, void *dev_id)
{
	/* 10ms后启动定时器 */
	irq_pd = (struct pin_desc *)dev_id;
	mod_timer(&buttons_timer, jiffies+HZ/100);
	return IRQ_RETVAL(IRQ_HANDLED);
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值