探索 KunLun Pi | 基于匠芯创D13x系列开发板分享(三)

描述

作者ID:VR小杰

本次开箱的 D133CBS KunLun Pi 开发板,正面配备了一块 4.3 寸的电容触摸屏,开机即用,系统内置主菜单和丰富的 demo 演示程序,方便用户快速体验各项功能。

开发板开箱及介绍


嵌入式

开发板背面有丰富的接口和模块布局,便于扩展和调试。

嵌入式

主控芯片为D133CBS,是ArtInChip 推出的高性能RISC-V MCU,具备强大的 2D 图形加速、丰富的显示接口和多媒体处理能力,适合工业 HMI、智慧家居等场景。

嵌入式

音频播放部分采用了 LM4831 音频功放芯片,能够为外接喇叭提供高质量音频输出。

嵌入式

外置存储为 Winbond(华邦)25Q128JVSQ 16MB NOR FLASH,支持大容量数据存储和系统固件升级。

嵌入式

简介

D13x是ArtInChip一款基于 RISC-V 的高性能、国产自主、工业级全高清显示与智能控制 MCU,配备强大的2D图形加速处理器、PNG解码、JPEG编解码引擎、丰富的屏接口,支持工业宽温,具有高可靠性、高开放性,可广泛应用于工业HMI、 网关、串口屏等泛工业和智慧家居领域。

D133CBS RISC-V KunLun Pi V1.0 是一款基于 D13x 芯片的人机交互应用开发板,配备 4.3 寸 LCD 显示屏以及电容触摸屏,支持DVP摄像头。开发板集成了USB烧录、TF-Card 升级烧录、JTAG、串口打印等调试接口,方便调试开发。开发板集成 16MB NOR FLASH并可兼容NAND,同时引出RS485、RS232/TTL、喇叭、SDIO WIFI等功能,方便用户快速进行技术预研与产品开发,满足用户对不同人机交互场景的开发需求。

嵌入式

开发板功能特性

开发板主控为D133CBS (8M PSRAM),可Pin to Pin兼容D133CCS(16M PSRAM);

片上1MB SRAM,片上8MB PSRAM(视主控型号决定);

NOR FLASH 16MB,可兼容NAND FLASH;

RTC 实时时钟;

1xUSB2.0 Device烧录,支持OTG;

1xUART0串口打印,1xJTAG单步调试;

1xTF-Card 接口;

标配4.3寸RGB显示屏,支持通过排针扩展LVDS、MIPI、I8080、QSPI屏等接口;

配电容式触摸屏,支持电阻式触摸屏;

1x喇叭、1xDVP摄像头接口;

1xRS485、1xUART TTL,可兼容RS232;

1xSDIO WIFI;

5V单电源供电(Type-C接口)。

功能框图

下图为D133CBS KunLun Pi开发板的功能框图,展示了主控芯片与各类外设( LCD显示屏、触摸排线、音频、摄像头、存储、通信接口等)之间的连接关系,便于理解整体架构和功能分布。

嵌入式

开发板资源

下图为开发板资源分布图,详细标注了各个接口、芯片、模块在PCB上的位置,包括主控、存储、音频、显示、调试接口等,方便用户查找和连接。

嵌入式

总结:本次评测的D133CBS KunLun Pi开发板集成度高,接口丰富,适合工业控制、智能家居等多种应用场景。开箱体验良好,配套资源齐全,便于开发者快速上手和功能验证,是一款极具性价比和实用性的国产 RISC-V 开发平台。

SDK下载+环境搭建


 

Luban-Lite SDK介绍

Luban-Lite是ArtInChip基于RT-Thread系统深度优化的RTOS SDK。本次评测就只使用该SDK进行开发。

准备代码

使用git客户端下载代码(https://gitee.com/artinchip/luban-lite.git)。

安装VSCode扩展-LubanLite

在VSCode中打开刚刚下载的Luban-Lite文件夹;

在VSCode的插件商店搜索LubanLite,安装。

嵌入式

左侧会出现匠芯创的LOGO,点开它,就有了一堆快捷操作。

嵌入式

创建项目

点击Open Project,可以按标签进行筛选Defconfig配置文件。

嵌入式

最终我们选择这个:d13x_kunlunpi88-nor_rt-thread_helloworld_defconfig

嵌入式

配置项目文件

点击config project

嵌入式

首次打开 Menuconfig 时,界面加载速度可能较慢,导致页面长时间停留在 “Loading Project Configuration ...”,需要耐心等待加载完成。加载速度与机器性能相关。

嵌入式

我们可以修改配置文件,但现在暂时不改,需要先把编译下载流程跑通后,在下一个实验任务中再进行修改。

编译

接下来编译,点击侧边栏的 Build Project 图标。

嵌入式

编译开始后,等待片刻,出现【Image file is generated:】表示生成镜像,可以下载到开发板了。

嵌入式

下载镜像

不知道什么原因,VSCode插件的烧录按钮,点完了之后并不能开始下载,因此我使用的是AiBurn烧录工具。

AiBurn工具下载:

https://aicdoc.artinchip.com/topics/product/download-doc-tool-zip.html

将开发板通过USB数据线连接电脑,按住开发板背面的BOOT按键,然后按下RESET按键,等待电脑端有设备接入的提示,松开BOOT按键,此时开发板进入了烧写模式。先选择文件,再点击开始。

嵌入式

烧录中

嵌入式

烧录完成

嵌入式

运行LVGL Benchmark Demo


 

LVGL简介:LVGL是一个C语言编写的免费的开源图形库,提供了用于嵌入式GUI的各种元素。用户可以利用丰富的图形库资源,在消耗极低内存的情况下构建视觉效果丰富多彩的GUI。

配置项目Config

打开上次实验创建好的测试工程,点击工具栏的Config,按下面几张图来进行配置。

嵌入式

选用LVGL V9

嵌入式

这里我想跑个Benchmark测一下性能,所以将LVGL Demo选择为LVGL Demo Benchmark,其他的保持默认即可。

嵌入式

最后记得点击下面的Save按钮保存,并关闭Config页面。

分析报错原因

如果修改好了上面的配置文件,直接编译,会报如下错误。

嵌入式

花了点时间,自己研究了下,大概弄明白了配置文件的运作逻辑。

在aic_ui.c中的 aic_ui_init() 函数内,定义了这三句:

  •  
  •  
  •  

lvgl_data_check();extern void ui_init(void);ui_init();

通过查找ui_init()的引用能发现,如果我们运行的LVGL Demo是匠芯创官方写好的,那么会通过ui_init()调用【packages\artinchip\lvgl-ui\aic_demo*】下特定Demo的源代码。

例如elevate_ui中就有实现了ui_init()

嵌入式

当我们切换到LVGL官方的Demo时,例如我们这里使用的是Benchmark Demo,那么在Config中CONFIG_AIC_LVGL_ELEVATOR_DEMO就会被注释掉,而CONFIG_AIC_LVGL_DEMO_ BENCHMARK被启用。

嵌入式

对应着在rtconfig.h中就没有定义AIC_LVGL_ELEVATOR_DEMO ,取而代之的是AIC_LVGL_DEMO_BENCHMARK,如下图所示。

嵌入式

问题来了,编译的时候是如何来进行条件编译的呢?

这里就用到了SConscript 文件,SCons 是一套由 Python 语言编写的开源构建系统,类似于 GNU Make。

每个Demo文件夹下都有SConscript,例如在elevator_demo目录下就能看到。

嵌入式

对照着文件解释一下

  •  

src += Glob('./elevator_ui.c')

这行把 elevator_ui.c 文件加入源码列表 src。

嵌入式

group=group+DefineGroup('LVGL-port',src,depend= ['AIC_LVGL_ELEVATOR_DEMO'], CPPPATH = CPPPATH, INSTALL = install)

这行用 DefineGroup 定义了一个源码组,名字叫 LVGL-port,包含 src 里的所有源码文件。

重点是 Depend 参数:depend = ['AIC_LVGL_ELEVATOR_DEMO']

嵌入式

Depend 的作用是:只有当 AIC_LVGL_ELEVATOR_DEMO 这个宏(或配置项)被打开时,这个源码组才会被编译。如果在 config 里把 AIC_LVGL_ELEVATOR_DEMO 关掉了,这个源码组就不会被加入编译流程,elevator_ui.c 也就不会被编译。

自然地,现在就能回答最开始的问题了,ui_init()找不到引用的原因正是没有任何一个aic_demo(即匠芯创官方写的LVGL Demo)被编译进来。

修改aic_ui.c代码

将aic_ui_init()函数的下面这两行注释掉

  •  
  •  

// extern void ui_init(void);// ui_init();

新增一行

  •  

lv_demo_benchmark();

在aic_ui.c文件包含部分之后,新增代码

  •  
  •  
  •  
  •  
  •  

#ifdef AIC_LVGL_DEMO_BENCHMARK#include "lvgl_v9/lvgl/demos/benchmark/lv_demo_benchmark.h"#endif

启用CPU监视

要跑Benchmark,需要给系统一个性能监视器,否则会在跑Benchmark时,屏幕显示LV_USE_PERF_MONITOR is not enabled提示,结果页面也不会显示FPS和CPU占用率。

在packages\artinchip\lvgl-ui\lvgl_v9\lv_conf.h 找到【LV_USE_PERF_MONITOR】,将值改为1。

嵌入式

实验结果编译、下载,进入系统后就能看到正在运行的benchmark了。

嵌入式

可以看到大部分场景稳定60FPS以上,而且CPU占用率都不高。

新建LVGL应用-控制显示屏亮度


 

匠芯创AiUIBuilder简介

AiUIBuilder是基于LVGL(Light and Versatile Embedded Graphics Library) 开发的UI设计工具,可以通过拖拽的方式进行UI界面的设计,能够加速基于ArtInChip嵌入式平台的图形应用的开发。

使用UiBuilder进行设计的流程如下

嵌入式

用AiUIbuilder在电脑上进行UI设计,并模拟运行,可以反复的对设计进行修改;

AiUIbuilder设计导出的代码也可以在VSCode环境下进行代码的修改,并可以在电脑上单步调试;

AiUIbuilder导出的UI代码或者经过在VSCode环境下修改过的UI代码,放在SDK编译环境相应目录下进行编译,然后烧录固件,在真实硬件环境下运行。

下载安装AiUIbuilder

前往官网下载安装:
 

https://aicdoc.artinchip.com/topics/product/download-doc-tool-zip.html

创建UI工程

在AiUiBuilder工具中,新建一个名为【test1】的项目,注意选择颜色深度为16bit,分辨率为【480*272】。

嵌入式

设计UI

这个实验是为了通过UI调整屏幕亮度,所以需要一个滑动条组件,如下图:

嵌入式

调整滑动条的范围为10~100,默认值70。

嵌入式

还要两个标签组件

嵌入式

label_2标签是用于显示滑动条的数值。

滑动条事件设置

滑动条组件介绍

参考LVGL文档:
 

https://lvgl.100ask.net/9.1/widgets/slider.html

滑动条对象看起来像是在进度条增加了一个可以调节的旋钮,使用时可以通过拖动旋钮来设置一个值。就像进度条(bar)一样,Slider可以是垂直的或水平的(当设置进度条的宽度小于其高度,就可以创建出垂直摆放的滑动条)。

使用事件LV_EVENT_VALUE_CHANGED,它是在拖动滑块或使用按键更改滑块时,会发送事件,拖动滑块时,会连续发送事件。

设置滑动事件

右键点击滑动条,选择设置事件。

嵌入式

打开的窗口中,选择事件Value changed-自定义代码-勾选方法名右侧的复选框。

嵌入式

设置screen加载事件

右键screen,选择【设置事件】。

嵌入式

事件名为 load start,方法名右侧的复选框打勾。

嵌入式

编写自定义代码

打开项目文件夹下的 ui_builder/custom/custom.c文件,新增代码如下:

 

#ifndef SIMULATOR#include "lv_tpc_run.h"voidbacklight_pwm_config(unsignedint channel, unsignedint level){ structrt_device_pwm *pwm_dev; pwm_dev = (struct rt_device_pwm *)rt_device_find("pwm"); /* pwm frequency: 1KHz = 1000000ns */rt_pwm_set(pwm_dev, channel, 1000000, 10000 * level);}#endifvoidscreen_slider_1_custom_value_changed(){ screen_t*scr = screen_get(&ui_manager); intvalue = lv_slider_get_value(scr->slider_1); charbuf[8]; snprintf(buf,sizeof(buf), "%d%%", value);lv_label_set_text(scr->label_2, buf);#ifndef SIMULATORbacklight_pwm_config(2, value);#endif}voidscreen_custom_load_start(){ screen_t*scr = screen_get(&ui_manager); intvalue = lv_slider_get_value(scr->slider_1); charbuf[8]; snprintf(buf,sizeof(buf), "%d%%", value);lv_label_set_text(scr->label_2, buf);}

其中【screen_slider_1_custom_value_changed】是滑动条事件回调函数,【screen_custom_load_start】是屏幕加载回调函数。它们都先获取了屏幕的对象,然后读取滑动条当前值,再将该数值格式化为字符串,设置为标签label_2的显示文本。

【backlight_pwm_config】用于设置背光的 PWM(脉宽调制)参数,实现调节屏幕亮度的功能。

【#ifndef SIMULATOR ... #endif】,在模拟器环境下,是找不到lv_tpc_run.h头文件及其他函数的,这些是在luban-lite SDK中使用的,因此需要注释掉,避免编译报错,在模拟器下只需要关心UI设计和基本逻辑是否正确即可。

导出AiUiBuilder生成的代码

在UiBuilder的右上角,点击生成代码。

嵌入式

代码生成在项目目录下的ui_builder目录内。

嵌入式

先记住该路径,这部分文件代码等会要用到。

搭建VSCode编译仿真环境

在VSCode中,安装如下插件:

C/C++

C/C++ Extension Pack

CMake

CMake Tools

使用VSCode打开AiUiBuilder项目工程test1文件夹下的simulator.code-workspace文件,这是vscode的工作区文件。

编译时,会让我们选编译器,这里选择未指定,因为在工作区配置文件中已经自动指定好了。

嵌入式

点击工具栏的build按钮,进行编译。完成后点击调试或运行,即可查看仿真效果。

新增LVGL应用配置

首先需要在application/Kconfig 中下方所示部分添加代码:

  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  

...config AIC_LVGL_USB_OSD_DEMO bool "LVGL usb osd demo" selectLPKG_LVGL_USING_DEMOS selectLPKG_USING_CJSON selectAIC_PWM_BACKLIGHT_BYPASS if AIC_PWM_BACKLIGHTconfig AIC_LVGL_IMAGE_DEMO bool "LVGL image demo"config AIC_LVGL_TEST1_DEMO # 添加 AIC_LVGL_TEST1_DEMO,以便在 menuconfig 菜单中选择 bool "LVGL demo of test1"...

在项目配置中,【select LVGL Demo】选择刚刚的【LVGL demo of test1】,保存。

嵌入式

导入代码

在【packages\artinchip\lvgl-ui\aic_demo】下新建【test_demo_1】文件夹,将导出的代码全部复制到这里。

嵌入式

配置SConscript

在test_demo_1目录下新建SConscript文件,添加如下代码:

  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  

from building import *import oscwd = GetCurrentDir()group = []# 源文件路径src = Glob('*.c')src += Glob('./custom/*.c')# 头文件路径CPPPATH = [cwd]CPPPATH.append(cwd+ '/custom')list = os.listdir(cwd)ford in list: path = os.path.join(cwd, d) ifos.path.isfile(os.path.join(path, 'SConscript')): group = group + SConscript(os.path.join(d, 'SConscript'))# 资源安装的目标路径ins_dst='rodata/lvgl_data'# 资源安装的源路径为当前SConscript所在路径的相对路径ins_src = 'assets'install = [(ins_src + '/font/', ins_dst + '/font/'),]# AIC_LVGL_TEST1_DEMO 宏需要与 application/Kconfig 中添加的宏一致group = group + DefineGroup('LVGL-port', src, depend = ['AIC_LVGL_TEST1_DEMO'], CPPPATH = CPPPATH, INSTALL = install)Return('group')

实验结果:通过触摸屏拉拽滑动条,实现了屏幕亮度的调节。

以上内容来源:电子发烧友论坛


 

 

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分