树莓派GPIO中断驱动程序

按下按钮产生中断,在中断处理程序中打开或关闭LED灯。

原理图

接线方式如下图,GPIO25通过10K上拉电阻接3.3V,按下按钮开关后GPIO为0V,用10uF电容消除抖动。GPIO8接LED。

程序

 1 /* Raspberry pi GPIO interrupt processing example
 2  * Light on LED with BUTTON press
 3  */
 4 
 5 #include <linux/init.h>
 6 #include <linux/module.h>
 7 #include <linux/gpio.h>
 8 #include <linux/interrupt.h>
 9 
10 #define BUTTON_PIN 25    /* GPIO 25 */
11 #define LED_PIN 8    /* GPIO 8 */
12 
13 int flag = 0;
14 
15 static irqreturn_t irq_handler(int irq, void *dev)
16 {
17     gpio_set_value(LED_PIN, !gpio_get_value(LED_PIN));
18     return IRQ_HANDLED;
19 }
20 
21 static int led_init(void)
22 {
23     int err;
24     
25     printk(KERN_INFO "LED init
");
26     
27     err = gpio_request_one(BUTTON_PIN, GPIOF_IN, "Light Button");
28     if (err) return err;
29 
30     err = gpio_request_one(LED_PIN, GPIOF_OUT_INIT_LOW, "LED light");
31     if (err) return err;
32 
33     enable_irq(gpio_to_irq(BUTTON_PIN));
34     err = request_irq(gpio_to_irq(BUTTON_PIN), irq_handler, 
35             IRQF_TRIGGER_FALLING, "LED Test", NULL);
36     if (err < 0) {
37         printk("irq_request failed!
");
38         return err;
39     }
40     flag = 1;
41     return 0;
42 }
43 
44 static void led_exit(void)
45 {
46     printk(KERN_INFO "LED exit
");
47     if(flag) free_irq(gpio_to_irq(BUTTON_PIN), NULL);
48     gpio_free(BUTTON_PIN);
49     gpio_free(LED_PIN);
50 }
51 
52 
53 module_init(led_init);
54 module_exit(led_exit);
55 
56 MODULE_LICENSE("Dual BSD/GPL");
原文地址:https://www.cnblogs.com/brep/p/4281209.html