摘要:本文介绍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。
点击关注,第一工夫理解华为云陈腐技术~
发表回复