最近学习了下树莓派的GPIO的控制,通过如下命令可以查看所有pin的情况:
pinout
当前是raspi 4B,输出如下:
通过一根线将GPIO17与GPIO27相连,读取其状态值均为0:
gpioget gpiochip0 17
gpioget gpiochip0 27
至于为什么是chip0,而不是chip1或chip4,可以通过命令进行查询:
$ gpiofind GPIO17
gpiochip0 17
执行如下命令将GPIO17拉抬到高电压:
gpioset --mode=wait gpiochip0 17=1
默认命令执行结束就退出,电压就恢复了,所以这里使用--mode=wait来保持不退出。此时在另一个终端里读取GPIO27的值:
$ gpioget gpiochip0 27
1
输出就为0. 结束原终端的进程,查询GPIO17和GPIO27,输出为:
$ gpioget gpiochip0 17
0
$ gpioget gpiochip0 27
1
那为什么进程结束,电压就恢复了呢,因为默认gpio的pin脚为悬空,是0还是1可由外部电路进行下拉或上拉来决定,但其实也可以指定bias电压,如下命令就不需要--mode=wait,而进程结束,电压还是高:
gpioset -B pull-up gpiochip0 17=1
参数-B或--bias取值可为as-is(默认值)、disable、pull-up、pull-down。
有个--drive参数,默认为push-pull,其各取值含义如下:
push-pull: 推挽模式,即指定电压高或低。可用来驱动单一器件,如LED
open-drain: 开漏模式,电压为低或悬空(表现为高阻抗),可以用于多器件的信号线与
open-source: 开源模式,电压为高或悬空(表现为高阻抗)
监控某个GPIO的电平变化,可执行:
$ gpiomon gpiochip0 17
event: RISING EDGE offset: 17 timestamp: [ 48929.128336981]
event: FALLING EDGE offset: 17 timestamp: [ 48937.490543703]
然后另一终端反复执行如下两行命令,就可以看到监听进程有输出:
gpioset gpiochip0 27=1
gpioset gpiochip0 27=0