zoukankan      html  css  js  c++  java
  • 树莓派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");
  • 相关阅读:
    位运算技巧2
    如果函数的参数是一个指针,不要指望用该指针去申请动态内存
    位运算 技巧1
    野指针?空指针?
    面试题:位操作实现四则运算
    面试题:递归颠倒栈 与栈排序
    求一个数任意位的值及位数
    基数排序
    面试题:最长回文子串(即求对称字符串的最大长度 )
    数据结构之后缀数组suffix array
  • 原文地址:https://www.cnblogs.com/brep/p/4281209.html
Copyright © 2011-2022 走看看