最近刷bilibili发现微雪电子关于luckyfox pico的介绍视频,感叹linux开发板居然可以把价格缩到100RMB以内,也正巧结束了复旦微比赛,受够了FM33LC046N
的低性能,来玩点便宜又高性能的板子。
开发板型号:luckfox pico max
开发环境:Ubuntu 22.04
参考:luckyfox pico官方WIKI、微雪bilibili视频
因为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
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的编号,因为在开发板的linux系统中,gpio通过编号进行索引
GPIO有5个bank,每个bank32个pin;
每个bank又可以分为ABCD四组,每组8个pin
因此,对于GPIO1_C7_d,编号=1*32+8*2+7=55. 后面那个小d是后缀
根据引脚示意图,我们可以查到gpio55的位置,我们接上LED灯和电阻
我们首先尝试使用在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
当然,更常用的办法是使用C语言通过系统调用的方式修改设备文件,实现对GPIO的控制。
#include
#include
#include
int main(){
int gpio_pin;
printf("Enter GPIO pin number:");
scanf("%d",&gpio_pin);
//export gpio to user
FILE *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_path
char direction_path[50];
snprintf(direction_path,sizeof(direction_path),"sys/class/gpio/gpio%d/value",gpio_pin);//get the format char
//specify the pin direction
FILE *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()//这个函数用来把带格式控制的字符串转变成普通字符串