Luckfox Pico GPIO使用教程

查看引脚图

GPIO(通用输入/输出)是一种通用引脚,可以由微控制器(MCU)或CPU控制,具有多种功能,包括高低电平输入检测和输出控制。在 Linux 中,GPIO 引脚可以被导出到用户空间,通过 sysfs 文件系统进行控制,使得 GPIO 引脚可以用于各种用途,如串口通信、I2C、网络通信、电压检测等。
在 Linux 中,有一个专门的 GPIO 子系统驱动框架,用于处理 GPIO 设备。通过这个框架,用户可以轻松地与 CPU 的 GPIO 引脚进行交互。这个驱动框架支持将引脚用于基本的输入和输出功能,同时输入功能还支持中断检测。这使得开发者可以利用 GPIO 子系统轻松地将 GPIO 引脚用于各种用途,实现了灵活性和可编程性。有关 GPIO 子系统的更多详细信息可以在 <Linux内核源码>/Documentation/gpio 目录中找到。在将 GPIO 引脚导出到用户空间时,通常需要用到引脚编号,我们可以通过接口图进行确定,如4号引脚的引脚名称为 GPIO1_C7_d,引脚编号为55。
编号计算

GPIO对应的引脚编号均在引脚图中标出,您可以直接使用或按照下面方法进行计算。
- GPIO 有5个 bank:GPIO0~GPIO4,每个 bank 分为4组,共有32个 pin:A0~A7, B0~B7, C0~C7, D0~D7
- GPIO 的命名方式为 GPIO{bank}_{group}{X},如下所示:
GPIO0_A0 ~ A7
GPIO0_B0 ~ B7
GPIO0_C0 ~ C7
GPIO0_D0 ~ D7
GPIO1_A0 ~ A7
....
GPIO1_D0 ~ D7
....
GPIO4_D0 ~ D7
- GPIO 编号计算方法如下:
GPIO 引脚编号计算公式:pin = bank * 32 + number
GPIO 组内编号计算公式:number = group * 8 + X
综上:pin = bank * 32 + (group * 8 + X)
以 GPIO1_C7_d 为例说明,其中:
- bank :1
- group :2 (A=0, B=1, C=2, D=3)
- X :7
所以 GPIO1_C7_d 的引脚编号为:1 x 32 + ( 2 x 8 + 7 ) = 55
查看设备目录

在 /sys/class/gpio 目录中,每个 GPIO 设备都有其自己的文件夹。这些文件夹的名称是 gpio 加上引脚编号,例如 /sys/class/gpio/gpio55 表示引脚编号为 55 的引脚,即 GPIO1_C7_d。您可使用如下命令查看:
查看设备属性

在这些设备目录中,您还可以找到与 GPIO 引脚相关的控制文件,包括方向、值和中断等。每个GPIO设备目录中都包含一组属性文件,这些属性文件用于配置和管理GPIO引脚。您可以在GPIO设备目录中使用如下命令查看:
- 查看gpio55设备的属性文件
# echo 55 > /sys/class/gpio/export
# cd gpio55
# ls
value power subsystem active_low
uevent edge device direction
- 属性文件通过使用这些属性文件,您可以轻松地配置和控制GPIO引脚,使其适应不同的应用场景和需求。其中一些关键的属性包括:
- 方向(direction):
- 配置为输入:in
- 配置为输出:out
- 值(value):
- 输出低电平:0
- 输出高电平:1
- 中断边沿(edge):
- 上升沿触发:rising
- 下降沿触发:falling
- 双边沿触发:both
- 禁用中断:none
控制GPIO引脚电平

设备的属性文件就相当于一个函数的参数接口。对于 /sys/class/gpio/gpio55/value ,每次对文件执行写入操作时,会触发驱动代码,使用这次写入的内容作为参数来修改 gpio55 的引脚电平;而每次读取操作时,则触发驱动代码将当前 gpio55 的引脚电平更新到 /sys/class/gpio/gpio55/value 文件。
- 导出gpio55到用户空间
echo 55 > /sys/class/gpio/export
- 读取 GPIO1_C7_d 引脚电平
echo 55 > /sys/class/gpio/export
echo in > /sys/class/gpio/gpio55/direction
cat /sys/class/gpio/gpio55/value
- 控制 GPIO1_C7_d 引脚电平
echo out > /sys/class/gpio/gpio55/direction
echo 1 > /sys/class/gpio/gpio55/value
echo 0 > /sys/class/gpio/gpio55/value
- 取消导出gpio55到用户空间
echo 55 > /sys/class/gpio/unexport
控制gpio的python程序

这段代码使用 periphery 库在 Python 中打开两个 GPIO 引脚,Write_GPIO 用于输出,Read_GPIO 用于输入。
这段代码使用 Write_GPIO 对象将逻辑值 True 写入 GPIO 引脚实现引脚输出高电平,将逻辑值 False 写入 GPIO 引脚实现引脚输出低电平。
这段代码通过读取 Read_GPIO 引脚的状态,并将其打印出来。Read_GPIO.read() 返回引脚的电平状态(高电平为 True,低电平为 False)。
pin_state = Read_GPIO.read()
print(f"Pin state: {pin_state}")
实验




- 使用 nano 工具在终端创建 py 文件,粘贴并保存 python 程序
# nano gpio.py
- 运行程序
# python3 gpio.py
- 实验现象55、54引脚无连接:55、54引脚相接。
控制gpio的c程序

通过附件中的c程序,可以实现 GPIO 引脚的电平控制。接下来我们对程序进行解读。
1.导出引脚到用户空间
这段代码通过读取用户输入的引脚编号,打开 /sys/class/gpio/export 文件,并写入该编号,实现了 GPIO 引脚的导出操作。
2.配置GPIO方向
这段代码通过打开 /sys/class/gpio/gpiox/direction 文件,并写入 "out",确保了 GPIO 引脚被设置为输出模式。如需配置为输入模式,则写入 “in”。
3.控制引脚输出电平
这段代码用于控制 GPIO 引脚的电平。首先,需要打开 /sys/class/gpio/gpiox/value 文件,该文件用于设置 GPIO 引脚的电平值。在一个循环中,我们通过向文件依次写入 “1” 和 “0” 实现对引脚的控制,再调用 cat 命令查看 value 中存储的值,检查是否写入成功。
注意,标准C库通常使用缓冲区来提高文件操作的效率,而不是每次写入都立即将数据写入磁盘文件。这就意味着,尽管你调用了 fprintf 来写入数据,数据实际上可能会被暂时保存在缓冲区中,并且不会立即写入文件。如果你希望确保数据被立即写入文件,你可以使用 fflush 函数来刷新缓冲区,这样可以强制将缓冲区中的数据写入文件,或每次都使用 fopen->fprintf->fclose 的方式写入。
4.取消导出引脚
这段代码通过打开 /sys/class/gpio/unexport 文件,并写入 GPIO 引脚的编号,实现了 GPIO 引脚的取消导出操作。
5.交叉编译
- 指定交叉编译工具首先,我们要将交叉编译工具的路径添加到系统的 PATH 环境变量中,以便可以在任何地方使用交叉编译工具,您可以在shell配置文件中添加以下行(通常是 ~/.bashrc 或 ~/.bash_profile 或 ~/.zshrc,具体取决于您使用的shell),注意 PATH= 后的路径为交叉编译工具所在的目录。
- gcc路径
- 打开shell配置文件
- 将交叉编译工具的路径添加到系统的PATH环境变量中,将 <SDK Directory> 修改为自己的 SDK 路径,如 /home/luckfox/luckfox-pico/
- 重新加载shell配置文件,使更改生效
<SDK Directory>/tools/linux/toolchain/arm-rockchip830-linux-uclibcgnueabihf/bin/arm-rockchip830-linux-uclibcgnueabihf-gcc
vi ~/.bashrc
export PATH=<SDK Directory>/tools/linux/toolchain/arm-rockchip830-linux-uclibcgnueabihf/bin:$PATH
source ~/.bashrc
- 使用交叉编译工具编译程序
arm-rockchip830-linux-uclibcgnueabihf-gcc gpio.c -o gpio
- 交叉编译成功后,将在当前目录下生成可在开发板运行的可执行文件
# ls
gpio gpio.c
6.运行程序
- 文件传输先将 gpio 从虚拟机传输到 Windows,再通过 TFTP 或 ADB 传输到开发板,将文件从 Windows 通过 ADB 将文件传输到开发板的步骤如下:
adb push 文件所在路径 开发板存储路径
eg:(将当前目录下gpio文件传输到开发板的根目录)
adb push gpio /
- 运行程序修改 gpio 文件的操作权限后运行程序
# chmod 777 gpio
# ./gpio
实验现象成功实现电平翻转











