写在前面
最近刷bilibili发现微雪电子关于luckyfox pico的介绍视频,感叹linux开发板居然可以把价格缩到100RMB以内,也正巧结束了复旦微比赛,受够了FM33LC046N
的低性能,来玩点便宜又高性能的板子。
开发板型号:luckfox pico max
开发环境:Ubuntu 22.04
参考:luckyfox pico官方WIKI、微雪bilibili视频
一、环境搭建,输出hello world
开发环境的搭建主要是根据官方WIKI的上手教程来进行,
因为max是新出的,这里暂时只有标准版和plus的教程,我们按照plus的来就可以。因为SPI NAND FLASH中已经有出厂镜像了,因此这里无需再进行烧录。
我们直接接上type-c USB进行ADB连接。WIKI中已经介绍过windows系统下ADB的使用了,因为开发都是在linux中的,所以这里直接介绍linux下的adb连接。
初学者可以按照教程用他给的镜像,但是这里我们头铁,我们要学会嵌入式的通用开发方式。打开我的虚拟机Vimware,系统是ubuntu22.04,这里不一样都没关系,下面我们开始!
安装相关依赖
sudo apt-get install repo git ssh make gcc gcc-multilib g++-multilib module-assistant expect g++ gawk texinfo libssl-dev bison flex fakeroot cmake unzip gperf autoconf device-tree-compiler libncurses5-dev pkg-config
安装adb工具:
sudo apt install adb
克隆官方git
git clone https://github.com/LuckfoxTECH/luckfox-pico.git
激活交叉工具链环境变量,第一次执行如果报错,再重新执行一遍source即可
cd tools/linux/toolchain/arm-rockchip830-linux-uclibcgnueabihf/
source env_install_toolchain.sh
激活之后我们就可以写一个简单的C程序,
#include<stdio.h>
int main(){printf("hello world\n");return 0;
}
对其进行编译
arm-rockchip830-linux-uclibcgnueabihf-gcc aaa.c aaa.o
编译好后的文件我们使用adb发送到开发板上,首先输入
adb connect 172.32.0.93
完成adb连接,这里需要注意,在windows下adb工具可以不指定端口号,这里需要指定端口号,这和具体的adb工具有关。
然后登陆到开发板。
接着另外启动一个窗口,通过adb把交叉编译好的文件发送过去,语法如下
然后我们再查看开发板上的文件,发现多了一个aaa.o,并运行它
二、GPIO使用
使用gpio之前需要提一下gpio的编号,因为在开发板的linux系统中,gpio通过编号进行索引
GPIO有5个bank,每个bank32个pin;
每个bank又可以分为ABCD四组,每组8个pin
因此,对于GPIO1_C7_d,编号=1*32+8*2+7=55. 后面那个小d是后缀
根据引脚示意图,我们可以查到gpio55的位置,我们接上LED灯和电阻
2.1 shell控制GPIO
我们首先尝试使用在shell内直接更改GPIO设备文件的方法
导出gpio55到用户空间
echo 55 > /sys/class/gpio/export
读取 GPIO1_C7_d 引脚电平
echo 55 > /sys/class/gpio/export
echo in > /sys/class/gpio/gpio55/direction
cat /sys/class/gpio/gpio55/value
输出 GPIO1_C7_d 引脚电平,可以观测到led的变化
echo out > /sys/class/gpio/gpio55/direction
echo 1 > /sys/class/gpio/gpio55/value
echo 0 > /sys/class/gpio/gpio55/value
2.2 C语言系统调用控制GPIO
当然,更常用的办法是使用C语言通过系统调用的方式修改设备文件,实现对GPIO的控制。
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>int main(){int gpio_pin;printf("Enter GPIO pin number:");scanf("%d",&gpio_pin);//export gpio to userFILE *export_file = fopen("/sys/class/gpio/export","w");if(export_file == NULL){perror("Failed to open GPIO export file");return -1;}fprintf(export_file,"%d",gpio_pin);fclose(export_file);//get the direction_pathchar direction_path[50];snprintf(direction_path,sizeof(direction_path),"sys/class/gpio/gpio%d/value",gpio_pin);//get the format char//specify the pin directionFILE *direction_file = fopen(direction_path,"w");if (direction_file == NULL){perror("Failed to open GPUI direction file");return -1;}fprintf(direction_file,"out");fclose(direction_file);char value_path[50];snprintf(value_path,sizeof(value_path),"sys/class/gpio/gpio%d/value",gpio_pin);FILE *value_file = fopen(value_path,"w");if(value_file == NULL){perror("Failed to open GPIO value file");return -1;}for(int i=0; i<300; i++){fprintf(value_file,"1");fflush(value_file);sleep(1);fprintf(value_file,"0");fflush(value_file);sleep(1);}fclose(value_file);return 0;
}
使用交叉编译工具链进行编译,然后通过adb传输到开发板上运行即可,可以观察到LED的闪烁。
用到的重要的函数需要解释一下:
fflush(File_ptr)//这个函数用来刷新缓冲区
snprintf()//这个函数用来把带格式控制的字符串转变成普通字符串