【平头哥Sipeed LicheeRV 86 Panel测评】9-闪烁LED
[复制链接]
本篇来介绍LicheeRV 86 Panel板子的LED控制。
SD里的这个Linux系统里,已经有LED的驱动程序了,本篇在控制LED,其实是在应用层通过操作文件的方式实现LED的控制(Linux中一切皆文件,LED也一样)。
注意,对于这个86 Panel板子,需要把核心板拆下来进行实验,因为对应引脚连接了外设。
1 控制LED亮灭
1.1 原理图
查看原理图,可知该LED连接的是PC1:
看IO复用情况表,可知该IO的数字标号为65:
cat /sys/kernel/debug/pinctrl/2000000.pinctrl/pinmux-pins
1.2 指令控制LED
我们先导出该GPIO:
echo 65 > /sys/class/gpio/export
cd /sys/class/gpio/gpio65
然后再将该IO置为输出状态,即可操作其电平:
echo out>direction
echo 1 > value #LED点亮
echo 0 > value #LED熄灭
具体操作如下图:
LED亮起,如图:
2 控制LED闪烁
通过指令,可以控制LED亮灭了,可以继续编写程序来实现LED的闪烁:
2.1 程序
在Ubuntu中编写ledtest.c程序:
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/stat.h>
#include <sys/types.h>
#include <fcntl.h>
#define LED_GPIO "/sys/class/gpio/export"
#define LED_DIR "/sys/class/gpio/gpio65/direction"
#define LED_VAL "/sys/class/gpio/gpio65/value"
int main()
{
printf("led test begin\n");
int fd_gpio = 0;
int fd_dir = 0;
int fd_val = 0;
//导出LED的GPIO
fd_gpio = open(LED_GPIO, O_WRONLY);
if (fd_gpio < 0)
{
printf("fd_gpio:%s open fail\n", LED_GPIO);
exit(1);
}
write(fd_gpio, "65", 2);
//设置为输出
fd_dir = open(LED_DIR, O_WRONLY);
if (fd_dir < 0)
{
printf("fd_dir:%s open fail\n", LED_DIR);
exit(1);
}
write(fd_dir, "out", 3);
//控制LED闪烁
fd_val = open(LED_VAL, O_WRONLY);
if (fd_val < 0)
{
printf("fd_val:%s open fail\n", LED_VAL);
exit(1);
}
for (int i=0; i<10; i++)
{
write(fd_val, "1", 1);
sleep(1);
write(fd_val, "0", 1);
sleep(1);
}
//释放资源
close(fd_gpio);
close(fd_dir);
close(fd_val);
printf("led test end\n");
return 0;
}
以上程序,本质就是将手动控制LED的指令,通过代码的形式实现出来。
最后是一个for循环,LED每隔1s亮/灭一次,10次循环后退出。
2.2 编译
编译工具链的搭建,上一篇已有介绍。
编译指令如下:
unset LD_LIBRARY_PATH
source ~/.local/riscv64-toolchain/environment-setup-riscv64-oe-linux
$CC -o ledtest ledtest.c
编译结果如图:
2.3 运行
通过ADB工具将led测试程序拷贝到开发板,运行:
运行效果如下:
3 总结
本篇介绍了LicheeRV 86 Panel板子如何控制核心板上的LED亮灭。
|