Linux如何进行GPIO读写操作的?
摘要:本文介绍GPIO的读写,介绍基本原理,以及不同读写方式的性能。
本文分享自华为云社区《Linux 基于sysfs的GPIO读写操作》,作者:一颗小树x 。
前言
最近接触到Linux系统中的GPIO开发,这里做个小总结,也分享一下;本文会介绍GPIO的读写,介绍基本原理,以及不同读写方式的性能。
一、GPIO sysfs interface 基本原理
在Linux中,最常见的读写GPIO方式就是用GPIO sysfs interface,是通过操作/sys/class/gpio目录下的export、unexport、gpio{N}/direction, gpio{N}/value(用实际引脚号替代{N})等文件实现的,经常出现shell脚本里面。
首先声明GPIO口,比如GPIO258:(这个命令需要root权限)
echo 258 > /sys/class/gpio/export
然后在/sys/class/gpio,会生成一个新目录,其名字叫gpio258
比如:GPIO258,N对应是258;进入其目录:cd /sys/class/gpio/gpio258
依次能看到:active_low 、device、 direction 、edge 、power 、subsystem 、uevent 、value
其中比较常用的是value文件,它存放GPIO的值;范围是:0或1。我们可以直接对它读写,达到读写GPIO的效果。
二、定义GPIO为输入
比如定义GPIO258为输入,命令如下:(这个命令需要root权限)
echo in > /sys/class/gpio/gpio258/direction
三、定义GPIO为输出
比如定义GPIO258为输出,命令如下:(这个命令需要root权限)
echo out > /sys/class/gpio/gpio258/direction
四、读GPIO的值
我们可以直接对/sys/class/gpio/gpio258 目录下的value文件(存放GPIO的值),进行读取。
可以用cat 查看读GPIO的值,比如查看GPIO258的值:
cat /sys/class/gpio/gpio258/value
value 只是一个文件,可以通过其他方式读取;写一个python程序,实现读取GPIO的值:
# 定义一个函数,用于读取GPIO258的值。
def read_258():
with open('/sys/class/gpio/gpio258/value', 'r') as f:
io_258 = int(f.read())
print("read_258:%d"%io_258) # 调用函数
read_258()
五、写GPIO的值
我们可以直接对/sys/class/gpio/gpio258 目录下的value文件(存放GPIO的值),进行写值。
可以用ehco 写GPIO的值,比如写GPIO258的值:
echo 1 > /sys/class/gpio/gpio258/value # output logic 1 level
echo 0 > /sys/class/gpio/gpio258/value # output logic 0 level
写一个python程序,实现写GPIO的值:
# 定义一个函数,用于写GPIO258的值。
def write_258(io_str):
with open('/sys/class/gpio/gpio258/value', 'w+') as f:
f.write(io_str)
print("write_258:%s"%(io_str)) # 调用函数
write_258()
经过测试,程序进行一次写操作,耗时0.6ms左右;ehco方式就比较久了,10ms左右。
六、小案例——设置GPIO为输入,并读取IO值
方式一: 纯shell命令
# 设置GPIO20为输入
echo 20 > /sys/class/gpio/export
echo in > /sys/class/gpio/gpio20/direction # 读取IO值
cat /sys/class/gpio/gpio20/value
方式二:shell命令 + Python程序(效率更高)
# 设置GPIO20为输入
echo 20 > /sys/class/gpio/export
echo in > /sys/class/gpio/gpio20/direction
读取IO值:
# 定义一个函数,用于读取GPIO258的值。
def read_20():
with open('/sys/class/gpio/gpio20/value', 'r') as f:
io_20 = int(f.read())
print("read_20:%d"%io_20) # 调用函数
read_20()
七、小案例——设置GPIO为输出,并读写取IO值
方式一: 纯shell命令
# 设置GPIO40为输出
echo 40 > /sys/class/gpio/export
echo out > /sys/class/gpio/gpio40/direction # 写IO值,高电平
echo 1 > /sys/class/gpio/gpio40/value # 写IO值,低电平
echo 0 > /sys/class/gpio/gpio40/value
方式二:shell命令 + Python程序(效率更高)
# 设置GPIO40为输出
echo 40 > /sys/class/gpio/export
echo out > /sys/class/gpio/gpio40/direction
读写IO值:
import time def read_40():
with open('/sys/class/gpio/gpio40/value', 'r') as f:
io_40 = int(f.read())
print("read_40:%d"%io_40) def write_40(io_str):
with open('/sys/class/gpio/gpio40/value', 'w') as f:
f.write(io_str)
print("write_40:%s"%(io_str)) start = time.time()
read_40()
write_40("1")
read_40()
end = time.time()
print("读写IO的时间", end-start)
效果:耗时0.6ms。


Linux如何进行GPIO读写操作的?的更多相关文章
- FTP服务器建立windows与Linux的文件共享与读写操作
centos7搭建vsftpd 2018-11-15 我们有时想要windows与Linux互传文件,就要用到vsftpd了.它仅仅在windows上面操作,就可以实现与Linux的通信,详情如下: ...
- Linux环境下实现对文件读写操作
---- 今天分享一下在linux系统在实现对文件读写一些基本的操作,在这之前我们要掌握一些基本的技能在Linux环境下.比如查看命令和一个函数的具体用法,就是相当于查手册,在Linux下有一个man ...
- Linux系统编程--文件IO操作
Linux思想即,Linux系统下一切皆文件. 一.对文件操作的几个函数 1.打开文件open函数 int open(const char *path, int oflags); int open(c ...
- 24小时学通Linux内核之如何处理输入输出操作
真的是悲喜交加呀,本来这个寒假早上8点都去练车,两个小时之后再来实验室陪伴Linux内核,但是今天教练说没名额考试了,好纠结,不过想想就可以睡懒觉了,哈哈,自从大三寒假以来还没睡过懒觉呢,现在也有更多 ...
- OpenCV 编程简单介绍(矩阵/图像/视频的基本读写操作)
PS. 因为csdn博客文章长度有限制,本文有部分内容被截掉了.在OpenCV中文站点的wiki上有可读性更好.而且是完整的版本号,欢迎浏览. OpenCV Wiki :<OpenCV 编程简单 ...
- Linux下按扇区读写块设备
本文介绍Linux下按扇区读写块设备(示例TF卡),实际应用是在Android系统上,主要方法如下: 1.找到sdcard的挂载点,在android2.1系统下应该为/dev/block/mmcblk ...
- kernel中文件的读写操作可以使用vfs_read()和vfs_write
需要在Linux kernel--大多是在需要调试的驱动程序--中读写文件数据.在kernel中操作文件没有标准库可用,需要利用kernel的一些函数,这些函数主要有: filp_open() fil ...
- SPI 用户空间的读写操作
spi_device 虽然用户空间不需要直接用到spi_device结构体,但是这个结构体和用户空间的程序有密切的关系,理解它的成员有助于理解SPI设备节点的IOCTL命令,所以首先来介绍它.在内核中 ...
- Linux C高级编程——文件操作之系统调用
Linux C高级编程文件操作之系统调用 宗旨:技术的学习是有限的,分享的精神是无限的. 库函数是一些完毕特定功能的函数.一般由某个标准组织制作公布,并形成一定的标准.使用库函数编 ...
- Linux内核部件分析 原子性操作atomic_t
在任何处理器平台下,都会有一些原子性操作,供操作系统使用,我们这里只讲x86下面的.在单处理器情况下,每条指令的执行都是原子性的,但在多处理器情况下,只有那些单独的读操作或写操作才是原子性的.为了弥补 ...
随机推荐
- Vue之class的用法
Vue中class的使用总结如下: 使用形式v-bind:class 简写:class 1.在数组中使用一个class <!DOCTYPE html> <html lang=&qu ...
- 虹科案例 | 虹科Domo商业智能,助力保险公司逃离繁杂数据池!
金融行业的发展充满着不确定性,一个具备强大承保能力和精算专业知识的资金池,对于身处该领域的公司和个人都是十分必要的. 在全国城市联盟(NLC)的协助下成立的NCL Mutual会员制互助保险公司,为各 ...
- YbtOJ 「图论」第3章 最短路径
例题1.单源最短路径 dij 板子.(w36557658 原版 dij 代码! code #include<cmath> #include<queue> #include< ...
- Util应用框架核心(一) - 服务配置
本文介绍在项目中如何配置 Util 依赖服务. 文章分为多个小节,如果对设计原理不感兴趣,只需要阅读基础用法部分即可. 基础用法 Asp.Net Core 项目服务配置 调用 WebApplicati ...
- nginx参数调优能提升多少性能
前言 nginx安装后一般都会进行参数优化,网上找找也有很多相关文章,但是这些参数优化对Nginx性能会有多大影响?为此我做个简单的实验测试下这些参数能提升多少性能. 声明一下,测试流程比较简单,后端 ...
- 前端本地导出文件 导出txt sql (简版版的字符串案例)
1.首页明确要导出的根据 一般有图片 excel 文字.针对不同的文件类型 配置不同的参数 2.知识点 Blob URL.createObjectUrl new Blob( arr ...
- Codeforces Round #707 (Div. 2)A~C题解
写在前边 链接:Codeforces Round #707 (Div. 2) 心态真的越来越不好了,看A没看懂,赛后模拟了一遍就过了,B很简单,但是漏了个判断重复的条件. A. Alexey and ...
- 总结---Django部分
Django是走大而全的方向,它最出名的是其全自动化的管理后台:只需要使用起ORM,做简单的对象定义,它就能自动生成数据库结构.以及全功能的管理后台. Django内置的ORM跟框架内的其他模块耦合程 ...
- 通过计算巢轻松部署Salt服务
SaltStack服务实例部署 概述 Salt基于Python构建,是一个事件驱动的自动化工具和框架,用于部署.配置和管理复杂的IT系统.使用Salt来自动化公共基础设施管理任务,并确保基础设施的所有 ...
- Navicat远程连接Centos8.4服务器MySQL8.0数据库
一.首先登陆服务器后台管理,使服务器开放3306策略 二.开启远程连接 1.登陆服务器的MySQL数据库 mysql -uroot -p 2.登录成功后,切换数据库 use mysql; 3.查看当前 ...