本帖最后由 Noly 于 2024-5-6 00:45 编辑
本帖最后由 Noly 于 2024-5-6 00:39 编辑
本帖最后由 Noly 于 2024-5-5 13:20 编辑
非常幸运能够得到这块开发板,因为五一假期有出行计划,所有在假期回来后的第一时间去快递点取了开发板。
两层静电袋加上泡沫的保护,板子的包装整体还是非常稳妥的。
开发环境搭建
硬件设备是一台Dell V11Pro i5-4200U的平板电脑上,系统UbuntuServer22.04,这台设备是我个人的开发服务器。所有操作都是由Win主机VSCode SSHRemote到这台服务器上进行的。
mkdir ~/aithinker
- 然后使用Git Clone开发板对应的SDK的Gitee仓库,因为在国内Gitee会有比较明显的速度优势,如果本机没有Git,请提前安装
sudo apt install git
git clone https://gitee.com/Ai-Thinker-Open/AiPi-Open-Kits.git -b master
这里会遇到一个小问题需要注意,这个Kits的仓库默认拉取分支是AiPi-aiThinkerCloud分支,要么如上所示在clone的时候加-b master来指定master分支,要么在拉取仓库以后,再手动切换到master分支。相关Git操作可以查阅资料进行学习。
cd AiPi-Open-Kits
git submodule init
git submodule update
- 主仓库子模块拉取完毕以后,再对aithinker_Ai-M6X_SDK目录下的子模块也进行拉取下载
cd aithinker_Ai-M6X_SDK
git submodule init
git submodule update
- 如果上述拉取过程很慢,那就需要修改各自目录下的.gitmodules文件,把文件内的submodule的仓库地址从github都改成gitee,这些子仓库在gitee都会有对应的仓库,可以加速
- 所有都拉取完毕以后,进行环境变量的配置,也就是系统Path的配置
cd aithinker_Ai-M6X_SDK
. install.sh
. export.sh
其中export.sh就是将aithinker_Ai-M6X_SDK/toolchain/bin添加进path,然后将tools文件夹内的编译工具,cmake, make, bflb_tools等工具配置相应的权限。当然也可以选择直接在~/.bashrc或者~/.profile类似的文件内直接修改添加riscv64-unknown-elf编译工具
点灯教程
首先,开发板在收到以后直接上电是没有LED灯是亮的,这种情侣我也是第一次遇到,很少见,尤其是右侧两个小的LED灯会让人误以为是电源指示灯,所以上电不亮让我一度以为这是一块有问题的板子。直到我随便找了一个Demo编译烧录以后亮了灯以后才确认板子是没问题的,只是没有默认的电源指示灯而已。
模板工程选择aithinker_Ai-M6X_SDK目录下examples里的helloworld项目,用这个作为基础开始进行点灯操作。用一般开发板的经验,先初始化GPIO,然后拉高电平就能点亮各个灯了。
cd ~/aithinker/AiPi-Open-Kits/aithinker_Ai-M6X_SDK/examples/helloworld
make
make flash COMX=/dev/ttyUSB0
开始之前先编译烧录一次,确保整个流程是畅通的。
很遗憾,我遇到了缺少lwip/dns.h头文件的错误,可以把这个头文件找回来,也可以先注释掉相关代码,直接在board.c文件里,注释第11行和第212行
11 // #include "lwip/dns.h" // 注释该行
212 // ip_addr_t dns_addr; // 注释该行
注释掉以后,编译就能成功,然后烧录。烧录要能成功那就按一次Reset复位键,也就是左侧的按键,有时候则需要按住右侧烧录按键然后短按一次左侧Reset,进入烧录模式,然后再进行make flash。总之采用按烧录键再按复位按键的方法都是有效的,有时候按复位键也可以,估计是程序直接挂死以后才可以。
make flash COMX=/dev/ttyUSB0
如果烧录的时候遇到接口权限不足的警告,运行下面语句将本用户加入到dialout用户组,我并没有遇到,因为我开发其他板子的时候已经处理过,如果遇到的话记得这个原因。
sudo usermod -a -G dialout $USER
点灯分析
板子上的RGB_LED是三色LED不是带级联口的IO可编程的RGB灯,所以有三个IO口分别控制红绿蓝三色分别为12,14,15。板子上还有2个小的LED灯是一颗黄色和一颗白色的LED,IO口分别为27,29
#define RGB_LED_RED_PIN 12
#define RGB_LED_GREEN_PIN 14
#define RGB_LED_BLUE_PIN 15
#define LED0_PIN 27
#define LED1_PIN 29
确定IO口以后就要学习如何初始化IO口。AiPi-Open-Kits/aithinker_Ai-M6X_SDK/examples/peripherals/gpio/gpio_input_output目录下有关于IO口输入输出的相关示例代码。简单学习以后,可以写出如下代码。
struct bflb_device_s *gpio;
gpio = bflb_device_get_by_name("gpio");
bflb_gpio_init(gpio, RGB_LED_RED_PIN, GPIO_OUTPUT | GPIO_PULLUP | GPIO_SMT_EN | GPIO_DRV_0);
bflb_gpio_init(gpio, RGB_LED_GREEN_PIN, GPIO_OUTPUT | GPIO_PULLUP | GPIO_SMT_EN | GPIO_DRV_0);
bflb_gpio_init(gpio, RGB_LED_BLUE_PIN, GPIO_OUTPUT | GPIO_PULLUP | GPIO_SMT_EN | GPIO_DRV_0);
bflb_gpio_init(gpio, LED0_PIN, GPIO_OUTPUT | GPIO_PULLUP | GPIO_SMT_EN | GPIO_DRV_0);
bflb_gpio_init(gpio, LED1_PIN, GPIO_OUTPUT | GPIO_PULLUP | GPIO_SMT_EN | GPIO_DRV_0);
初始化代码以后,然后看示例可以得出,如何操控IO口的输出电平。
bflb_gpio_set(gpio, LED0_PIN);
bflb_gpio_reset(gpio, LED0_PIN);
我们使用bflb_gpio_set和bflb_gpio_reset来操作IO口。
最后我们在main.c文件中,加入循环亮灭所有LED的代码,完成点灯实验。
bflb_gpio_set(gpio, RGB_LED_RED_PIN);
bflb_mtimer_delay_ms(200);
bflb_gpio_reset(gpio, RGB_LED_RED_PIN);
bflb_mtimer_delay_ms(200);
bflb_gpio_set(gpio, RGB_LED_GREEN_PIN);
bflb_mtimer_delay_ms(200);
bflb_gpio_reset(gpio, RGB_LED_GREEN_PIN);
bflb_mtimer_delay_ms(200);
bflb_gpio_set(gpio, RGB_LED_BLUE_PIN);
bflb_mtimer_delay_ms(200);
bflb_gpio_reset(gpio, RGB_LED_BLUE_PIN);
bflb_mtimer_delay_ms(200);
bflb_gpio_set(gpio, LED0_PIN);
bflb_mtimer_delay_ms(200);
bflb_gpio_reset(gpio, LED0_PIN);
bflb_mtimer_delay_ms(200);
bflb_gpio_set(gpio, LED1_PIN);
bflb_mtimer_delay_ms(200);
bflb_gpio_reset(gpio, LED1_PIN);
bflb_mtimer_delay_ms(200);
编译烧录,查看开发板亮灯情况。
make
make flash COMX=/dev/ttyUSB0
点灯完成,感谢安信可,后续我会用这个板子做更多有趣的东西,因为比起ESP32,IDF太繁琐,我喜欢简单直白的编译体验。