Linux-RK3566学习记录1-GPIO输入输出实验以及相关指令使用

介绍:

前段时间购买了野火科技的鲁班猫lubancat1去学习linux,在学习过程中,编写几篇博客作为记录学习路径以及复习的基地。

再次感谢野火始终如一的开源精神!本人从stm32到linux、FPGA都是学习野火科技的教程!

硬件:

鲁班猫CAT1

57c44a0503c54304bf3b8a8474b55e0a.jpeg

d32c3b9b478b40b589087f4411898899.jpeg

软件:

 [野火]《快速使用手册—基于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的输出高低电平实验:

0974dc92183a4141a07f616d6caf3514.png

GPIO32,33,36的读取外部电平实验:

ec5351de71dd4ac9835dcb669417b918.png

使用 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

示例:

设置电平:

946972a469044725a51c4f8a6c65d397.png

获取引脚电平:

cbcdae29cc7842b3b48b8af67e8eeb94.png

libgpiod 是一个用于控制 GPIO(通用输入输出)的 C 库,旨在替代传统的 sysfs 接口。libgpiod 提供了一种更高效、更安全的方式来管理和操作 GPIO 线路。

在大多数的Linux系统中都已经自带该库,如果没有则需要通过指令进行安装!

#安装gpiod 命令行工具
sudo apt-get install libgpiod-dev
sudo apt-get install gpiod

关于其常用命令,这里引用野火科技的一个图进行详细阐述:

da1460a114e7448daf933f4637e6fef4.png

对于该库,我们需要注意以下几点:

gpioset 的工作原理


1.自动导出 GPIO 线路:

当你使用 gpioset 设置 线路时, gpioset 会自动导出所需的 GPIO 线路。
这意味着你不需要手动执行echo 33>/sys/class/gpio/export 这样的命令。


2.设置 GPIO 方向和值:

ogpioset 会自动设置 GPI0 线路的方向(输入或输出)并写入相应的值。

3. 自动释放 GPIO 线路:
 

gpioset 在命令执行完毕后通常会自动释放线路

以上就是本期的一个关于GPIO实验的笔记,一起进步吧!

### RK3566 GPIO配置与使用教程 #### 一、硬件准备 对于RK3566开发板,如Purple Pi OH,在进行GPIO操作前需准备好相应的硬件设施。这通常涉及到使用导线连接开发板上的特定引脚至其他组件,比如电源或接地(GND),以实现信号传输的目的[^1]。 #### 二、软件环境设置 在Ubuntu虚拟机环境中针对瑞芯微RK3566开发板开展工作之前,应先确保已安装好必要的工具链和支持库。此过程可能涉及下载并解压SDK包,以及通过命令行执行一系列初始化指令来构建适合目标平台的应用程序框架[^3]。 #### 三、编译内核与烧录镜像 为了使自定义的GPIO功能生效,往往需要重新编译Linux内核并将新生成的`boot.img`文件刷入到开发板中。具体做法是在RK3566项目的根目录下运行`./build.sh kernel`完成编译流程;随后利用Windows系统的专用工具——如RKDevTool.exe——来进行最终的固件更新操作[^2]。 #### 四、编程接口介绍 当一切就绪之后,开发者可以通过编写C/C++源码的方式直接访问底层寄存器控制GPIO状态变化。下面给出一段简单的例子用于点亮LED灯: ```c #include <fcntl.h> #include <unistd.h> int main() { int fd; // 打开/sys/class/gpio/export节点向其中写入要启用的pin号 fd = open("/sys/class/gpio/export", O_WRONLY); write(fd, "gpio-70", strlen("gpio-70")); // 假设这里使用的PIN编号为70 close(fd); // 设置方向为输出模式 char path[]="/sys/class/gpio/gpio70/direction"; fd=open(path,O_WRONLY); write(fd,"out",strlen("out")); close(fd); // 将电平拉高从而触发外部电路反应 strcpy(path,"/sys/class/gpio/gpio70/value"); fd=open(path,O_WRONLY); write(fd,"1",1); // 输出逻辑'1' sleep(1); // 等待一秒后再关闭 lseek(fd,0,SEEK_SET); write(fd,"0",1); // 切换回低电平即'0' return 0; } ``` 这段代码展示了如何借助于标准POSIX API函数集中的I/O调用来操纵指定编号的通用输入输出口,并实现了最基本的开关动作模拟。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

不及你的温柔

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值