Linux下按键消抖实验

2023-10-28 04:20
文章标签 linux 实验 按键 消抖

本文主要是介绍Linux下按键消抖实验,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

文章目录

  • 前言
  • 一、按键消抖
  • 二、代码文件
    • 1.key_shake_elimination.c文件
    • 2.Makefile文件
  • 三、实验结果
  • 总结

前言

本文的主要内容是做一个按键消抖实验,其消抖的实现是通过定时器来实现的。


一、按键消抖

为什么要进行按键消抖呢,先看下图,我们把按键按下去之后,理想的波形情况应该是下图中的第一个图,但实际波形却是第二个图,因此,要去掉第二个图中的抖动,保证系统功能的可靠性,就要进行按键消抖。
在这里插入图片描述
如果使用延时函数消抖,系统的实时性会打折扣,这不符合中断上文的理念——即处理事情越快越好。本文使用的是定时器来进行按键消抖的。


二、代码文件

1.key_shake_elimination.c文件

#include <linux/init.h> 
#include <linux/module.h> 
#include <linux/of.h> 
#include <linux/of_address.h> 
#include <linux/platform_device.h> 
#include <linux/gpio.h> 
#include <linux/of_gpio.h> 
#include <linux/interrupt.h> 
#include <linux/of_irq.h> 
#include <linux/timer.h>static void timer_function(unsigned long data);
struct device_node *test_device_node;
struct property *test_node_property;
int gpio_num;
int irq;DEFINE_TIMER(test_timer,timer_function,0,0); //静态定义结构体变量并且初始化function,expires,data成员static void timer_function(unsigned long data)
{printk("This is timer function!\n");
}irq_handler_t test_key(int irq, void *args)  //中断服务函数
{printk("test_key trigger off!\n"); test_timer.expires = jiffies + msecs_to_jiffies(20); //延时20msadd_timer(&test_timer);  //向Linux内核注册定时器return IRQ_HANDLED;
}
int dts_probe(struct platform_device *pdev)
{int ret = 0;printk("dts_probe matching ok!\n");/*查找节点*/test_device_node = of_find_node_by_path("/test_key");  //在设备树节点中查找test_key这个节点if(test_device_node == NULL){printk("of_find_node_by_path is error!\n");return -1;}/*获得gpio编号*/gpio_num = of_get_named_gpio(test_device_node,"key-gpio",0);if(gpio_num < 0){printk("of_get_named_gpio is error!\n");return -1;}/*设置gpio的方向*/gpio_direction_input(gpio_num); //输入/*获得gpio中断号*///irq = gpio_to_irq(gpio_num); irq = irq_of_parse_and_map(test_device_node,0); //与上面这句代码的作用相同printk("irq is %d\n", irq);/*申请中断*/ret = request_irq(irq, test_key, IRQF_TRIGGER_RISING, "test_key", NULL); //IRQF_TRIGGER_RISING为上升沿触发,定义在/linux-4.1.15/include/linux/interrupt.h中if(ret < 0){printk("request_irq is error!\n");return -1;}return 0;
}int dts_remove(struct platform_device *pdev)
{printk("dts_remove!\n");return 0;
}const struct platform_device_id dts_idtable = {.name = "dts_test1"  //匹配优先级 第二
};const struct of_device_id of_match_table_test[] = {{.compatible = "led_keys"},   //匹配优先级 第一{}
};struct platform_driver dts_device = {.probe = dts_probe,.remove = dts_remove,.driver = {.owner = THIS_MODULE,.name = "dts_test2", //匹配优先级 第三.of_match_table = of_match_table_test},.id_table = &dts_idtable
};static int dts_driver_init(void)
{int ret = 0;ret = platform_driver_register(&dts_device);if(ret < 0) {printk("platform_driver_register error!\n");return ret;}printk("platform_driver_register ok!\n");return 0;
}
static int dts_driver_exit(void)
{printk("dts_driver_exit!\n");free_irq(irq,NULL);platform_driver_unregister(&dts_device);
}
module_init(dts_driver_init);
module_exit(dts_driver_exit);
MODULE_LICENSE("GPL");

2.Makefile文件

obj-m += key_shake_elimination.o
KDIR:=/linux/linux-4.1.15
PWD?=$(shell pwd)
all:make -C $(KDIR) M=$(PWD) modules
clean:make -C $(KDIR) M=$(PWD) clean

三、实验结果

将上面的代码写好之后编译,然后将驱动发送至开发板,开发板加载驱动后按下按键一次,打印一次,结果如下图所示。
请添加图片描述


总结

以上就是按键消抖实验的所有内容了。
本文参考视频:https://www.bilibili.com/video/BV1Vy4y1B7ta?p=41。

这篇关于Linux下按键消抖实验的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!


原文地址:https://blog.csdn.net/weixin_42570192/article/details/121588566
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.chinasem.cn/article/290642

相关文章

Linux基础命令@grep、wc、管道符的使用详解

《Linux基础命令@grep、wc、管道符的使用详解》:本文主要介绍Linux基础命令@grep、wc、管道符的使用,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐... 目录grep概念语法作用演示一演示二演示三,带选项 -nwc概念语法作用wc,不带选项-c,统计字节数-

Linux CPU飙升排查五步法解读

《LinuxCPU飙升排查五步法解读》:本文主要介绍LinuxCPU飙升排查五步法,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录排查思路-五步法1. top命令定位应用进程pid2.php top-Hp[pid]定位应用进程对应的线程tid3. printf"%

Linux下安装Anaconda3全过程

《Linux下安装Anaconda3全过程》:本文主要介绍Linux下安装Anaconda3全过程,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录简介环境下载安装一、找到下载好的文件名为Anaconda3-2018.12-linux-x86_64的安装包二、或者通

Linux系统之stress-ng测压工具的使用

《Linux系统之stress-ng测压工具的使用》:本文主要介绍Linux系统之stress-ng测压工具的使用,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、理论1.stress工具简介与安装2.语法及参数3.具体安装二、实验1.运行8 cpu, 4 fo

Linux lvm实例之如何创建一个专用于MySQL数据存储的LVM卷组

《Linuxlvm实例之如何创建一个专用于MySQL数据存储的LVM卷组》:本文主要介绍使用Linux创建一个专用于MySQL数据存储的LVM卷组的实例,具有很好的参考价值,希望对大家有所帮助,... 目录在Centos 7上创建卷China编程组并配置mysql数据目录1. 检查现有磁盘2. 创建物理卷3. 创

Linux查看系统盘和SSD盘的容量、型号及挂载信息的方法

《Linux查看系统盘和SSD盘的容量、型号及挂载信息的方法》在Linux系统中,管理磁盘设备和分区是日常运维工作的重要部分,而lsblk命令是一个强大的工具,它用于列出系统中的块设备(blockde... 目录1. 查看所有磁盘的物理信息方法 1:使用 lsblk(推荐)方法 2:使用 fdisk -l(

Linux中的more 和 less区别对比分析

《Linux中的more和less区别对比分析》在Linux/Unix系统中,more和less都是用于分页查看文本文件的命令,但less是more的增强版,功能更强大,:本文主要介绍Linu... 目录1. 基础功能对比2. 常用操作对比less 的操作3. 实际使用示例4. 为什么推荐 less?5.

linux lvm快照的正确mount挂载实现方式

《linuxlvm快照的正确mount挂载实现方式》:本文主要介绍linuxlvm快照的正确mount挂载实现方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录linux lvm快照的正确mount挂载1. 检查快照是否正确创建www.chinasem.cn2.

Linux给磁盘扩容(LVM方式)的方法实现

《Linux给磁盘扩容(LVM方式)的方法实现》本文主要介绍了Linux给磁盘扩容(LVM方式)的方法实现,涵盖PV/VG/LV概念及操作步骤,具有一定的参考价值,感兴趣的可以了解一下... 目录1 概念2 实战2.1 相关基础命令2.2 开始给LVM扩容2.3 总结最近测试性能,在本地打数据时,发现磁盘空

Linux网络配置之网桥和虚拟网络的配置指南

《Linux网络配置之网桥和虚拟网络的配置指南》这篇文章主要为大家详细介绍了Linux中配置网桥和虚拟网络的相关方法,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 一、网桥的配置在linux系统中配置一个新的网桥主要涉及以下几个步骤:1.为yum仓库做准备,安装组件epel-re