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



    前言

      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 端口, 内有以下属性文件:

    AttributionRead/WriteValueFunction
    directionRWin,out;low,high设置输入输出
    valueRW0,非零读取或者写入 IO 电平
    edgeRWnone , rising , falling , both配置中断触发方式
    active_lowRW0,非零设置低电平有效

    gpiochipN 指代 gpio 控制器: gpiochipN 表示的就是一个 gpio_chip, 用来管理和控制一组 gpio 端口的控制器,该目录下存在以下属性文件:

    AttributionFunction
    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
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    当设置为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()
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

    按键KEY

      MaixII-Dock的底板虽然板载有两个按键,查看MaixII-Dock功能介绍可以知道,两个按键是接到GPADC0的管脚上,根据ADC的数值判断按键是否按下,所以不能直接当做GPIO来使用,需要外接一个按键。
      将 GPIO 设置成输入模式,才能获取板子的电平变化。需要在 GPIO 实例化的时候添加多一个参数,来设置 GPIO 的模式。

    key = gpio.gpio(6, "H", 1, line_mode = 2)
    
    • 1

      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!!")
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15

    总结

      个人感觉如果单单只是使用GPIO,能用python脚本电灯已经足够,但是要想深入了解Linux的gpio驱动,还需要更加深入的去学习linux系统,后期考虑入手一个正点原子的Linux开发板来深入学习。
    在这里插入图片描述

  • 相关阅读:
    ACM练习——第四天
    基于Yolov8的工业小目标缺陷检测(3):多检测头提升小目标检测精度
    基于Go语言GoFrame+Vue+ElementUI的OA办公系统
    4年工作经验,多线程间的5种通信方式都说不出来,你敢信?
    解决vue3 mitt路由跳转后 on事件获取不到值的奇葩问题解决
    HtmlParse:一款超轻量级的HTML文件解析和爬取工具
    排序算法之-冒泡
    视频基础知识
    2022年比若依更香的开源项目
    ruoyi登录功能源码分析
  • 原文地址:https://blog.csdn.net/Thousand_drive/article/details/126199227