基于linux泰山派Blink

ChangeCode
原创
发布时间: 2025-06-11 16:12:23 | 阅读数 0收藏数 0评论数 0
封面
泰山派开发板,基于RK3566处理器,是一款高性能的开发平台。要在泰山派上实现点灯功能,首先需要将LED灯正确连接到开发板的GPIO引脚上。接着,通过编写相应的控制程序,设置GPIO为输出模式,并控制其电平状态来开关LED灯。

准备工作:

材料:

材料名称
数量
备注
泰山派 2G+16G
1
/
LED灯珠
1
/
杜邦线
/
/
面包板
1
(可选)

工具:

工具名称
数量
备注
Xshell
1
/
ubuntu虚拟机
1
/
交叉编译工具
1
/
1

泰山派介绍

泰山派是一块基于Rockchip RK3566芯片的Linux开发板,由立创电子推出。这款开发板旨在为开发者和爱好者提供一个软硬结合的平台,用于实现各种创新想法和技术探索。以下是泰山派的主要特点:

  1. 尺寸小巧:泰山派设计紧凑,尺寸仅为70mm x 45mm,比名片还小,方便携带和使用。
  2. 丰富接口:开发板配备了多种接口,包括Type-C电源输入、EDP显示接口、WIFI/BT模块、MIPI CSI摄像头接口、TF卡槽、40Pin GPIO扩展口、其他接口和触摸点等,满足多样化的应用需求。
  3. 硬件参数
  4. 主控:采用Rockchip RK3566主控,支持OpenCL 1.1/2.0, Vulkan 1.1标准,主频高达1.8GHz;
  5. 内存:EMMC 8/16/32/64/128GB;
  6. 存储:支持USB Type_C输入,5V3A输入;GH1.2J电压子板,5V~18V,2A输出;micro USB电源输入,5V~18V,2A输入;Micro HDMI高清输出,1080P@60Hz,4K@60Hz;
  7. 显示接口:EDP原生串行接口,2560 X1600@60Hz;
  8. 网络通信接口:MIPI CSIS串行接口,1080P@60fps;
  9. 其他通信接口或模块:USB2.0接口,Type-C 5V电源;
  10. TF卡槽:Debug调试端口;
  11. 40Pin GPIO扩展口:最高支持40Pin扩展功能,兼容树莓派Raspberry Pi;
  12. 39Pin高速数字信号扩展口:兼容Raspberry Pi Pico;
  13. 其他接口或模块:3.5mm音频插孔,麦克风输入,SMA天线接口,SIM卡,eMMC,mini PCIe智;
  14. 指纹识别:RK3566整机指纹识别;
  15. 扩展:Recovery恢复模式;
  16. 三色LED:RGB三色LED指示灯。
  17. 支持多屏显示及触摸:泰山派支持4K HDMI、1080p EDP、1080p MIPI三种显示方式,同时支持触摸操作。
  18. AI加速:泰山派内含的NPU支持AI神经网络模型部署,可快速实现人脸识别、动物识别、文字识别等功能,让设备更加智能化。
  19. 无线连接:泰山派板载WiFi/蓝牙模块,确保稳定性和兼容性,全方位满足各类应用需求。

泰山派开发板不仅具备强大的性能,而且体积小巧,易于携带和使用,非常适合个人开发者和小型团队进行产品原型设计和测试。

2

GPIO接口

泰山派开发板提供了丰富的GPIO接口和其他高速接口,这些接口允许用户连接各种外部设备和传感器,从而实现更多的功能和应用。下面是泰山派开发板GPIO接口的一些关键特性:

GPIO接口

泰山派开发板兼容经典40PIN扩展接口,提供了丰富的GPIO引脚,包括GPIO、SPI、I2C、UART和PWM等。这些引脚被组织成两列表格,每列表示一个方向的引脚分配。每个引脚都有对应的复用功能,例如3.3V、5V、GND、I2C_SDA_M0、I2C_SCL_M0、SPI_MOSI_M1、SPI_MISO_M1、SPI_CLK_M1等等。这些引脚可以用来连接各种传感器、执行器或其他外围设备,以实现特定的功能。

高速接口

除了GPIO接口,泰山派还提供了众多高速接口,包括100/1000M以太网、USB2.0/3.0、MINI PCIE、SATA、GPS、耳机和GPIO接口等。这些接口可以帮助用户连接高速设备,如网络适配器、硬盘驱动器、GPS接收器等。

应用实例

为了帮助用户更好地理解这些接口的用途,图片中展示了几个应用实例,包括:

  1. 使用GPIO接口连接的按钮、传感器和显示器等设备;
  2. 使用高速接口连接的以太网、USB、SATA和耳机等设备。

这些例子说明了泰山派开发板的多功能性和灵活性,使用户可以根据自己的需求自由定制和扩展电路板的功能。

3

RGB灯

泰山派开发板上有一颗RGB三色灯,在板载右下方,开发板上电一会后开始闪烁,表示系统已经正常运行。

4

ADB控制

通过adb执行命令来控制这三颗灯,先看一下三个灯的节点其中rgb-led-b对应蓝灯,rgb-led-g对应绿灯,rgb-led-r对应红灯

root@RK356X:/# ls /sys/class/leds/
mmc0:: rgb-led-b rgb-led-g rgb-led-r

进入rgb-led-x可查看相关属性,这里以rgb-led-b为例其他相同

root@RK356X:/# ls /sys/class/leds/rgb-led-b
brightness delay_on max_brightness subsystem uevent
delay_off device power trigger
  1. brightness: 这个属性用于控制 LED 的亮度。可以通过读写该文件来设置 LED 的亮度水平。
  2. device: 这个属性表示与 LED 相关的设备路径。
  3. invert:这个属性表示 LED 的极性翻转。当该值为 0 时,LED 的行为符合正常的预期。当该值为 1 时,LED 的行为与预期相反。
  4. max_brightness: 这个属性表示 LED 可接受的最大亮度值。亮度值在 0 到 max_brightness 之间。
  5. power:这个属性表示 LED 的电源状态。它可以是 “on” 表示开启,或者 “off” 表示关闭。
  6. subsystem:这个属性表示该 LED 设备所属的子系统。
  7. trigger:这个属性表示 LED 的触发器。它定义了 LED 的行为模式,如闪烁、呼吸灯等。你可以通过写入不同的触发器名称来改变 LED 的行为。我这里列出一些常用触发方式:

- none:禁用触发器,LED 保持灭。

- default-on:默认开启触发器,LED 在开机时保持常亮。

- heartbeat:心跳触发器,LED 呼吸灯效果,类似于心跳的闪烁。

- timer:计时器触发器,LED 在特定时间间隔内闪烁。

  1. uevent:这个属性包含有关 LED 设备的事件信息
  2. 当然你也可以通过cat trigger来查看他支持哪些模式
root@RK356X:/# cat /sys/class/leds/rgb-led-b/trigger none rfkill-any rfkill-none kbd-scrolllock kbd-numlock kbd-capslock kbd-kanalock kbd-shiftlock kbd-altgrlock kbd-ctrllock kbd-altloc k kbd-shiftllock kbd-shiftrlock kbd-ctrlllock kbd-ctrlrlock mmc2 mmc0 [timer] rfkill0 mmc1 rfkill1 rfkill2
  1. none: 禁用触发器,LED 保持灭。
  2. rfkill-any: 在任何 RFKill 状态变化时触发,例如 Wi-Fi 或蓝牙开关状态改变。
  3. rfkill-none: 在 RFKill 禁用状态下触发。
  4. test_ac-online: 在电源适配器插入时触发。
  5. test_battery-charging-or-full: 在电池充电或达到充满状态时触发。
  6. test_battery-charging: 在电池充电时触发。
  7. test_battery-full: 在电池达到充满状态时触发。
  8. test_battery-charging-blink-full-solid: 在电池充电时闪烁直到充满,然后保持常亮。
  9. test_usb-online: 在 USB 设备插入时触发。
  10. mmc0, mmc1, mmc2:在对应的 MMC 设备操作时触发。
  11. timer:根据设定的时间间隔触发。
  12. [heartbeat]:心跳触发器,LED 呼吸灯效果。
  13. backlight: 背光触发器,通常用于控制显示屏的背光 LED。
  14. default-on: 默认开启触发器,在开机时保持常亮。
  15. rfkill0, rfkill1, rfkill2: 在对应的 RFKill 设备状态变化时触发。
  16. 关闭所有灯
#关闭蓝灯
rk3566_tspi:/ # echo "none" > /sys/class/leds/rgb-led-b/trigger
#关闭绿灯
rk3566_tspi:/ # echo "none" > /sys/class/leds/rgb-led-g/trigger
#关闭红灯
rk3566_tspi:/ # echo "none" > /sys/class/leds/rgb-led-r/trigger
  1. 所有灯常亮
#常亮蓝灯
rk3566_tspi:/ # echo "default-on" > /sys/class/leds/rgb-led-b/trigger
#常亮绿灯
rk3566_tspi:/ # echo "default-on" > /sys/class/leds/rgb-led-g/trigger
#常亮红灯
rk3566_tspi:/ # echo "default-on" > /sys/class/leds/rgb-led-r/trigger
  1. 心跳
#常亮蓝灯
rk3566_tspi:/ # echo "heartbeat" > /sys/class/leds/rgb-led-b/trigger
#常亮绿灯
rk3566_tspi:/ # echo "heartbeat" > /sys/class/leds/rgb-led-g/trigger
#常亮红灯
rk3566_tspi:/ # echo "heartbeat" > /sys/class/leds/rgb-led-r/trigger
  1. 定时闪烁
#常亮蓝灯
rk3566_tspi:/ # echo "timer" > /sys/class/leds/rgb-led-b/trigger
#常亮绿灯
rk3566_tspi:/ # echo "timer" > /sys/class/leds/rgb-led-g/trigger
#常亮红灯
rk3566_tspi:/ # echo "timer" > /sys/class/leds/rgb-led-r/trigger

自己可以动手试试,比如rfkill-an会在你关闭蓝牙时候被点亮等等。

5

SSH控制GPIO

以下是使用文档中使用Shell控制GPIO的输出

  1. 使用root权限
rk3566_tspi:/$ su
  1. 将引脚号 15 导出为 GPIO 引脚,使其可以被访问和控制。
rk3566_tspi:/$ echo 15 > /sys/class/gpio/export
  1. 将引脚号 15 的方向设置为输出模式,即设置为输出引脚。
rk3566_tspi:/$ echo out > /sys/class/gpio/gpio15/direction
  1. 将引脚号 15 的值设置为 1,即将引脚设置为高电平。
rk3566_tspi:/$ echo 1 > /sys/class/gpio/gpio15/value
  1. 将引脚号 15 的值设置为 0,即将引脚置设置为低电平。
rk3566_tspi:/$ echo 0 > /sys/class/gpio/gpio15/value
  1. 将引脚号 15 解除导出,即取消对引脚号 15 的 GPIO 控制权。
rk3566_tspi:/$ echo 15> /sys/class/gpio/unexport

其中引脚ID是根据控制器(GPIO0),端口(B),索引序号(7)确定的

使用ls /sys/class/gpio可以看见有gpiochip0 gpiochip32 gpiochip64 gpiochip96 gpiochip128分别对应GPIO0-GPIO4

引脚ID的计算公式为:

控制器号32 + 端口号8 + 索引序号*1

所以GPIO0_B7为:32 x 0 + 1 x 8 + 7 x 1 = 15

6

C语言控制GPIO

#include <stdio.h>#include <stdlib.h>#include <string.h>#include <fcntl.h>#include <unistd.h>#include <sys/stat.h>#include <sys/types.h>

static char gpio_path[100];

static int gpio_config(const char *attr, const char *val);

int main(int argc, char* argv[])
{
int ret;

if(argc != 3)
{
fprintf(stderr, "usage:%s <gpio> <value>\n", argv[0]); //若argc 不为3说明给程序传入的参数不足两个,无法执行程序exit(-1);
}

sprintf(gpio_path, "/sys/class/gpio/gpio%s", argv[1]); //导出的引脚的路径
if(access(gpio_path, F_OK)) //access函数:如果文件存在返回0,不存在返回-1
{
int fd, len;
fd = open("/sys/class/gpio/export", O_WRONLY);
if(fd < 0)
{
perror("open error");
return -1;
}

len = strlen(argv[1]);
if(write(fd, argv[1], len) != len) //write函数第一个参数为要写入的位置,第二个参数为要写入的内容,第三个参数是内容的字节数,如果执行成功返回值为内容的字节数
{
perror("write error");
close(fd);
exit(-1);
}
close(fd);
}

ret = gpio_config("direction", "out");
if(ret != 0)
{
fprintf(stderr, "gpio_config error1");
exit(-1);
}

ret = gpio_config("active_low", "0");
if(ret != 0)
{
fprintf(stderr, "gpio_config error2");
exit(-1);
}

ret = gpio_config("value", argv[2]);
if(ret != 0)
{
fprintf(stderr, "gpio_config error3");
exit(-1);
}
exit(0);
}

static int gpio_config(const char *attr, const char *val)
{
char file_path[100];
int len, fd;

sprintf(file_path, "%s/%s", gpio_path, attr);
fd = open(file_path, O_WRONLY);
if(fd < 0)
{
perror("open error2");
return -1;
}

len = strlen(val);
if(write(fd, val, len) != len)
{
perror("write error2");
close(fd);
return -1;
}

close(fd);
return 0;
}

7

编译配置

我是使用ubuntu虚拟机编译后使用scp上传到泰山派执行

ubuntu中下载交叉编译工具可以使用sudo apt install gcc-arm-linux-gnueabihf

安装完成后使用

arm-linux-gnueabihf-gcc ./test.c -o test -static

命令交叉编译

注意这里有的要加上-static

我刚开始编译时没有使用-static,结果上传到泰山派上执行的时候报错No such file or directory

上网查说是由于交叉编译器的差异,不同的交叉编译器链接的动态库内容相同但是路径不同,所以会提示找不到文件

所以使用静态链接编译

在ubuntu上使用gcc来编译后上传到泰山派运行会提示无法执行二进制文件,所以需要使用交叉编译器

8

交叉编译器

直接从 Ubuntu apt 获得

sudo apt-get install gcc-arm-linux-gnueabihf

还有一个 aarch64 版本:

sudo apt-get install gcc-aarch64-linux-gnu
阅读记录0
点赞0
收藏0
禁止 本文未经作者允许授权,禁止转载
猜你喜欢
评论/提问(已发布 0 条)
评论 评论
收藏 收藏
分享 分享
pdf下载 下载