MaixII-Dock(v831)学习笔记——GPIO

发布于:2023-01-20 ⋅ 阅读:(2) ⋅ 点赞:(0) ⋅ 评论:(0)


前言

  GPIO, 全称 General-Purpose Input/Output(通用输入输出),是一种软件运行期间能够动态配置和控制的通用引脚。所有的 GPIO 在上电后的初始状态都是输入模式,可以控制电平的输出和获取外设的电平变化。

Linux操作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灯灭。

Python脚本操作GPIO

点灯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()

按键KEY

  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开发板来深入学习。
在这里插入图片描述