GPIO, 全称 General-Purpose Input/Output(通用输入输出),是一种软件运行期间能够动态配置和控制的通用引脚。所有的 GPIO 在上电后的初始状态都是输入模式,可以控制电平的输出和获取外设的电平变化。
Linux是一个庞大的系统,除了支持pc以外,还支持很多嵌入式的开发板。而种类繁多的开发板的GPIO驱动往往都不同,这就是使得驱动工程师不得不对于每一种开发板都设计一套GPIO驱动来,而且长此以往Linux内核会被这类无意义的代码所占据,因此Linux引入了GPIO子系统的架构来解决这个问题。
MaixII-Dock上板载了一个LED可供我们观察gpio现象,对应管脚为GPIO14。
在命令行终端中查看/sys/class/gpio 目录下的文件,有四种文件。
export 只写,写入 GPIO 编号来向内核申请 GPIO 控制权(前提是没有内核代码申请这个 GPIO 端口), 成功后会在目录下生成 gpioN 目录
unexport 卸载GPIO
gpioN 指代具体的 gpio 引脚: 指代某个具体的 gpio 端口, 内有以下属性文件:
Attribution | Read/Write | Value | Function |
---|---|---|---|
direction | RW | in,out;low,high | 设置输入输出 |
value | RW | 0,非零 | 读取或者写入 IO 电平 |
edge | RW | none , rising , falling , both | 配置中断触发方式 |
active_low | RW | 0,非零 | 设置低电平有效 |
gpiochipN 指代 gpio 控制器: gpiochipN 表示的就是一个 gpio_chip, 用来管理和控制一组 gpio 端口的控制器,该目录下存在以下属性文件:
Attribution | Function |
---|---|
base | 和N相同,表示控制器管理的最小的端口编号。 |
lable | 诊断使用的标志,寄存器地址,1c20800.pinctrl |
ngpio | 表示控制器管理的 gpio 端口数量,A~G,224 |
具体操作:
ls -l /sys/class/gpio/ # 查看GPIO
echo 238 > /sys/class/gpio/export #写入GPIO,led对应管脚为PH14(238),
ls -l /sys/class/gpio/ # 查看GPIO
# output test
echo "out" > /sys/class/gpio/gpio238/direction # 设置GPIO为输出模式
echo 0 > /sys/class/gpio/gpio238/value # 设置为低电平
echo 1 > /sys/class/gpio/gpio238/value # 设置为高电平
echo 238 > /sys/class/gpio/unexport#卸载GPIO
当设置为0时输出低电平,led灯亮;当设置为1时输出高电平,led灯灭。
maixpy3将很多复杂的操作封装成python包,像GPIO的使用等,直接调用包来就可以了,想详细了解的可以去看maixpy3的源码,点击这里。
点击这里查看V831_PIN功能介绍,查看介绍可以知道,V831 只能使用 gpiochip1且我们要操作的io为PH14,这时我们知道了三个参数分别为14、H 和 1。 这时可以使用以下的代码进行 GPIO 的实例化,GPIO 使用结束之后需要将其释放,否则会处于占用状态,通过 gpio.release() 释放 GPIO 或者使用一个类封装起来。
代码:
from maix import gpio
import time
led = gpio.gpio(14, "H", 1)
print(led.source)
for i in range(3):
led.set_value(0)
print(led.get_value())
time.sleep(0.5)
led.set_value(1)
print(led.get_value())
time.sleep(0.5)
led.release()
MaixII-Dock的底板虽然板载有两个按键,查看MaixII-Dock功能介绍可以知道,两个按键是接到GPADC0的管脚上,根据ADC的数值判断按键是否按下,所以不能直接当做GPIO来使用,需要外接一个按键。
将 GPIO 设置成输入模式,才能获取板子的电平变化。需要在 GPIO 实例化的时候添加多一个参数,来设置 GPIO 的模式。
key = gpio.gpio(6, "H", 1, line_mode = 2)
GPIO 使用结束之后需要将其释放,否则会处于占用状态,通过 gpio.release() 释放 GPIO 或者使用一个类封装起来,完整代码如下:
import time
class BUTTON:
def __init__(self, line, bank, chip=1, mode=2):
from maix import gpio
self.button = gpio.gpio(line, bank, chip, mode)
def is_pressed(self):
if self.button.get_value() != 1:
return True
def __del__(self):
self.button.release()
key = BUTTON(6, "H")
print(key.button.source)
while True:
if key.is_pressed():
print("pressed!!")
个人感觉如果单单只是使用GPIO,能用python脚本电灯已经足够,但是要想深入了解Linux的gpio驱动,还需要更加深入的去学习linux系统,后期考虑入手一个正点原子的Linux开发板来深入学习。