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下面的.在单处理器情况下,每条指令的执行都是原子性的,但在多处理器情况下,只有那些单独的读操作或写操作才是原子性的.为了弥补 ...
随机推荐
- 《流畅的Python》 读书笔记 第5章 一等函数 20231025
第5章 一等函数 第四章相对偏僻,但时间上一样要花我很久,就先跳过了,回头再补.而这个第5章节是非常重要的.只是最近工作有点忙,我读的越来越慢了~继续坚持吧. 在 Python 中,所有函数都是一等对 ...
- CF1707B [Difference Array]
Problem 题目简述 设序列 \(a\) ,并且是单调递增的.设 \(a\) 当前长度为 \(l\),你要对 \(a\) 作差分,即令 \(b_i = a_{i+1} - a_i(1\le i & ...
- JVM指令分析
代码: 1 public class AppGo{ 2 public static void test() { 3 boolean flag = true; 4 if (flag) System.ou ...
- 容器Cgroup和Namespace特性简介
一般来说,容器技术主要包括Cgroup和Namespace这两个内核特性.Cgroup Cgroup是control group,又称为控制组,它主要是做资源控制.原理是将一组进程放在放在一个控制组里 ...
- JavaBean 之Hello World(入门实例)
本文主要参考<JavaEE企业应用实战>的例子,经过调试成功. 前言:如果多个jsp页面需要重复使用某段代码,我们可以把这段代码定义成Java类的方法,让后让多个jsp页面调用该方法即可, ...
- 树莓派4b部署samba服务实现文件共享
注意 samba 生命力很旺盛,软件是在不断更新的, 网上很多针对 samba 网速优化设置截止当前 实测发现有很多已经过期, 甚至有些设置会适得其反,使传输速度更低. 例如, 全网都在配置的参数,& ...
- vue 项目中遇到的问题及解决方案
问题:从码云上提前代码时npm run dev 报错 解决方法 在目录外层新建一个postcss.config.js 放入以下代码 module.exports = { plugins: ...
- C语言二进制转换成八,十,十六进制
代码目前只支持整数转换,小数转换后续更新呀 #include <stdio.h> #include <math.h> void B_O(int n); void B_H(int ...
- [OpenWrt]软路由H28K开启USB无线教程
0x01 背景 H28K软路由带了一个USB2.0的接口,官方说是支持USB无线的:于是就网购了USB转WIFI的设备(芯片:RTL8811CU),拿到手后开心的插上去,发现没有任何反应:在Q裙中询问 ...
- 《HelloGitHub》第 92 期
兴趣是最好的老师,HelloGitHub 让你对编程感兴趣! 简介 HelloGitHub 分享 GitHub 上有趣.入门级的开源项目. https://github.com/521xueweiha ...