arm里使用定时器

定时器可以在中断里处理抖动

比如按键中断里,按键参数会进行跳变,所以要等待数值的稳定时候,才进行上报
我们可以把数值设置的大一点,模仿机械跳变,这样就可以看得出来,定时器真的被使用了

驱动编写
给每个按键提供定时器

在这里插入图片描述
在结构体里放入定时器

初始化定时器

在这里插入图片描述

1.给每个定时器设置,触发函数,并且为出发的函数提供数据
setup_timer(&buttons[i].timer, x6818_buttons_timer,(unsigned long)&buttons[i]);
2. 设置第一次的定时器超时时间
3. 把定时器进行添加

定时器函数编写

当到时间就可以触发定时器了,在里面进行按键的读取
在这里插入图片描述

触发定时器

我们在中断函数里触发定时器,所以先触发中断函数
在这里插入图片描述
中断函数里,设置超时时间,要是一直按就会延长超时时间,直到没有中断产生,才会触发定时器
这里设置了 HZ/5 = 1s/5 200ms 的延时,我们只要按的快,就不会读取值,为了测试定时器有没有用
在这里插入图片描述

测试结果

在这里插入图片描述
按的快就当作抖动消掉,还是不错的

源码

button_drv.ko


#include <linux/module.h>
#include <linux/kernel.h>
#include <linux/fs.h>
#include <linux/init.h>
#include <linux/delay.h>
#include <linux/poll.h>
#include <linux/sched.h>
#include <linux/irq.h>
#include <asm/irq.h>
#include <asm/io.h>
#include <linux/interrupt.h>
#include <asm/uaccess.h>
#include <linux/platform_device.h>
#include <linux/cdev.h>
#include <linux/miscdevice.h>
#include <linux/gpio.h>

#include <asm/mach-types.h>
#include <asm/gpio.h>
#include <asm/delay.h>
#include <mach/gpio.h>
#include <mach/soc.h>
#include <mach/platform.h>


#define DEVICE_NAME		"gecBt"                //设备名字

//按键结构体
struct button_desc {
   
	int gpio;
	int number;
	char *name;	
	struct timer_list timer;
};

//按键的管脚,编号,名字
static struct button_desc buttons[] = {
   
    	{
    (PAD_GPIO_B + 9 ), 0, "KEY0" },//B9
	{
    (PAD_GPIO_A + 28), 1, "KEY1" },//A28
    	{
    (PAD_GPIO_B + 30), 2, "KEY2" },//volup//B30
	{
    (
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值