当前位置: 首页 > 后端技术 > Python

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

时间:2023-03-25 20:08:49 Python

摘要:本文介绍了GPIO的读写,基本原理,以及不同读写方式的性能表现。本文分享自华为云社区《Linux 基于sysfs的GPIO读写操作》,作者:一棵小树x。前言最近接触了linux系统下的GPIO开发。这里做一个小总结和分享;本文将介绍GPIO的读写,基本原理,以及不同读写方式的性能表现。1.GPIOsysfs接口的基本原理在Linux中,最常见的读写GPIO的方式是使用GPIOsysfs接口,即通过export、unexport、gpio{N}/direction、gpio{Ninthe/sys/class/gpio目录}/value(将{N}替换为实际的pin号)等文件,这些文件经常出现在shell脚本中。首先声明GPIO端口,如GPIO258:(此命令需要root权限)echo258>/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的值;range:0或1。我们可以直接对其进行读写,达到读写GPIO的效果。2.定义GPIO为输入例如定义GPIO258为输入,命令如下:(此命令需要root权限)echoin>/sys/class/gpio/gpio258/direction3.定义GPIO为输出例如定义GPIO258为输出,命令如下:(此命令需要root权限)echoout>/sys/class/gpio/gpio258/direction4.读取GPIO的值,我们可以直接读取/sys中的值文件/class/gpio/gpio258目录(存放GPIO的值),读取。可以使用cat查看读取GPIO的值,例如查看GPIO258的值:cat/sys/class/gpio/gpio258/valuevalue只是一个文件,可以通过其他方式读取;写一个python程序来读取GPIO的值:#定义一个函数来读取GPIO258的值。defread_258():withopen('/sys/class/gpio/gpio258/value','r')asf:io_258=int(f.read())print("read_258:%d"%io_258)#调用函数read_258()5.写入GPIO的值我们可以直接将值写入/sys/class/gpio/gpio258目录下的value文件(存储GPIO的值)。可以使用ehco写入GPIO的值,比如写入GPIO258的值:echo1>/sys/class/gpio/gpio258/value#outputlogic1levelcho0>/sys/class/gpio/gpio258/value#outputlogic0levelwrite写入GPIO值的python程序:#定义写入GPIO258值的函数。defwrite_258(io_str):withopen('/sys/class/gpio/gpio258/value','w+')asf:f.write(io_str)print("write_258:%s"%(io_str))#call函数write_258()经测试,程序执行一次写操作耗时0.6ms左右;ehco方法耗时较长,大约10ms。6、小case——设置GPIO为输入并读取IO值方法一:纯shell命令#设置GPIO20为输入echo20>/sys/class/gpio/exportechoin>/sys/class/gpio/gpio20/direction#读取IOvaluecat/sys/class/gpio/gpio20/value方法二:shell命令+Python程序(效率更高)#设置GPIO20为输入echo20>/sys/class/gpio/exportechoin>/sys/class/gpio/gpio20/directionreadIOvalue:#定义一个函数来读取GPIO258的值。defread_20():withopen('/sys/class/gpio/gpio20/value','r')asf:io_20=int(f.read())print("read_20:%d"%io_20)#调用函数read_20()7.小case——设置GPIO为输出,读写IO值方法一:纯shell命令#设置GPIO40为输出echo40>/sys/class/gpio/exportechoout>/sys/class/gpio/gpio40/direction#写IO值,高电平echo1>/sys/class/gpio/gpio40/value#写IO值,低电平echo0>/sys/class/gpio/gpio40/value方法二:shell命令+Python程序(效率更高)#设置GPIO40为输出echo40>/sys/class/gpio/exportechoout>/sys/class/gpio/gpio40/directionreadandwriteIOvalue:importtimedefread_40():withopen('/sys/class/gpio/gpio40/value','r')asf:io_40=int(f.read())print("read_40:%d"%io_40)defwrite_40(io_str):打开('/sys/class/gpio/gpio40/value','w')asf:f.write(io_str)print("write_40:%s"%(io_str))start=time.time()read_40()write_40("1")read_40()end=time.time()print("读写时间到了O",end-start)效果:耗时0.6ms。点击关注,第一时间了解华为云的新鲜技术~