本帖最后由 mgodmonkey 于 2024-9-20 22:25 编辑
本帖最后由 mgodmonkey 于 2024-9-20 21:53 编辑
本帖最后由 mgodmonkey 于 2024-9-20 21:50 编辑
欢迎大家前往我的博客观看排版更好的文章:【点击前往】
开发板资料
1.简易开箱
- 怀着激动的心打开快递盒,里面赫然躺着小安派R2全家桶 :小安派R2开发板1,摄像头模组-酷视CV031C50 1,4寸触摸显示屏-优奕UE040WV 1,65dB咪头 1,8R2W扬声器 *2,及连接线2条
- 小安派R2的接口一览图如下:接口非常齐全,I2C,SPI,USB,串口等常用的接口都应有尽有,并且为了适配其他配件,连麦克风,喇叭,40Pin显示屏接口也引出来了。
2.环境搭建
Windows环境推荐使用VScode+ git + 编译工具 + 烧录工具,具体参考教程:https://bbs.ai-thinker.com/forum.php?mod=viewthread&tid=282&extra=page%3D1
- 安装VScode+VScode扩展+Git(参考上面教程,这里不再赘述了)
- 安装编译工具,推荐在根目录下新建
Aithinker_Ai
文件夹,如 E:\Aithinker_Ai
,在路径栏上输入cmd回车进入终端,接着输入 git clone https://gitee.com/Ai-Thinker-Open/AiPi-Open-Kits.git -b master
下载工具链到本地
- 下载子模块:用记事本打开
E:\Aithinker_Ai\AiPi-Open-Kits\.gitmodules
文件,修改 github.com
为 gitee.com
,国内gitte好用(如果有科学上网,这步不需要做)
- 接着在
E:\Aithinker_Ai\AiPi-Open-Kits
目录下输入cmd进入终端 ,依次输入 git submodule init
,git submodule update
- 由此克隆了
aithinker_Ai-M6X_SDK
,同样的步骤,在 E:\Aithinker_Ai\AiPi-Open-Kits\aithinker_Ai-M6X_SDK
目录下也需要再执行一遍,输入cmd进入终端 ,依次输入 git submodule init
,git submodule update
,git clone https://gitee.com/bouffalolab/toolchain_gcc_t-head_windows.git -b master
,确保 E:\Aithinker_Ai\AiPi-Open-Kits\aithinker_Ai-M6X_SDK\tools
目录下有内容
-
添加路径到系统环境中(此处也参考上面的教程,也不再赘述了)
E:\Aithinker_Ai\AiPi-Open-Kits\aithinker_Ai-M6X_SDK\toolchain_gcc_t-head_windows\bin
E:\Aithinker_Ai\AiPi-Open-Kits\aithinker_Ai-M6X_SDK\tools\make
E:\Aithinker_Ai\AiPi-Open-Kits\aithinker_Ai-M6X_SDK\tools\ninja
-
重启电脑,然后验证
在桌面按住 shift
键点击 鼠标右键
打开 PowerShell 。在 PowerShell 输入:
make -v
成功输出信息:
GNU Make 4.2.1
Built for x86_64-w64-mingw32
Copyright (C) 1988-2016 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.
输入:
riscv64-unknown-elf-gcc -v
成功时输出信息:
Using built-in specs.
COLLECT_GCC=D:\Desktop\AiPi-Open-Kits\aithinker_Ai-M6X_SDK\toolchain_gcc_t-head_windows\bin\riscv64-unknown-elf-gcc.exe
COLLECT_LTO_WRAPPER=d:/desktop/aipi-open-kits/aithinker_ai-m6x_sdk/toolchain_gcc_t-head_windows/bin/../libexec/gcc/riscv64-unknown-elf/10.2.0/lto-wrapper.exe
Target: riscv64-unknown-elf
Configured with: /mnt/ssd/jenkins_iotsw/slave/workspace/Toolchain/build-gnu-riscv/./source/riscv/riscv-gcc/configure --target=riscv64-unknown-elf --host=i686-w64-mingw32 --with-gmp=/mnt/ssd/jenkins_iotsw/slave/workspace/Toolchain/build-gnu-riscv/build-gcc-riscv64-unknown-elf/build-Xuantie-900-gcc-elf-newlib-mingw-V2.6.1/lib-for-gcc-mingw --with-mpfr=/mnt/ssd/jenkins_iotsw/slave/workspace/Toolchain/build-gnu-riscv/build-gcc-riscv64-unknown-elf/build-Xuantie-900-gcc-elf-newlib-mingw-V2.6.1/lib-for-gcc-mingw --with-mpc=/mnt/ssd/jenkins_iotsw/slave/workspace/Toolchain/build-gnu-riscv/build-gcc-riscv64-unknown-elf/build-Xuantie-900-gcc-elf-newlib-mingw-V2.6.1/lib-for-gcc-mingw --with-libexpat-prefix=/mnt/ssd/jenkins_iotsw/slave/workspace/Toolchain/build-gnu-riscv/build-gcc-riscv64-unknown-elf/build-Xuantie-900-gcc-elf-newlib-mingw-V2.6.1/lib-for-gcc-mingw --with-libmpfr-prefix=/mnt/ssd/jenkins_iotsw/slave/workspace/Toolchain/build-gnu-riscv/build-gcc-riscv64-unknown-elf/build-Xuantie-900-gcc-elf-newlib-mingw-V2.6.1/lib-for-gcc-mingw --with-pkgversion='Xuantie-900 elf newlib gcc Toolchain V2.6.1 B-20220906' CXXFLAGS='-g -O2 -DTHEAD_VERSION_NUMBER=2.6.1 ' --enable-libgcctf --prefix=/mnt/ssd/jenkins_iotsw/slave/workspace/Toolchain/build-gnu-riscv/build-gcc-riscv64-unknown-elf/Xuantie-900-gcc-elf-newlib-mingw-V2.6.1 --disable-shared --enable-threads=posix --enable-languages=c,c++ --without-system-zlib --enable-tls --with-newlib --with-sysroot=/mnt/ssd/jenkins_iotsw/slave/workspace/Toolchain/build-gnu-riscv/build-gcc-riscv64-unknown-elf/Xuantie-900-gcc-elf-newlib-mingw-V2.6.1/riscv64-unknown-elf --with-native-system-header-dir=/include --disable-libmudflap --disable-libssp --disable-libquadmath --disable-libgomp --disable-nls --disable-tm-clone-registry --src=/mnt/ssd/jenkins_iotsw/slave/workspace/Toolchain/build-gnu-riscv/./source/riscv/riscv-gcc --enable-multilib --with-abi=lp64d --with-arch=rv64gcxthead 'CFLAGS_FOR_TARGET=-Os -mcmodel=medany' 'CXXFLAGS_FOR_TARGET=-Os -mcmodel=medany'
Thread model: posix
Supported LTO compression algorithms: zlib zstd
gcc version 10.2.0 (Xuantie-900 elf newlib gcc Toolchain V2.6.1 B-20220906)
至此,小安派R2的编译环境已经搭建完成(真不容易,给自己一个大大的赞)
3.编译与烧录
- 用VScode打开
E:\Aithinker_Ai\AiPi-Open-Kits\AiPi-Eyes-Rx
文件夹,打开 main.c
主程序文件
- 解析一下
main.c
代码
额,架构有点像ESP-IDF,也使用了FreeRTOS系统
-
board/board.h
:主要包含一些初试化,如系统时钟,串口,i2c引脚,i2s引脚初试化,更改串口波特率更改 board/board.c
文件,如下
注:如果更改了波特率,则编译后,下面的也需要进行修改,否则会烧录错误
-
lv_conf.h
:lvgl配置头文件,一般不需要进行修改,都是根据赠送的4寸屏定制的
-
lcd.h
:4寸屏幕驱动头文件
-
es8388_task.h
:ES8388音频芯片驱动头文件
-
auadc.h
:内置解码器头文件
注:小安派-Eyes-R1带外置ES8388音频芯片,支持两路音频输入输出。
小安派-Eyes-R2采用内置CodeC,支持单路音频输入输出。
// 定义检测按钮的任务线程的一些参数
#define button_PROCESS_STACK_SIZE (1024)
#define button_PROCESS_PRIORITY (14)
static TaskHandle_t button_process_task_hd;
/* 自定义lvgl日志打印格式 */
void lv_log_print_g_cb(const char *buf)
{
printf("[LVGL] %s", buf);
}
/**
* 创建二维码的示例代码,没有在主函数中调用
*/
void lv_example_qrcode_1(void)
{
lv_color_t bg_color = lv_palette_lighten(LV_PALETTE_LIGHT_BLUE, 5);
lv_color_t fg_color = lv_palette_darken(LV_PALETTE_BLUE, 4);
lv_obj_t *qr = lv_qrcode_create(lv_scr_act(), 150, fg_color, bg_color);
/*Set data*/
const char *data = "https://www.bouffalolab.com";
lv_qrcode_update(qr, data, strlen(data));
lv_obj_center(qr);
/*Add a border with bg_color*/
lv_obj_set_style_border_color(qr, bg_color, 0);
lv_obj_set_style_border_width(qr, 5, 0);
}
/* lvgl后台刷新的线程 */
static void user_task(void *pvParameters)
{
lv_task_handler();
printf("[LVGL] init success \r\n");
while (1) {
lv_task_handler();
bflb_mtimer_delay_ms(1);
}
}
/* 检测IO2是否被按下,效果就是如果长按IO2,则小安派会录音,松开IO2回放录音 */
static void button_process_task(void *param)
{
uint32_t press_10ms_cnt = 0;
uint32_t press_mode = 0;
struct bflb_device_s *gpio = bflb_device_get_by_name("gpio");
bflb_gpio_init(gpio, GPIO_PIN_2, GPIO_INPUT | GPIO_FLOAT | GPIO_SMT_EN | GPIO_DRV_0);
while(1){
if(bflb_gpio_read(gpio, GPIO_PIN_2) == 1) {
press_10ms_cnt++;
}
else if(bflb_gpio_read(gpio, GPIO_PIN_2) == 0){
if(press_10ms_cnt > 10 && press_10ms_cnt < 100){
press_mode = 1;
}
else if(press_10ms_cnt > 100){
press_mode = 2;
}
press_10ms_cnt = 0;
}
if(1 == press_mode){
press_mode = 0;
printf("[key] key Press\r\n");
#if DEF_USER_ES8388_EN
es8388_paly_en();
#else
record_play_on();
#endif
} else if (2 == press_mode) {
press_mode = 0;
#if (0 == DEF_USER_ES8388_EN)
record_play_off();
#endif
}
vTaskDelay(10);
}
}
int main(void)
{
board_init();
printf("\r\n---BOARD:M61EVB-R%d VERSION:%s---\r\n", DEF_BOARD_INFO, DEF_BOARD_VERSION);
//usb video init
usbh_initialize();
/* lvgl init */
// lv_log_register_print_cb(lv_log_print_g_cb);
lv_init();
lv_port_disp_init();
lv_port_indev_init();
// test case
// lv_demo_benchmark();
// lv_demo_stress();
// lv_demo_widgets();
// 如果使用了NXP那个拖拽组件的设计软件进行UI设计,则使能这个,详情见https://www.nxp.com.cn/design/design-center/software/development-software/gui-guider:GUI-GUIDER
#if DEF_NXP_EN
setup_ui(&guider_ui);
events_init(&guider_ui);
#else
ui_init();
#endif
// 音频芯片驱动任务
#if DEF_USER_ES8388_EN
/* i2s es8388 task start */
es8388_palyer_task();
#else
audio_play_task_init();
#endif
xTaskCreate(user_task, (char *)"user_task", 2048, NULL, 3, NULL);
xTaskCreate(button_process_task, (char *)"button_proc_task", button_PROCESS_STACK_SIZE, NULL, button_PROCESS_PRIORITY, &button_process_task_hd);
/* freeRTOS start */
vTaskStartScheduler();
}
小安派R2需要进行如下修改:
- 编译代码直接在终端输入
make
即可
如果编译遇到以下问题,原因是终端不支持cp指令,经过测试,Windows环境下cmd和powershell都不行,需要在git bash环境下编译
Built target combine
cp ./../aithinker_Ai-M6X_SDK/bsp/board/bl616dk/config/edata.bin build/build_out
process_begin: CreateProcess(NULL, cp ./../aithinker_Ai-M6X_SDK/bsp/board/bl616dk/config/edata.bin build/build_out, ...) failed.
make (e=2): 系统找不到指定的文件。
make: *** [../aithinker_Ai-M6X_SDK/project.build:75: build] Error 2
-
编译完成后,就可以进行烧录了,烧录方式有两种,使用串口烧录,或者软件烧录
-
用一个TTL下载器连接小安派,接线顺序如下:
TTL 工具 |
小安派 |
3.3V |
3.3V |
TXD |
RX |
RXD |
TX |
GND |
GND |
-
插上TTL下载器到电脑,设备管理器查看TTL下载器端口号
- 串口烧录:终端输入
make flash COMX=COMx
进行烧录,如 make flash COMX=COM5
,等到终端显示 Please Press Reset Key!
,则短按一下RESET键,即靠近杜邦线的EN键,记住是短按一下,不要按太长,按太长大概率失败,而且简易不连接屏幕,摄像头等设备进行烧录
- 软件烧录
- 烧录工具下载:【点击下载】
- 烧录模式:烧录工具在烧录开始后,先按住 “下载按钮”再按一下“复位按钮”后松开,即可进入烧录模式。
- 打开
BLDevCube.exe
,选择 BL616/618
,点击 Finish
。
- 软件说明如下:
5.烧录上面的源码需要烧录4个固件,参考
flash_prog_cfg.ini
文件中的内容烧录,按照下面的说明依次下载完成4个固件
[boot2]
filedir = ./board/config/whole_img_bootloader.bin
address = 0x000000
[edata]
filedir = ./board/config/edata.bin
address = 0x3e0000
[partition]
filedir = ./build/build_out/partition*.bin
address = 0xE000
[FW]
filedir = ./build/build_out/AiPi-Eyes-Rx_$(CHIPNAME).bin
address = 0x10000
需要烧录的固件全部在 E:\Aithinker_Ai\AiPi-Open-Kits\AiPi-Eyes-Rx\build\build_out
目录下,对应的固件依次是:
- whole_flash_data.bin
- edata.bin
- partition.bin
- AiPi-Eyes-Rx_bl616.bin
- 烧录完成后按RESET键即可看到如下的内容,官方的示例中,如果按下IO2键则会进入扩音模式,即根据麦克风的声音在扬声器中实时播放,长按IO2键则会退出该模式