[原创] 【Luckfox幸狐 RV1106 Linux 开发板测评】三、GPIO点灯

sonicfirr   2024-1-26 13:04 楼主

本人【Luckfox幸狐 RV1106 Linux 开发板测评】帖子链接:

一、开箱及测试

二、SDK获取与编译镜像

 

本篇依然参考Luckfox Wiki之GPIO完成:

https://wiki.luckfox.com/zh/Luckfox-Pico/Luckfox-Pico-GPIO/ 

1、测评工作准备

主要测评工作是控制板上GPIO1_C7_d进行LED点灯操作,IO编号55。IO编号算法:pin = bank * 32 + (group * 8 + X)。

以GPIO1_C7_d为例,bank是1(对应GPIO1中的1),group是C即2(A=0,B=1,C=2,D=3),X是7(对应C7中的7)。

利用面包板、LED灯珠、电阻(1K)、杜邦线两根(公对母)完成本次实验的硬件准备工作。

 

image-20240126130015-11.png  

image-20240126130015-12.png  

图3-1 Luckfox Pico Max引脚图及连线照片

 

软件准备工作则包括:Virtual Box+Ubuntu20.04虚拟机(已经clone了Luckfox SDK)作为程序开发、本机使用VS Code + Remote-SSH插件作为IDE、本机使用ADB向开发板发送编译后的程序文件。

 

image-20240126130015-13.png  

image-20240126130015-14.png  

image-20240126130015-15.png  

图3-2 GPIO开发软件相关准备工作

 

编程前先验证GPIO的有效性,利用echo命令控制IO,相关方法请查看文档,具体命令如下图所示:

 

image-20240126130015-16.png  

图3-3 echo命令控制55号IO

 

2C程序控制GPIO

接着验证C程序控制IO55,在Ubuntu20.04虚拟机中SDK目录创建“CLan/00led/led.c”作为源文件,相关代码也是从文档拷贝的,这里加了个人理解的注释。

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>

int main() {
  int gpio_pin;

  printf("请输入GPIO引脚号:");
  scanf("%d", &gpio_pin);

  // 打开GPIO引脚配置文件,用于设置引脚为输出模式
  // 即导出GPIO55到用户空间
  FILE *export_file = fopen("/sys/class/gpio/export", "w");
  if (export_file == NULL) {
      perror("无法打开GPIO引脚配置文件");
      return -1;
  }
  // 文件中写入55,相当于命名:echo 55 > /sys/class/gpio/export
  fprintf(export_file, "%d", gpio_pin);
  fclose(export_file);

  // 组合出设置IO方向的文件路径字符串
  char direction_path[50];
  snprintf(direction_path, sizeof(direction_path), "/sys/class/gpio/gpio%d/direction", gpio_pin);
  // 打开GPIO方向配置文件,设置引脚为输出模式
  FILE *direction_file = fopen(direction_path, "w");
  if (direction_file == NULL) {
      perror("无法打开GPIO方向配置文件");
      return -1;
  }
  // 文件中写入out,相当于命令:echo out > /sys/class/gpio/gpio55/direction
  fprintf(direction_file, "out");
  fclose(direction_file);

  char value_path[50];
  char cat_command[100];
  snprintf(value_path, sizeof(value_path), "/sys/class/gpio/gpio%d/value", gpio_pin);
  snprintf(cat_command, sizeof(cat_command), "cat %s", value_path);
  // 打开GPIO值配置文件,用于设置引脚输出值
  FILE *value_file = fopen(value_path, "w");
  if (value_file == NULL) {
      perror("无法打开GPIO值配置文件");
      return -1;
  }

  for (int i = 0; i < 3; i++) {
      // 设置引脚输出值为1,并将值写入到配置文件中并立即刷新缓冲区,使值立即生效。
      fprintf(value_file, "1");
      fflush(value_file);
      // 使用系统命令读取引脚当前的值,并显示在终端上。此命令实际上是为了确认引脚值是否改变。
      system(cat_command);
      sleep(1);  // 等待1秒。
      // 设置引脚输出值为0,并将值写入到配置文件中并立即刷新缓冲区。
      fprintf(value_file, "0");
      fflush(value_file);
      // 再次使用系统命令读取并显示引脚当前的值。这是为了确认引脚值是否再次改变。
      system(cat_command);
      sleep(1);  // 再次等待1秒。
  }
  fclose(value_file);  // 关闭GPIO值配置文件。
  FILE *unexport_file = fopen("/sys/class/gpio/unexport", "w");  // 打开GPIO引脚反配置文件,用于取消配置引脚。
  if (unexport_file == NULL) {  // 如果无法打开该文件,则打印错误信息。
      perror("无法打开GPIO反配置文件");  // 打印错误信息。
      return -1;  // 返回错误代码。
  }
  fprintf(unexport_file, "%d", gpio_pin);  // 将引脚号写入到反配置文件中。
  fclose(unexport_file);  // 关闭反配置文件。
  return 0;  // 返回0表示程序执行成功。
}

程序编写好就是进行编译构建了,文档上给的方法是用export把gcc路径添加到环境变量中,本人图省事,直接敲入gcc的完整路径实现。相关命令:

# 源文件led.c,编译后程序led

~/luckfox-pico/tools/linux/toolchain/arm-rockchip830-linux-uclibcgnueabihf/bin/arm-rockchip830-linux-uclibcgnueabihf-gcc led.c -o led

 

image-20240126130015-17.png  

图3-4 文档添加gcc到环境变量的页面截图

 

image-20240126130015-18.png  

图3-5 完整路径运行gcc编译

 

最后,就是将程序led发送到开发板并运行,可以使用adb push命令。当然,前提是先从虚拟机拷贝文件到本机Win10系统,因为板子是通过RNDIS连接到本机的,虚拟机上访问不到开发板。开发使用了VS Code + Remote-SSH,支持下载远端文件(即虚拟机)到本地,也支持本地文件拖拽并上传到远端。在本机D盘新建Luckfox目录,放置板子的应用程序,然后拷贝编译好的led文件过来。

 

image-20240126130015-19.png  

图3-6 利用VS Code下载虚拟机文件到本地系统

 

image-20240126130015-20.png  

图3-7 利用VS Code下载虚拟机文件到本地系统

 

上图即利用adb push命令将程序文件led发送到Buildroot系统的/app目录下(自建目录,用来放置自建测试程序)。然后利用adb shell登录开发板控制台,并chmod修改led的权限——赋予执行权限,然后就是./led执行程序。注:上述adb命令都添加“-s”参数指定ADB连接的设备串号,开发板串号通过adb devices获取,有不明白的小伙伴可以参考本人第一篇:开箱及测试。

回复评论

暂无评论,赶紧抢沙发吧
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 京公网安备 11010802033920号
    写回复