15. GPIO 应用编程

15. GPIO 应用编程

  • 1. 应用层如何操控 GPIO
  • 2. GPIO 应用编程之输出
  • 3. GPIO 应用编程之输入
  • 4. GPIO 应用编程之中断

1. 应用层如何操控 GPIO

GPIO 也是通过 sysfs 方式进行操控的,在/sys/class/gpio目录下
在这里插入图片描述

  • gpiochipX: I.MX6UL 有 5 个 GPIO,X 由小到大分别对应 1 ~ 5 GPIO,随便进入一个目录,可以看到一些属性文件,这里介绍 3 个
    • base: 与 X 相同,表示该控制器所管理的这组 GPIO 引脚中最小的编号
    • label: 该组 GPIO 的名字
    • ngpio: 所管理的 GPIO 引脚的数量,范围是 base ~ base + ngpio -1
  • export: 用于将指定编号的 GPIO 引脚导出。使用 gpio 引脚之前,需要将其导出。export 是只写文件,不能读取,将一个指定的 X 写入到 export 文件中即可将对应的 gpio 引脚导出,导出之后可以发现在 gpio 目录下生成了一个新的目录,就是导出的 gpio 引脚对应的目录。不是所有的引脚都可以导出,如果对应的 GPIO 已经在内核中被使用,是无法成功导出的。
  • unexport: 将导出的引脚剔除,也是只写文件。
  • gpioX: 这是导出后生成的目录,这里只关心 4 个文件
    • direction: 配置 GPIO 引脚为输入in或输出out模式。该文件可读可写。echo "out" > direction
    • value: 在输出模式下,写 0 表示输出低电平,写 1 表示输出高电平
      echo "in" > direction
      echo "1" > value
      
    • active_low: 用于控制极性,可读可写,默认情况为 0,此时 value=1 表示输出高电平;为 1 时,value=1 输出低电平。
    • edge: 控制中断的触发模式,该文件可读可写。配置该文件之前,需要将 GPIO 设置为输入模式。
      echo "none" > edge 	# 非中断引脚
      echo "rising" > edge # 上升沿触发
      echo "falling" > edge # 下降沿触发
      echo "both" > edge # 边沿触发
      

2. GPIO 应用编程之输出

#include <iostream>
#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include <string.h>
using namespace std;char *gpio_path;
char *attr_path;void USAGE(char *argv[])
{printf("usage: %s GPIO编号 输出电平\n",argv[0]);
}void set(char *path,char *str)
{sprintf(attr_path,"gpio_path/%s",path);int fd=open(attr_path,O_WRONLY);write(fd,str,sizeof str);close(fd);
}int main(int argc,char *argv[])
{int len;int fd;if(argc!=3){USAGE(argv);return -1;}sprintf(gpio_path,"/sys/class/gpio/gpio%s",argv[1]);if(access(gpio_path,F_OK)) // 判断导出目录是否存在,存在返回0{// 不存在fd=open("/sys/class/gpio/export",O_WRONLY);if(fd<0){perror("open");return -1;}len=strlen(argv[1]);// 将对应的GPIO编号写入到export中if(len!=write(fd,argv[1],len)){perror("write");close(fd);return -1;}close(fd);}// 配置为输出模式set("direction","out");// 极性设置set("active_low","0");// 输出高低电平set("value",argv[2]);return 0;
}

3. GPIO 应用编程之输入

这个代码就是需要将引脚配置为输入模式,并且是非中断模式。就不详细编写

4. GPIO 应用编程之中断

int main(int argc, char *argv[])
{struct pollfd pfd;char file_path[100];int ret;char val;/* 校验传参 */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;int fd;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");exit(-1);}close(fd); //关闭文件}/* 配置为输入模式 */if (gpio_config("direction", "in"))exit(-1);/* 极性设置 */if (gpio_config("active_low", "0"))exit(-1);/* 配置中断触发方式: 上升沿和下降沿 */if (gpio_config("edge", "both"))exit(-1);/* 打开 value 属性文件 */sprintf(file_path, "%s/%s", gpio_path, "value");if (0 > (pfd.fd = open(file_path, O_RDONLY))) {perror("open error");exit(-1);}/* 调用 poll */pfd.events = POLLPRI; //只关心高优先级数据可读(中断)read(pfd.fd, &val, 1);//先读取一次清除状态for ( ; ; ) {ret = poll(&pfd, 1, -1); //调用 pollif (0 > ret) {perror("poll error");exit(-1);}else if (0 == ret) {fprintf(stderr, "poll timeout.\n");continue;}/* 校验高优先级数据是否可读 */if(pfd.revents & POLLPRI) {if (0 > lseek(pfd.fd, 0, SEEK_SET)) //将读位置移动到头部{perror("lseek error");exit(-1);}if (0 > read(pfd.fd, &val, 1)) {perror("read error");exit(-1);}printf("GPIO 中断触发<value=%c>\n", val);}}/* 退出程序 */exit(0);
}

调用 poll 监视文件描述符上的 IO 状态变化,POLLPRI 表示有高优先级数据可读取,中断就是一种高优先级事件。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/649410.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

驱动开发-系统移植

一、Linux系统移植概念 需要移植三部分东西&#xff0c;Uboot ,内核 &#xff0c;根文件系统 &#xff08;rootfs&#xff09; &#xff0c;这三个构成了一个完整的Linux系统。 把这三部分学明白&#xff0c;系统移植就懂点了。 二、Uboot uboot就是引导程序下载的一段代…

【测一测】Jmeter知识大挑战!

不定项选择 1、Ramp-up period(seconds)代表在多长时间内把线程全部启动&#xff0c;如果线程数为10&#xff0c;而Ramp-up period设置为15&#xff0c;则每个线程的间隔时间为&#xff08;&#xff09; A、1 B、1.5 C、2 D、102、对于每个HTTP请求&#xff0c;都可以通过&am…

数字图像处理(实践篇)三十 使用OpenCV-Python在图像上创建水印实践

目录 1 方案 2 实践 1 方案 ①导入依赖库 import cv2 import matplotlib.pyplot as plt ②读取输入图片和水印图片 im = cv2.imread(img_path) wm = cv2.imread(watermarkImg_path) ③计算roi

如何在云服务上通过docker部署服务?

如何在云服务上通过docker部署服务&#xff1f; 一、在云服务器上安装Docker1、查看云服务器的OS信息2、[安装Docker并使用&#xff08;Linux&#xff09;](https://help.aliyun.com/zh/ecs/use-cases/deploy-and-use-docker-on-alibaba-cloud-linux-2-instances) 二、通过dock…

Vue进阶:Vue中的ajax请求

一、Vue中的ajax请求 1.1 解决开发环境 Ajax 跨域问题 总结&#xff1a; 1.1.1 模拟跨域问题 准备好测试的服务器 server1.js const express require(express) const app express()app.use((request,response,next)>{console.log(有人请求服务器1了);// console.log(…

P4769 [NOI2018] 冒泡排序 洛谷黑题题解附源码

[NOI2018] 冒泡排序 题目背景 请注意&#xff0c;题目中存在 n 0 n0 n0 的数据。 题目描述 最近&#xff0c;小 S 对冒泡排序产生了浓厚的兴趣。为了问题简单&#xff0c;小 S 只研究对 1 1 1 到 n n n 的排列的冒泡排序。 下面是对冒泡排序的算法描述。 输入&#x…

韦东山嵌入式Liunx入门笔记一

文章目录 一、嵌入式Linux二、Ubuntu系统2-1 安装软件2-2 Linux文件(1) 文件架构(2)文件属性(3)文件命令(4) 解压、压缩文件(5) 网络命令 2-3 vi编辑器2-4 Ubuntu下包管理 三、配置网卡四、安装后续学习使用的软件4-1 MobaXterm4-2 FileZilla4-3 Source Insight4.04-4 下载BSP4…

Open CASCADE学习|圆柱螺旋线绘制原理探究

1、圆柱螺旋线绘制原理 在OCC中&#xff0c;圆柱面的参数方程为&#xff1a; 设P为&#xff08;x0,y0,z0&#xff09;,则 xx0r*cos(u) yy0r*sin(u) zz0v 但u、v之间有关系时&#xff0c;此方程表达为圆柱螺旋线&#xff0c;u、v之间为线性关系时是等螺距螺旋线&#xff0…

文件上传之秒传功能

秒传是一种文件的传输机制&#xff0c;用于在文件已经存在于目标服务器上时&#xff0c;通过校验文件的唯一标识&#xff0c;实现快速而无需从新上传整个文件&#xff0c;它解决了重复上传相同文件的问题&#xff0c;提高了文件传输的效率和节省了带宽资源。 技术阐述&#xff…

免 费 小程序商城搭建之鸿鹄云商 SAAS云产品概述

【SAAS云平台】打造全行业全渠道全场景的SaaS产品&#xff0c;为店铺经营场景提供一体化解决方案&#xff1b;门店经营区域化、网店经营一体化&#xff0c;本地化、全方位、一站式服务&#xff0c;为多门店提供统一运营解决方案&#xff1b;提供丰富多样的营销玩法覆盖所有经营…

软件测试面试八股文(2024新版)

&#x1f345; 视频学习&#xff1a;文末有免费的配套视频可观看 &#x1f345; 点击文末小卡片&#xff0c;免费获取软件测试全套资料&#xff0c;资料在手&#xff0c;涨薪更快 1、你的测试职业发展是什么&#xff1f; 测试经验越多&#xff0c;测试能力越高。所以我的职业发…

【unity实战】实现蓄力丢手榴弹、烟雾弹、燃烧弹的效果

文章目录 爆炸燃烧烟雾效果资产手榴弹丢手雷烟雾弹、燃烧弹实现手雷每次撞墙弹发出音效&#xff08;补充&#xff09;完结 爆炸燃烧烟雾效果资产 https://assetstore.unity.com/packages/vfx/particles/war-fx-5669 手榴弹 手榴弹配置好刚体&#xff0c;碰撞体 新增脚本Th…

Qlik Sense : Store With Retry (保存重试机制)

Background sometime you cannot store the file directly ,maybe there are another process are reading/storeing the file , so you would need to wait another proecess done and retry . then we come up this solution . 有时您不能直接存储文件&#xff0c;可能还有…

实验:eNSP AR通过telnet远程登录另外一台AR

实验2&#xff1a;eNSP AR通过telnet远程登录另外一台AR 基于实验1的基础上来进行&#xff0c;我们通过AR2220登录AR3260 首先设置远程登录密码 1、user-interface vty 0 4 进入用户的虚拟终端 2、设置密码 set authentication password cipher Huawei 这里的意思就是设置密…

数据结构(C语言版)代码实现(四)——静态单链表的部分代码实现

目录 参考材料、格式 头文件SLinkList.h 库、宏定义、函数类型声明 线性表的静态单链表存储结构 按值查找 初始化静态链表 分配空间 回收空间 打印已用链表中的元素 求集合(A-B)U(B-A)中的元素&#xff08;重点介绍&#xff09; 调试过程 修改报错与警告 调试 完整…

找不到msvcp110.dll怎么办,msvcp110.dll丢失修复方法分享

当计算机系统中无法找到msvcp110.dll这个特定的动态链接库文件时&#xff0c;可能会引发一系列运行问题和功能受限的情况。msvcp110.dll是Microsoft Visual C Redistributable Package的一部分&#xff0c;对于许多基于Windows的应用程序来说&#xff0c;它是至关重要的运行组件…

vue模拟聊天页面列表:滚动到底部,滚动到顶部触发加载更多

先看下效果&#xff1a; 代码&#xff1a; <template><div><div style"text-align: center"><button click"scrollTop">滚动到顶部</button><button click"scrollBottom">滚动到底部</button></d…

Vue深入学习2—虚拟DOM和Diff算法

1、snabbdom 是什么&#xff1f; snabbdom是“速度"的意思&#xff0c;源码只有200行&#xff0c;使用TS写的&#xff0c;让东西变得模块化 2、snabbdom 的 h 函数如何工作&#xff1f; h函数用于产生虚拟节点&#xff0c;同时也可以嵌套使用&#xff0c;得到虚拟DOM树&am…

kuberneters可视化界面-kuboard

一、kuboard安装 可以选用&#xff0c;docker和docker-commpose kuberneters 安装 kuboard官网 1、 docker安装 sudo docker run -d \--restartunless-stopped \--namekuboard \-p 80:80/tcp \-p 10081:10081/tcp \-e KUBOARD_ENDPOINT"http://192.168.1.10:80" …

linux的kali安装,换源,更新包

下载kali kali.org进入官网后点第二个 然后点第一个 解压kali 下载后获得.7z压缩包&#xff0c;建议移动到合适自己电脑的位置进行解压&#xff0c;我喜欢放在D盘 启动kali 双击进入解压出的文件夹&#xff0c;将唯一一个.vmx文件用vmware打开&#xff08;没装的自行提前装…