按下按钮产生中断,在中断处理程序中打开或关闭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\n");
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!\n");
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\n");
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");