- 定时器消抖工作原理
-
在按键按下之后,进入中断处理函数,在中断处理函数中,定时时间10ms
-
当定时时间到,执行定时器处理函数,在定时器处理函数中,读取管脚的电平状态
-
如果读到的是低电平,表示按键按下
-
编写设备树
-

#include <linux/init.h>
#include <linux/module.h>
#include <linux/of.h>
#include <linux/of_gpio.h>
#include <linux/timer.h>
#include <linux/of_irq.h>
#include <linux/interrupt.h>
/*
myled{
extend-led{
led1 = <&gpioe 10 0>; //LED1 PE10
led2 = <&gpiof 10 0>; //LED2 PF10
led3 = <&gpioe 8 0>; //LED3 PE8
};
core-led{
"led" = <&gpioz 5 0>,<&gpioz 6 0>,<&gpioz 7 0>; //LED1 PE10
};
};mykey{
interrupt-parent = <&gpiof>;
interrupts = <9 0>,<7 0>,<8 0>;
};
*/
struct device_node *node;
int gpiono;
char *name[3] = {"led1", "led2", "led3"};struct timer_list mytimer; // 分配定时器对象
// 定时器处理函数
void timer_func(struct timer_list *timer)
{
int i = gpio_get_value(gpiono);
if(i==0)
{
printk("引脚为低电平");
}
else
{
printk("引脚为高电平");
}
}int irqno;
// 中断处理函数
irqreturn_t key_irq_handler(int irq, void *dev)
{
printk("key1 down!!!!!\n");
mytimer.expires = jiffies + 100; // 定时时间为1s
timer_setup(&mytimer, timer_func, 0); // 定时器初始化
add_timer(&mytimer); // 启动定时器
return IRQ_HANDLED; // 表示中断处理完成
}// 入口
static int __init demo_init(void)
{
int ret;
// 解析设备树节点信息
node = of_find_node_by_name(NULL, "myled"); // 通过节点的名字获取节点相关信息
if (node == NULL)
{
printk("of find node by name is error\n");
return -EIO;
}// 映射软中断号 irqno = irq_of_parse_and_map(node, 0); if (irqno < 0) { printk("irq of parse and map is error\n"); return -EIO; } gpiono = of_get_named_gpio(node, name[0], 0); if (gpiono < 0) { printk("of get named gpio is error"); return -EIO; } // 注册中断子系统 ret = request_irq(irqno, key_irq_handler, IRQF_TRIGGER_FALLING, "KEY1", NULL); if (ret) { printk("request irq is error\n"); return -EIO; } return 0;}
// 出口 卸载驱动 LED1熄灭
static void __exit demo_exit(void)
{
//设置gpio编号输出低电平
gpio_direction_output(gpiono, 0);
// 释放gpio编号
gpio_free(gpiono);
del_timer(&mytimer);
// 注销中断
free_irq(irqno, NULL);
}module_init(demo_init); // 指定入口地址
module_exit(demo_exit); // 指定出口地址
MODULE_LICENSE("GPL"); // 遵循GPL协议
-
24.4.17 驱动开发定时器作业,消抖
_xia_123456782024-04-18 8:42
相关推荐
云梦谭21 小时前
让 Linux 主动连接 Windows:配置 Windows 11 SSH 服务端奇树谦21 小时前
Windows CMD 下 mc 运维指南:SeaweedFS 安装验收与 MinIO 数据迁移keren21 天前
SceneDock:Windows 场景化工作台——一键启动工作链,还能被 AI Agent 调用(CLI / MCP)成旭先生1 天前
车辆、能源与地理数据 API 实战:把定价、油价、行政区划串成一条链路seahahacsdn1 天前
Windows获取SYSTEM用户权限的方法应用-计划任务上海云盾-小余1 天前
七层 CC 攻击检测难点:如何区分真实用户与攻击请求2501_915106321 天前
Windows 上开发 Unity iOS,使用 KXBuild 进行真机调试、性能采样与打包 ipa西柚不烦恼1 天前
Windows 本地部署私有 AI 全攻略:纯 CPU 环境(Ollama + Open WebUI)少年的范儿1 天前
Windows 安装 Node.js 教程:nvm 版本管理 + pnpm 安装配置bu_shuo1 天前
删除Windows资源管理器左侧【此电脑】的Linux企鹅图标