码迷,mamicode.com
首页 > 其他好文 > 详细

GPIO编程2:使用GPIO监听中断完整程序

时间:2018-10-02 17:50:13      阅读:183      评论:0      收藏:0      [点我收藏+]

标签:static   stat   监听   fail   def   port   div   roman   const   

一个完整的使用GPIO捕捉中断的程序:

#include <stdlib.h> 
#include <stdio.h>  
#include <string.h>
#include <unistd.h>
#include <fcntl.h>
#include <poll.h>

#define SYSFS_GPIO_EXPORT              "/sys/class/gpio/export"  
#define SYSFS_GPIO_UNEXPORT            "/sys/class/gpio/unexport"

int gpio_export(int pin);
int gpio_unexport(int pin);
int gpio_direction(int pin, int dir);
int gpio_write(int pin, int value);
int gpio_read(int pin);


int gpio_export(int pin)  
{  
    char buffer[64];  
    int len;  
    int fd;  
  
    fd = open(SYSFS_GPIO_EXPORT, O_WRONLY);  
    if (fd < 0) 
    {  
        printf("Failed to open export for writing!\n");  
        return(-1);  
    }  
  
    len = snprintf(buffer, sizeof(buffer), "%d", pin);  
    if (write(fd, buffer, len) < 0) 
    {  
        printf("Failed to export gpio!\n");         
    }  
     
    close(fd);  
    return 0;  
}  

int gpio_unexport(int pin)  
{  
    char buffer[64];  
    int len;  
    int fd;  
  
    fd = open(SYSFS_GPIO_UNEXPORT, O_WRONLY);  
    if (fd < 0) 
    {  
        printf("Failed to open unexport for writing!\n");  
        return -1;  
    }  
  
    len = snprintf(buffer, sizeof(buffer), "%d", pin);  
    if (write(fd, buffer, len) < 0) 
    {  
        printf("Failed to unexport gpio!\n");  
        return -1;  
    }  
     
    close(fd);  
    return 0;  
} 


//dir: 0-->IN, 1-->OUT
int gpio_direction(int pin, int dir)  
{  
    static const char dir_str[] = "in\0out";  
    char path[64];  
    int fd;  
  
    snprintf(path, sizeof(path), "/sys/class/gpio/gpio%d/direction\n", pin);  
    fd = open(path, O_WRONLY);  
    if (fd < 0) 
    {  
        printf("Failed to open gpio direction for writing!\n");  
        return -1;  
    }  
  
    if (write(fd, &dir_str[dir == 0 ? 0 : 3], dir == 0 ? 2 : 3) < 0) 
    {  
        printf("Failed to set direction!\n");  
        return -1;  
    }  
  
    close(fd);  
    return 0;  
}  

//value: 0-->LOW, 1-->HIGH
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) {  
        printf("Failed to open gpio value for writing!\n");  
        return -1;  
    }  
  
    if (write(fd, &values_str[value == 0 ? 0 : 1], 1) < 0) 
    {  
        printf("Failed to write value!\n");  
        return -1;  
    }  
  
    close(fd);  
    return 0;  
}

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)
     {  
        printf("Failed to open gpio value for reading!\n");  
        return -1;  
    }  
  
    if (read(fd, value_str, 3) < 0) 
    {  
        printf("Failed to read value!\n");  
        return -1;  
    }  
  
    close(fd);  
    return (atoi(value_str));
}  


/*
    none表示引脚为输入,不是中断引脚
    rising表示引脚为中断输入,上升沿触发
    falling表示引脚为中断输入,下降沿触发
    both表示引脚为中断输入,边沿触发
*/
// 0-->none, 1-->rising, 2-->falling, 3-->both
int gpio_edge(int pin, int edge)
{
    const char dir_str[] = "none\0rising\0falling\0both"; 
    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;
            break;
    }
  
    snprintf(path, sizeof(path), "/sys/class/gpio/gpio%d/edge", pin);  
    fd = open(path, O_WRONLY);  
    if (fd < 0) 
    {  
        printf("Failed to open gpio edge for writing!\n");  
        return -1;  
    }  
  
    if (write(fd, &dir_str[ptr], strlen(&dir_str[ptr])) < 0)
    {  
        printf("Failed to set edge!\n");  
        return -1;  
    }  
  
    close(fd);  
    return 0;  
}


int main()  
{ 
    int PIN = 481;
 
    int gpio_fd, ret;
    struct pollfd fds[1];
    char buff[10];
    unsigned char cnt = 0;
    //按键引脚初始化
    gpio_export(PIN);
    gpio_direction(PIN, 0);
    gpio_edge(PIN,2);
    gpio_fd = open("/sys/class/gpio/gpio481/value",O_RDONLY);
    if(gpio_fd < 0)
    {
        printf("Failed to open value!\n");  
        return -1;  
    }

    fds[0].fd = gpio_fd;
    fds[0].events  = POLLPRI;
    ret = read(gpio_fd,buff,10);
    if( ret == -1 )
    printf("read\n");
    while(1)
    {
        ret = poll(fds,1,0);
        if(ret == -1 )
            printf("poll fail\n");
        if(fds[0].revents & POLLPRI)
        {           
            printf("%d\n",gpio_read(PIN));         
        }    
    }

    return 0;
}  

 

GPIO编程2:使用GPIO监听中断完整程序

标签:static   stat   监听   fail   def   port   div   roman   const   

原文地址:https://www.cnblogs.com/xiaojianliu/p/9736461.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!