樹莓派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\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");

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM