17.linuxGPIO应用编程

2023-11-03

        除了LED类设备可以通过sysfs文件系统控制以外,还可以使用该虚拟文件系统控制GPIO的高低电平,输入以及中断检测。

一、GPIO控制高低电平

        进入目录sys/class/gpio下可以看到有如下文件,其中gpiochip0对应硬件的GPIO0,gpiochip1对应硬件的GPIO1,以此类推。每个gpiochipX都管理一组32个gpio管脚。

        如果要使用某一个gpio管脚,需要先使用export命令将其导出。例如命令echo 0 > export,可以以将GPIO0_IO0导出,同理使用命令echo 0 > unexport命令删除GPIO0_IO0管脚

打开导出的管脚可以看到有如下文件 :

        active_low:代表有效极性
        direction:代表输入或输出
        value:代表管脚电平 

对于给定的一个 GPIO 引脚,如何计算它在 sysfs 中对应的编号?

GPIO4_IO16,GPIO4 对应于 gpiochip96,所以GPIO4_IO16对应的编号就是96 + 16 = 112.

应用程序编写:

#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include <string.h>


static char gpio_path[100];
static int gpio_config(const char *attr, const char *val)
{
    char file_path[100];
    int len;
    int fd;
    sprintf(file_path, "%s/%s", gpio_path, attr);
    if (0 > (fd = open(file_path, O_WRONLY))) {
        perror("open error");
        return fd;
    }

    len = strlen(val);
    if (len != write(fd, val, len)) {
        perror("write error");
        close(fd);
    return -1;
    }

    close(fd); //关闭文件
    return 0;
}


int main(int argc, char *argv[])
{
    /* 校验传参 */
    if (3 != argc) {
        fprintf(stderr, "usage: %s <gpio> <value>\n", argv[0]);
        exit(-1);
    }
    /* 判断指定编号的 GPIO 是否导出 */
    sprintf(gpio_path, "/sys/class/gpio/gpio%s", argv[1]);
    if (access(gpio_path, F_OK)) {//如果目录不存在 则需要导出
        int fd;
        int len;
        if (0 > (fd = open("/sys/class/gpio/export", O_WRONLY))) {
        perror("open error");
        exit(-1);
    }
    len = strlen(argv[1]);
    if (len != write(fd, argv[1], len)) {//导出 gpio
            perror("write error");
            close(fd);
            exit(-1);
        }
    close(fd); //关闭文件
    }
    /* 配置为输出模式 */
    if (gpio_config("direction", "out"))
        exit(-1);
    /* 极性设置 */
    if (gpio_config("active_low", "0"))
        exit(-1);
    /* 控制 GPIO 输出高低电平 */
    if (gpio_config("value", argv[2]))
        exit(-1);
    /* 退出程序 */
    exit(0);
}

代码流程:代码使用样例:        ./testApp 36 1,将编号为36的GPIO管脚设置为高电平

        ① 检查是否导出要操作的管脚,如果未导出则将其导出
        ②  将管脚配置为输出模式,有效极性低,输出对应的电平。

 二、GPIO控制高低电平

        

#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include <string.h>


static char gpio_path[100];
static int gpio_config(const char *attr, const char *val)
{
    char file_path[100];
    int len;
    int fd;
    sprintf(file_path, "%s/%s", gpio_path, attr);
    if (0 > (fd = open(file_path, O_WRONLY))) {
        perror("open error");
        return fd;
    }
    len = strlen(val);
    if (len != write(fd, val, len)) {
        perror("write error");
        close(fd);
        return -1;
    }
    close(fd); //关闭文件
    return 0;
}

int main(int argc, char *argv[])
{
    char file_path[100];
    char val;
    int fd;
    /* 校验传参 */
    if (2 != argc) {
        fprintf(stderr, "usage: %s <gpio>\n", argv[0]);
        exit(-1);
    }
    /* 判断指定编号的 GPIO 是否导出 */
    sprintf(gpio_path, "/sys/class/gpio/gpio%s", argv[1]);
    if (access(gpio_path, F_OK)) {//如果目录不存在 则需要导出
        int len;
        if (0 > (fd = open("/sys/class/gpio/export", O_WRONLY))) {
        perror("open error");
        exit(-1);
        }
    len = strlen(argv[1]);
    if (len != write(fd, argv[1], len)) {//导出 gpio
        perror("write error");
        close(fd);
        exit(-1);
        }
    close(fd); //关闭文件
    }

    /* 配置为输入模式 */
    if (gpio_config("direction", "in"))
    exit(-1);
    /* 极性设置 */
    if (gpio_config("active_low", "0"))
    exit(-1);
    /* 配置为非中断方式 */
    if (gpio_config("edge", "none"))
    exit(-1);
    /* 读取 GPIO 电平状态 */
    sprintf(file_path, "%s/%s", gpio_path, "value");
    if (0 > (fd = open(file_path, O_RDONLY))) {
        perror("open error");
        exit(-1);
    }

    if (0 > read(fd, &val, 1)) {
        perror("read error");
        close(fd);
        exit(-1);
    }
    printf("value: %c\n", val);
    /* 退出程序 */
    close(fd);
    exit(0);
}

代码流程:代码使用样例:        ./testApp 36 ,读取编号为36的管脚电平

        ① 检查是否导出要操作的管脚,如果未导出则将其导出
        ②  将管脚配置为输入模式,有效极性低,读取对应电平。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

17.linuxGPIO应用编程 的相关文章

随机推荐

  • 记一次Ubuntu PHP-SSH2扩展安装

    要部署 PHP SSH2的项目 按照网上教程来 发现操作十分繁琐 于是就去apt找有没有相关的安装 首先 更新apt源 apt update 再 进行libssh2的安装 apt get install libssh2 1 libssh2
  • Mat 变换错误排查

    背景 想执行一个平移变换 try cv Mat original points cv Mat
  • 深度学习中:epoch、batch size和iterations之间的关系

    机器学习中 epoch batchsize和iterations之间的关系 在深度学习中 epoch batchsize和iterations是在训练模型时 一定用到的一些概念 那么分别是什么意思呢 首先 为什么会用到以上概念 是因为 梯度
  • 算法题——洛谷2

    P8723 乘法表 题目描述 九九乘法表是学习乘法时必须要掌握的 在不同进制数下 需要不同的乘法表 例如 四进制下的乘法表如下所示 1 1 1 2 1 2 2 2 10 3 1 3 3 2 12 3 3 21 请注意 乘法表中两个数相乘的顺
  • 清理memcached缓存

    清理memcached缓存 首先telnet连接memcache 然后 flush all 清除缓存 最后quit退出 root admin telnet 192 168 101 51 12000 Trying 10 118 180 58
  • AES+BASE64双重加密,解密 私钥,向量解析

    使用AES加密 再使用base64编码加密 具体细节请看注释 加密 param sSrc 加密的明文 param sKey 秘钥 param iv 向量 16 bytes return throws Exception public sta
  • 如何用最短的时间理解一项数字技术?推荐这7本最新的白皮书(大数据、云原生、区块链、联邦学习等,附下载)...

    正文开始 信息技术 数据被国家认定为新的生产要素 对于数据从业者来说是时代赋予的巨大红利 但也要认识到 数据要素要发挥出价值 离不开数据要素市场的培育 更依赖于信息技术 大数据 人工智能 区块链 云计算 边缘计算 物联网等 的加持 为了抓住
  • ML算法——梯度下降随笔【机器学习】

    文章目录 2 1 梯度下降 2 1 梯度下降 梯度下降如何帮助参数优化 梯度下降是一种用于参数优化的常见方法 它的基本思想是通过迭代地更新参数 以减小损失函数 代价函数的值 从而找到一个最优解 梯度方向 向右 正向 向左 反方向 梯度方向是
  • 《机器学习(周志华)》 西瓜数据集3.0(含规范化以后数据)

    书上的一个常用数据集 plain view plain copy 编号 色泽 根蒂 敲声 纹理 脐部 触感 密度 含糖率 好瓜 1 青绿 蜷缩 浊响 清晰 凹陷 硬滑 0 697 0 46 是 2 乌黑 蜷缩 沉闷 清晰 凹陷 硬滑 0 7
  • 【vue3】锚点定位(两种实现方式)

    方法1 利用ref实现锚点定位 前面的废话文学 说到锚点定位 很多人第一时间会想到 a标签 但是a标签实现的锚点定位并不是那么的完美 特别是在hash模式下 对我而言 vue3的ref就实在是太完美了 解决问题的方法 很多情况下 我们会循环
  • 五层网络协议,各层功能,各层协议

    一 OSI七层模型 OSI七层协议模型主要是 应用层 Application 表示层 Presentation 会话层 Session 传输层 Transport 网络层 Network 数据链路层 Data Link 物理层 Physic
  • 使用 gfortran 编译 CALPUFF

    1 升级gfortran 7 默认gortran的版本是4 8 gfortran version GNU Fortran GCC 4 8 5 20150623 Red Hat 4 8 5 39 Copyright 2015 Free Sof
  • 美化VC界面(用户登录界面)

    源码下载 http download csdn net source 2840164 代码运行效果图如下 VC开发程序单调的界面相信大家都是深有感触 提到界面美化编程 人们都会说做界面不要用VC写 太难了 一句俗语 难者不会 会者不难 VC
  • Jmeter使用HTTP代理服务器无法打开网页问题的解决方法

    大家都知道Jmeter有录制HTTP请求的功能 HTTP代理服务器中 但是在操作中却会提示如下页面 Root CA certificate ApacheJMeterTemporaryRootCA created in JMeter bin
  • Apache Tomcat 8.5安装配置教程

    一 安装JDK步骤及配置JDK环境变量步骤省略 二 安装Tomcat 提前请先安装JDK 三 安装官网 直接点击 Tomcat很特殊 各个版本之间可能会相互不兼容 这里示例安装8 5的版本 点击tomcat8后根据自己的电脑选择相应的型号
  • git终端显示分支名称

    在使用git操作的时候 有时候会记错当前自己是在哪个分支上 从而造成一些不必要的麻烦 比如需要在某个分支上开发某个特性 结果误在master分支上进行了相关的操作 并且还push到了远端仓库 事后自己有可能还并不知晓 从而给自己带来了不必要
  • HTML基本标签

    文章目录 前言 一 HTML简介 二 HTML标签介绍 1 标题标签 2 段落标签 3 换行标签 4 hr标签 5 span标签 6 div标签 7 img标签 8 超链接标签 9 注释标签 10 特殊字符 11 格式化标签 12 sup上
  • 解决qt在线安装慢的方法

    iso mirrors ustc edu cn qtproject official releases online installers qt unified windows x64 online exe 步骤 1 点击上面链接 下载qt
  • web操作系统开发的_哪种操作系统更适合Web开发

    web操作系统开发的 If you re new to web development and are in the market for a new laptop you might be wondering which operatin
  • 17.linuxGPIO应用编程

    除了LED类设备可以通过sysfs文件系统控制以外 还可以使用该虚拟文件系统控制GPIO的高低电平 输入以及中断检测 一 GPIO控制高低电平 进入目录sys class gpio下可以看到有如下文件 其中gpiochip0对应硬件的GPI