使用F1C200S从零制作掌机之按键中断(定时器防抖)

中断概念

中断(Interrupt)是计算机硬件和操作系统中的一个重要概念,它能够使CPU在执行任务时暂停当前的运行,切换上下文从而响应硬件事件,处理输入输出数据或者承担其它任务,随后重新回到原来的上下文继续执行。这种机制使得计算机能够响应外部事件,并根据特定情况实时做出相应处理,是操作系统和应用程序正常运行的基础。

举一个实际的例子,比如当你在电脑上运行程序时,CPU在执行程序的指令,但是你突然按下了一个键盘上的按键,这时就会触发键盘对的中断信号,使得CPU暂停执行程序,切换上下文,去处理按键的输入信号,并通知对应的程序按键的具体信息,然后CPU会重新回到原来的上下文,结合应用程序运行状态继续执行指令。这个过程就是一个典型的中断流程,通过中断机制,计算机能够响应丰富多样的事件,从而控制设备的输入/输出、自动化控制、数据处理和通信等等。

简单说明一下,中断就是让计算机在做事情时候,停下来做其他事情,就叫中断。

查看中断情况

输入指令:cat /proc/interrupts

image-20240505233427317

gpio中断

GPIO中断(GPIO Interrupt)是指在嵌入式系统中,通过将硬件中断与GPIO(通用输入/输出)引脚连接起来,使得在GPIO引脚发生电平变化时,能够触发相应的中断处理。这种机制使得系统能够对GPIO引脚的状态变化做出实时响应,从而实现对硬件设备的控制和数据采集等功能。

例如,在树莓派(Raspberry Pi)中,可以使用GPIO引脚来连接外部设备,如按键、传感器、显示屏等等。通过配置GPIO引脚为输入模式,并将其与中断连接,可以实现对外部设备的状态进行实时监测,一旦设备状态发生变化,就能够触发中断,通知系统进行相应处理。例如,当按键被按下时,GPIO引脚的电平会发生变化,从而触发中断,系统就可以在中断处理函数中执行相应的操作,如启动计时器、记录事件等等。

gpio中断的四种模式

在硬件中断处理中,不同的触发方式描述了外部信号引起中断的具体时机和条件。下面是四种常见的触发方式的区别:

  1. 上升沿触发(IRQF_TRIGGER_RISING):当外部信号从低电平(0)变为高电平(1)时触发中断。适用于需要在信号从低电平变为高电平时进行处理的情况。
  2. 下降沿触发(IRQF_TRIGGER_FALLING):当外部信号从高电平(1)变为低电平(0)时触发中断。适用于需要在信号从高电平变为低电平时进行处理的情况。
  3. 高电平触发(IRQF_TRIGGER_HIGH):当外部信号保持在高电平时触发中断。适用于需要当信号保持在高电平时进行处理的情况。
  4. 低电平触发(IRQF_TRIGGER_LOW):当外部信号保持在低电平时触发中断。适用于需要当信号保持在低电平时进行处理的情况。

根据实际情况和外部信号变化的时机,可以选择适合的触发方式来实现对中断的响应和处理。

设备树

&pio {
        key_pins: key-pins{
                pins = "PE3";
                function = "gpio_in";
        };
};
/ {
        my_key: my-key{
                status = "okay";
                compatible = "allwinner,sunxi-pinctrl-key";
                pinctrl-names = "default";
                pinctrl-0 = <&key_pins>;
                key-gpios = <&pio 4 3 GPIO_ACTIVE_HIGH>;
        };
};

驱动实现gpio中断

#include <linux/types.h> 
#include <linux/kernel.h> 
#include <linux/delay.h> 
#include <linux/ide.h> 
#include <linux/init.h>
#include <linux/module.h> 
#include <linux/errno.h> 
#include <linux/gpio.h> 
#include <linux/cdev.h> 
#include <linux/device.h> 
#include <asm/mach/map.h> 
#include <asm/uaccess.h> 
#include <asm/io.h> 
#include <linux/of.h> 
#include <linux/of_address.h>
#include <linux/
  • 21
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值