共计 2572 个字符,预计需要花费 7 分钟才能阅读完成。
摘要: 本文介绍 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。
点击关注,第一工夫理解华为云陈腐技术~