写点什么

Linux 如何进行 GPIO 读写操作的?

发布于: 5 小时前

摘要:本文介绍 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 levelecho 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/exportecho in > /sys/class/gpio/gpio20/direction
# 读取IO值cat /sys/class/gpio/gpio20/value
复制代码

方式二:shell 命令 + Python 程序(效率更高)


# 设置GPIO20为输入echo 20 > /sys/class/gpio/exportecho 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/exportecho 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/exportecho 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。



点击关注,第一时间了解华为云新鲜技术~

发布于: 5 小时前阅读数: 5
用户头像

提供全面深入的云计算技术干货 2020.07.14 加入

华为云开发者社区,提供全面深入的云计算前景分析、丰富的技术干货、程序样例,分享华为云前沿资讯动态,方便开发者快速成长与发展,欢迎提问、互动,多方位了解云计算! 传送门:https://bbs.huaweicloud.com/

评论

发布
暂无评论
Linux如何进行GPIO读写操作的?