按下按鈕產生中斷,在中斷處理程序中打開或關閉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");