介绍:
前段时间购买了野火科技的鲁班猫lubancat1去学习linux,在学习过程中,编写几篇博客作为记录学习路径以及复习的基地。
再次感谢野火始终如一的开源精神!本人从stm32到linux、FPGA都是学习野火科技的教程!
硬件:
鲁班猫CAT1
软件:
[野火]《快速使用手册—基于LubanCat-RK3566/RK3568系列板卡》(鲁班猫0/1/2系列)
GPIO介绍:
GPIO(General-Purpose Input/Output)是一种通用的输入输出接口,允许微控制器或计算机与外部设备进行交互。GPIO 引脚可以配置为输入或输出模式,用于读取外部信号或控制外部设备,如LED、按钮和传感器。GPIO 引脚的状态可以通过编程进行设置和读取,广泛应用于嵌入式系统和物联网设备中。
Linux系统中进行GPIO控制
Linux中针对不同语言进行开发有各种选择,我这里演示主要是以C/C++进行演示两种不同的控制方式。
方式一:使用GPIO sysfs接口控制IO
首先是演示示例:
GPIO32,33,36的输出高低电平实验:
GPIO32,33,36的读取外部电平实验:
使用 GPIO sysfs 接口控制 IO 是 Linux 系统中的一种常见方法。通过 sysfs 文件系统,你可以直接操作 GPIO 引脚,而无需编写复杂的驱动程序。其中操作Linux的方式又分为以下几个步骤:
步骤1:导出线(又称为使能)
首先便是对所使用的GPIO线进行导出,在嵌入式中我们又可以称作使能。
使用 echo 命令将 GPIO 线路编号写入 /sys/class/gpio/export 文件,以使能该线路。
例如文中在对应的:/sys/class/gpio文件夹中存在着export以及unexport两个部分,分别对应了使能和失能。操作有两种方式,一种是用cd命令,先进入当前文件夹后,再执行echo写入命令;另外一种是在执行echo写入命令的时候直接加上绝对地址。
例如:
方式1:
cd /sys/class/gpio //先进入对应文件目录
echo 32 > export //再进行使能
方式2:
执行echo写入命令的时候直接加上绝对地址
echo 18 > /sys/class/gpio/export
步骤2:设置GPIO方向
接下来就是对GPIO的输入输出进行设置:
导出后,可以在 /sys/class/gpio/gpio18 目录下找到该线路的属性文件。
使用 echo 命令设置 GPIO 的方向为输入(in)或输出(out)。
在GPIO对应的文件目录下有以下文件:
active_low device direction edge power subsystem uevent value
其中每一个都有其特定的含义。
active_low:
作用:设置 GPIO 线路的极性。
值:
0:正常模式,高电平为 1,低电平为 0。
1:反相模式,高电平为 0,低电平为 1。
示例:
echo 1 > /sys/class/gpio/gpio18/active_low
device:
作用:指向 GPIO 设备的符号链接。
值:通常是设备的路径。
示例:
ls -l /sys/class/gpio/gpio18/device
direction:
作用:设置 GPIO 线路的方向。
值:
in:输入模式。
out:输出模式。
示例:
echo out > /sys/class/gpio/gpio18/direction
edge:
作用:设置 GPIO 线路的中断触发条件。
值:
none:不触发中断。
rising:上升沿触发。
falling:下降沿触发。
both:上升沿和下降沿都触发。
示例:
echo rising > /sys/class/gpio/gpio18/edge
power:
作用:指向电源管理相关的目录。
值:通常是电源管理相关的子目录。
示例:
ls /sys/class/gpio/gpio18/power
subsystem:
作用:指向 GPIO 子系统的符号链接。
值:通常是 GPIO 子系统的路径。
示例:
ls -l /sys/class/gpio/gpio18/subsystem
uevent:
作用:包含设备的 udev 事件信息。
值:通常是设备的属性信息。
示例:
cat /sys/class/gpio/gpio18/uevent
value:
作用:读取或设置 GPIO 线路的值。
值:
0:低电平。
1:高电平。
示例:
设置值:
echo 1 > /sys/class/gpio/gpio18/value
读取值:
sh
浅色版本
cat /sys/class/gpio/gpio18/value
其中经常被使用到的有:
active_low 设置极性
direction 设置方向
edge 配置中断
value 读取或者写入值
步骤3:设置/读取 GPIO 值
如果 GPIO 线路设置为输出模式,可以使用 echo 命令设置其值为高电平(1)或低电平(0)。
方式1:
echo 1 > /sys/class/gpio/gpio18/value
方式2:
cd /sys/class/gpio/gpio18 //先进入对应文件目录
echo 0 > value //再设置电平为低电平
echo 1 > value //再设置电平为高电平
如果 GPIO 线路设置为输入模式,可以使用 cat 命令读取其值。
cat /sys/class/gpio/gpio18/value
步骤4:释放/使能线
在使用完毕以后,如果只是临时的使用,我们需要紧接着去释放该线
使用 echo 命令将 GPIO 线路编号写入 /sys/class/gpio/unexport 文件,以释放该线路。
如果再没有释放该线的时候就在别的地方操作就会报错:
gpioset: error setting the GPIO line values: Device or resource busy
或者是
-bash: echo: 写错误: 设备或资源忙
所以我们在使用后如果要在后续作为其他引脚功能进行使用,需要进行释放线操作。
完整示例:
这是一个完整示例去控制18输出高地电平的代码
# 导出 GPIO 18
echo 18 > /sys/class/gpio/export
# 设置 GPIO 18 为输出模式
echo out > /sys/class/gpio/gpio18/direction
# 设置 GPIO 18 高电平
echo 1 > /sys/class/gpio/gpio18/value
# 等待一段时间
sleep 2
# 设置 GPIO 18 低电平
echo 0 > /sys/class/gpio/gpio18/value
# 释放 GPIO 18
echo 18 > /sys/class/gpio/unexport
方式二:使用libgpiod控制IO
示例:
设置电平:
获取引脚电平:
libgpiod
是一个用于控制 GPIO(通用输入输出)的 C 库,旨在替代传统的 sysfs 接口。libgpiod
提供了一种更高效、更安全的方式来管理和操作 GPIO 线路。
在大多数的Linux系统中都已经自带该库,如果没有则需要通过指令进行安装!
#安装gpiod 命令行工具
sudo apt-get install libgpiod-dev
sudo apt-get install gpiod
关于其常用命令,这里引用野火科技的一个图进行详细阐述:
对于该库,我们需要注意以下几点:
gpioset 的工作原理
1.自动导出 GPIO 线路:
当你使用 gpioset 设置 线路时, gpioset 会自动导出所需的 GPIO 线路。
这意味着你不需要手动执行echo 33>/sys/class/gpio/export 这样的命令。
2.设置 GPIO 方向和值:
ogpioset 会自动设置 GPI0 线路的方向(输入或输出)并写入相应的值。
3. 自动释放 GPIO 线路:
gpioset 在命令执行完毕后通常会自动释放线路
以上就是本期的一个关于GPIO实验的笔记,一起进步吧!