zoukankan      html  css  js  c++  java
  • 使用GPIO监听中断

    #include<stdlib.h>
    #include<stdio.h>
    #include<string.h>
    #include<unistd.h>
    #include<fcntl.h>
    #include<poll.h>
     
    #define MSG(args...) printf(args) 
     
    //函数声明
    static int gpio_export(int pin);
    static int gpio_unexport(int pin);
    static int gpio_direction(int pin, int dir);
    static int gpio_write(int pin, int value);
    static int gpio_read(int pin);
    static int gpio_edge(int pin, int edge);
     
     
    static int gpio_export(int pin)  
    {  
        char buffer[64];  
        int len;  
        int fd;  
      
        fd = open("/sys/class/gpio/export", O_WRONLY);  
        if (fd < 0) 
        {  
            MSG("Failed to open export for writing!
    ");  
            return(-1);  
        }  
      
        len = snprintf(buffer, sizeof(buffer), "%d", pin);  
        printf("%s,%d,%d
    ",buffer,sizeof(buffer),len);
        if (write(fd, buffer, len) < 0) 
        {  
            MSG("Failed to export gpio!");  
            return -1;  
        }  
         
        close(fd);  
        return 0;  
    }  
    static int gpio_unexport(int pin)  
    {  
        char buffer[64];  
        int len;  
        int fd;  
      
        fd = open("/sys/class/gpio/unexport", O_WRONLY);  
        if (fd < 0) 
        {  
            MSG("Failed to open unexport for writing!
    ");  
            return -1;  
        }  
      
        len = snprintf(buffer, sizeof(buffer), "%d", pin);  
        if (write(fd, buffer, len) < 0) 
        {  
            MSG("Failed to unexport gpio!");  
            return -1;  
        }  
         
        close(fd);  
        return 0;  
    } 
    //dir: 0-->IN, 1-->OUT
    static int gpio_direction(int pin, int dir)  
    {  
        static const char dir_str[] = "inout";  
        char path[64];  
        int fd;  
      
        snprintf(path, sizeof(path), "/sys/class/gpio/gpio%d/direction", pin);  
        fd = open(path, O_WRONLY);  
        if (fd < 0) 
        {  
            MSG("Failed to open gpio direction for writing!
    ");  
            return -1;  
        }  
      
        if (write(fd, &dir_str[dir == 0 ? 0 : 3], dir == 0 ? 2 : 3) < 0) 
        {  
            MSG("Failed to set direction!
    ");  
            return -1;  
        }  
      
        close(fd);  
        return 0;  
    }  
    //value: 0-->LOW, 1-->HIGH
    static int gpio_write(int pin, int value)  
    {  
        static const char values_str[] = "01";  
        char path[64];  
        int fd;  
      
        snprintf(path, sizeof(path), "/sys/class/gpio/gpio%d/value", pin);  
        fd = open(path, O_WRONLY);  
        if (fd < 0) 
        {  
            MSG("Failed to open gpio value for writing!
    ");  
            return -1;  
        }  
      
        if (write(fd, &values_str[value == 0 ? 0 : 1], 1) < 0) 
        {  
            MSG("Failed to write value!
    ");  
            return -1;  
        }  
      
        close(fd);  
        return 0;  
    }
    static int gpio_read(int pin)  
    {  
        char path[64];  
        char value_str[3];  
        int fd;  
      
        snprintf(path, sizeof(path), "/sys/class/gpio/gpio%d/value", pin);  
        fd = open(path, O_RDONLY);  
        if (fd < 0) 
        {  
            MSG("Failed to open gpio value for reading!
    ");  
            return -1;  
        }  
      
        if (read(fd, value_str, 3) < 0)
        {  
            MSG("Failed to read value!
    ");  
            return -1;  
        }  
      
        close(fd);  
        return (atoi(value_str));
    }  
    // none表示引脚为输入,不是中断引脚
    // rising表示引脚为中断输入,上升沿触发
    // falling表示引脚为中断输入,下降沿触发
    // both表示引脚为中断输入,边沿触发
    // 0-->none, 1-->rising, 2-->falling, 3-->both
    static int gpio_edge(int pin, int edge)
    {
    const char dir_str[] = "nonerisingfallingboth"; 
    char ptr;
    char path[64];  
        int fd; 
    switch(edge)
    {
        case 0:
            ptr = 0;
            break;
        case 1:
            ptr = 5;
            break;
        case 2:
            ptr = 12;
            break;
        case 3:
            ptr = 20;
            break;
        default:
            ptr = 0;
    } 
      
        snprintf(path, sizeof(path), "/sys/class/gpio/gpio%d/edge", pin);  
        fd = open(path, O_WRONLY);  
        if (fd < 0) 
        {  
            MSG("Failed to open gpio edge for writing!
    ");  
            return -1;  
        }  
      
        if (write(fd, &dir_str[ptr], strlen(&dir_str[ptr])) < 0) 
        {  
            MSG("Failed to set edge!
    ");  
            return -1;  
        }  
      
        close(fd);  
        return 0;  
    }
    //GPIO1_17
    int main()  
    {  
        int gpio_fd, ret;
        struct pollfd fds[1];
        char buff[10];
        unsigned char cnt = 0;
     
        gpio_unexport(44);
        gpio_unexport(45);
     
        
        //p8_12 init
        gpio_export(44);
        gpio_direction(44, 1);//output out
        gpio_write(44, 1);
        
        //p8_11 init
        gpio_export(45);
        gpio_direction(45, 0);//input in
        gpio_edge(45,2);
        gpio_fd = open("/sys/class/gpio/gpio45/value",O_RDONLY);
        if(gpio_fd < 0)
        {
            MSG("Failed to open value!
    ");  
            return -1;  
        }
        fds[0].fd = gpio_fd;
        fds[0].events  = POLLPRI;
        
        while(1)
        {
            ret = read(gpio_fd,buff,10);
            if( ret == -1 )
            MSG("read
    ");
        
            ret = poll(fds,1,0);
            if( ret == -1 )
            MSG("poll
    ");
            if( fds[0].revents & POLLPRI)
            {
                ret = lseek(gpio_fd,0,SEEK_SET);
                if( ret == -1 )
                MSG("lseek
    ");
            
                //gpio_write(44, cnt++%2);
                printf("**********************************
    ");
            }
            usleep(5);
        }
        return 0;
    }
    
  • 相关阅读:
    c++<ctime>中常用函数
    头文件<cmath>中常用函数
    c++动态数组的使用
    迭代器与指针
    引用和指针做形参时的区别
    c++使用cin、cout与c中使用scanf、printf进行输入输出的效率问题
    c++指定输出小数的精度
    Linux命令学习(1)
    Nginx 配置文件nginx.conf中文详解
    Walle实现自动发布
  • 原文地址:https://www.cnblogs.com/chay/p/10587416.html
Copyright © 2011-2022 走看看