Kunlun Pi 开发实践:基于匠芯创D13x系列开发板的探索分享(二)
2025-12-03 来源:elecfans
作者ID:jf_92517703
环境搭建
板卡实物

首次编译烧写源码
下载源码:https://gie.com/arnchip/luban-lite.git
VSCode 安装插件

在VSCode打开源码

在第一次编译之前必须清理下工程

下载烧写工具:
https://gitee.com/artinchip/tools,下载后安装。

在VSCode安装插件后打开K目录

否则报错

选择配置

编译bootloer程序,选择配置。

编译

编译helloword程序,选择配置。

编译APP
烧录固件
先按住【BOOT】,然后按下【RESET】,Brun显示设置已连接选择生成的固件,点击【开始】,完成下载。
焊接调试串口

打开mobarxterm查看日志

SDK应用程序入口

修改RTT的main函数,循环打印输出计数。
application\\helloworld\main.c

板卡初始化文件:target\d13x\kunlun88-nor\board.c
显示了软件版本【Version: Car1.2.3】,说明找到了板子的初始化文件【board.c】文件。

板卡的配置文件:
target\d13x\common\Kconfig.board
target\configs\d13x_kunlunpi88-nor_rt-thread_helloworld_defconfig
KEY测试
使能gpio_key的测试程序

修改了对应的配置文件

根据配置添加编译

关联源码:
bsp\examples\test-gpio\test_gpio_key.c


-Music Demo
添加LVGL的Music示例Demo测试
要想直到helloword的程序到底运行的什么LVGL程序,首先查看运行的线程,发现存在LVGL线程。

在VSCode中搜索【LVGL】线程的创建:packages\artinchip\lvgl-ui\lvgl_v9\lvgl\env_support\rt-thread\lv_rt_thread_port.c
在RT-Thread 环境中使用【scons】(即通过 ENV 工具链)编译时,会自动定义宏【____】

线程初始化位置:packages\artinchip\lvgl-ui\lv_demo.c

打开工程配置:scons --menuconfig
配置文件变化:target\configs\d13x_kunlunpi88-nor_rt-thread_helloworld_defconfig

这就是出厂的demo入口【ui_init】

【void lv_example_observer_2(void)】这个没有被调用,所以【void aic_ui_init()】就是入口:packages\artinchip\lvgl-ui\aic_ui.c

在这里修改为【music】的demo

编译下载

打开内存和性能监视:packages\artinchip\lvgl-ui\lvgl_v9\lv_conf.h

屏幕刷新帧率最低35帧,使用最高50%。

LVGL-自己添加APP
要自己定义自己的UI程序,我们自己仅仅需要实现【ui_init】函数即可,从官方的串口工具得到启发。
第一步

第二步

第三步

第四步

那我自己做一个串口工具的UI试试
在【packages\artinchip\lvgl-ui\lv_demo.c】中添加源码,源码由通义千问完成。
#include'lvgl.h'#include'stdio.h'#include'string.h'// 全局控件句柄statv_obj_t*rx_textarea =NULL;staticlv_obj_t*tx_textarea =NULL;staticlv_obj_t*baud_dropdown =NULL;staticlv_obj_t*port_dropdown =NULL;staticlv_obj_t*hex_recv_checkbox =NULL;staticlv_obj_t*hex_send_checkbox =NULL;staticlv_obj_t*interval_textarea =NULL;staticlv_obj_t*auto_send_checkbox =NULL;// 发送按钮回调staticvoidsend_btn_event_cb(lv_event_t*e){constchar*text =lv_textarea_get_text(tx_textarea);if(text &&strlen(text) >0) {// 模拟追加到接收区(实际应由 中断处理)staticcharbuf[128];snprintf(buf,sizeof(buf),'Sent: %s\r\n', text);lv_textarea_add_text(rx_textarea, buf);// lv_textarea_cuor_end(rx_textarea); // 滚动到底部}}// 模拟打开串口按钮回调staticvoidopen_uart_btn_event_cb(lv_event_t*e){
charmsg[64];snprintf(msg,sizeof(msg),'Opened %s @ %sbps\r\n','com3','115200');lv_textarea_add_text(rx_textarea, msg);
// lv_textarea_cursor_end(rx_textarea);}// 创建串口调试助手 UIvoreate_uart_tool(void) {// 主容器:水平布局,左右分区lv_obj_t *main_cont =lv_obj_create(lv_screen_tive());lv_obj_set_size(main_cont,LV_PCT(100),LV_PCT(100));lv_obj_set_layout(main_cont,LV_LAYOUT_FLEX);lv_obj_set_flex_flow(main_cont,LV_FLEX_FLOW_ROW);lv_obj_set_style_pad_all(main_cont,8,0);//lv_obj_set_style_bg_color(main_cont, lv_color_light_gray(), 0);
// ========== 左侧:控制面板 ==========lv_obj_t*left_panel =lv_obj_create(main_cont);lv_obj_set_width(left_panel,160);lv_obj_set_height(left_panel,LV_PCT(100));lv_obj_set_layout(left_panel, LV_LAYOUT_FLEX);lv_obj_set_flex_flow(left_panel, LV_FLEX_FLOW_COLUMN);lv_obj_set_style_pad_row(left_panel,8,0);// 串口lv_obj_t*label =lv_label_create(left_panel);lv_label_set_text(label,'Port:');port_dropdown =lv_dropdown_create(left_panel);lv_dropdown_set_options(port_dropdown,'UART0\nUART1\nUART2\nUART3');// 波特率label =lv_label_create(left_panel);lv_label_set_text(label,'Baudrate:');baud_dropdown =lv_dropdown_create(left_panel);lv_dropdown_set_options(baud_dropdown,'9600\n19200\n38400\n57600\n115200');lv_dropdown_set_selected(baud_dropdown,4); // 默认 115200// 打开串口按钮lv_obj_t*open_btn =lv_button_create(left_panel);lv_obj_set_width(open_btn,LV_PCT(100));lv_obj_add_event_cb(open_btn, open_uart_btn_event_cb, LV_EVENT_CLICKED,NULL);lv_obj_t*btn_label =lv_label_create(open_btn);lv_label_set_text(btn_label,'Open UART');lv_obj_center(btn_label);// HEX 显示hex_recv_checkbox =lv_checkbox_create(left_panel);lv_checkbox_set_text(hex_recv_checkbox,'Hex Display');// HEX 发送hex_send_checkbox =lv_checkbox_create(left_panel);lv_checkbox_set_text(hex_send_checkbox,'Hex Send');// 发送间隔label =lv_label_create(left_panel);lv_label_set_text(label,'Interval (ms):');interval_textarea =lv_textarea_create(left_panel);lv_textarea_set_text(interval_textarea,'1000');lv_textarea_set_one_line(interval_textarea,true);lv_textarea_set_max_length(interval_textarea,8);lv_obj_set_height(interval_textarea,30);// 自动发送auto_send_checkbox =lv_checkbox_create(left_panel);lv_checkbox_set_text(auto_send_checkbox,'Auto Send');// 发送按钮lv_obj_t*send_btn =lv_button_create(left_panel);lv_obj_set_width(send_btn,LV_PCT(100));lv_obj_add_event_cb(send_btn, send_btn_event_cb, LV_EVENT_CLICKED,NULL);btn_label =lv_label_create(send_btn);lv_label_set_text(btn_label,'Send');lv_obj_center(btn_label);// ========== 右侧:接收/发送区 ==========lv_obj_t*right_panel =lv_obj_create(main_cont);lv_obj_set_flex_grow(right_panel,1);lv_obj_set_height(right_panel,LV_PCT(100));lv_obj_set_flex_flow(right_panel, LV_FLEX_FLOW_COLUMN);lv_obj_set_layout(right_panel, LV_LAYOUT_FLEX);lv_obj_set_style_pad_row(right_panel,8,0);// 接收区label =lv_label_create(right_panel);lv_label_set_text(label,'Received Data:');lv_obj_set_style_margin_bottom(label,4,0);rx_textarea =lv_textarea_create(right_panel);lv_obj_set_flex_grow(rx_textarea,1);lv_textarea_set_placeholder_text(rx_textarea,'Waiting for data...');//lv_obj_clear_flag(rx_textarea, LV_OBJ_FLAG_EDITABLE); // 只读lv_obj_set_style_bg_color(rx_textarea,lv_color_white(),0);lv_obj_set_style_text_color(rx_textarea,lv_color_black(),0);// 发送区label =lv_label_create(right_panel);lv_label_set_text(label,'Transmit Data:');lv_obj_set_style_margin_bottom(label,4,0);tx_textarea =lv_textarea_create(right_panel);lv_obj_set_flex_grow(tx_textarea,1);lv_textarea_set_placeholder_text(tx_textarea,'Enter data to send...');lv_obj_set_style_bg_color(tx_textarea,lv_color_white(),0);lv_obj_set_style_text_color(tx_textarea,lv_color_black(),0);// 可选:设置默认字体(防止文字太小)lv_obj_set_style_text_font(lv_screen_active(), &lv_font_montserrat_14,0);}


LVGL-使用AIUIBuilder开发
使用AIUIBuilder开发LVGL程序值得点赞,页面绘制、资源管理一次解决,安逸啊!
使用AIUIBuilder
scons --menuconfig
打开工程配置

先设计一个简单的demo

将生成的【ui_builder】下的文件全部拷贝到工程目录【packages\artinchip\lvgl-ui\aic_demo\ui_builder】。
首次拷贝可能需要拷贝【lv_conf_custom.h】文件,因为拷贝了这个文件导致整个LVGL源码会重新编译,因为【lv_conf.h】包含了它,在【lv_conf_custom.h】文件在没有改变就不要拷贝这个文件。
运行结果

字库和图片资源测试

字体生成

还可以添加各种字体文件

图片资源的使用

测试结果

添加用户APP文件夹到构建系统
添加自己的APP代码
**修改SConscript文件,**修改此文件会导致整个工程重新编译
添加user_app目录及子目录:SConscript
user_app内部的SConscript文件都是一样的,复制于【application\rt-thread\helloworld\SConscript】,Kconfig都是空文件。


**这个构建脚本大致意思是,**添加当前目录的c文件到构建系统,递归添加子目录的c文件到构建系统。
Import('RTT_ROOT')Import('rtconfig')frombuilding import *
cwd = GetCurrentDir()src = Glob('*.c')CPPPATH = [cwd, ]
CFLAGS =' -c -ffunction-sections'
group = DefineGroup('Applications', src, depend = [''], CPPPATH = CPPPATH, CFLAGS=CFLAGS)
list = os.listdir(cwd)foriteminlist: ifos.path.isfile(os.path.join(cwd, item,'SConscript')): group=group+ SConscript(os.path.join(item,'SConscript'))
Return('group')
application\user_app\helloworld\user_main.c
/* * Copyright (c) 2022-2024, ArtInChip Technology Co., Ltd * * SPDX-License-Identifier: Apache-2.0 * * Authors: weilin.peng@artinchip.com */
#include#ifdefRT_USING_ULOG#include#endif
rt_device_tg_serial;
intuser_app_entry(void){ log_i('INIT_APP_EXPORT Hello World!\n'); g_serial =rt_device_find('uart2');
if(!g_serial) { log_w('find %s fai!\n','uart2'); return-RT_ERROR; } rt_err_t ret =rt_device_open(g_serial, RT_DEVICE_OFLAG_RDWR | RT_DEVICE_FLAG_INT_RX); if(ret != RT_EOK) { log_w('open %s failed !\n','uart2'); return-RT_ERROR; }
return0;}INIT_APP_EXPORT(user_app_entry);
application\user_app\ui\ui.c
/* * Copyright (c) 2022-2024, ArtInChip Technology Co., Ltd * * SPDX-License-Identifier: Apache-2.0 * * Authors: weilin.peng@artinchip.com */
#include#ifdefRT_USING_ULOG#include#endif
externrt_device_tg_serial;voidscreen_button_1_custom_clicked(void){ char*msg ='Hello World!\n'; log_i('send:%s\n',msg); rt_device_write(g_serial,0, msg,strlen(msg));}
screen_button_1_custom_clicked这个是按键点击的重写函数,原本是弱定义。

测试结果
点击button串口发送hello word。


- 基于匠芯创D13x系列开发板的KunLun Pi探索分享
- 匠芯创D13x系列芯片赋能AI陪伴机器人灵动视觉创新应用
- 迅为RK系列开发板SDK内核版本由5.10升级至6.1 LTS
- RK3568开发板的JTAG仿真方案:突破AMP架构调试瓶颈
- ROS2 SLAM Toolbox 建图和导航指南——米尔RK3576开发板
- 米尔RK3576 + ROS2 SLAM建图与导航实战
- 新品!高能效,低功耗,TI AM62L经典再进化
- 爆火的OpenClaw! 告别云端,米尔RK3576开发板本地部署
- 瑞萨RA0E2开发板的批量编程解决方案
- M4-R1 开源鸿蒙(OpenHarmony)开发板:串口调试助手实战案例
- 嵌入式的风向变了:2026纽伦堡嵌入式展透露这些趋势
- 高通确认不在GDC 2026发布新款骁龙G系列掌机处理器SoC
- 行业评论 从工具到平台:如何化解跨架构时代的工程开发和管理难题
- 阿里达摩院发布玄铁C950,打破全球RISC-V CPU性能纪录
- 面向嵌入式部署的神经网络优化:模型压缩深度解析
- Mujoco中添加Apriltag标签并实现相机识别教程
- 摩尔线程MTT S5000全面适配Qwen3.5三款新模型
- 英飞凌与宝马集团携手合作,基于Neue Klasse架构塑造软件定义汽车的未来
- 物理AI仿真新突破:摩尔线程与五一视界共建全栈国产化生态
- 爆火的OpenClaw! 告别云端,米尔RK3576开发板本地部署
- Altera 与 Arm 深化合作,共筑 AI 数据中心高效可编程新方案
- 莱迪思加入英伟达 Halos生态系统,通过Holoscan传感器桥接技术提升物理人工智能安全性
- 芯科科技闪耀2026嵌入式世界展 以Connected Intelligence赋能,构建边缘智能网联新生态
- 边缘计算主机盒选购指南:五大核心指标解析
- Arm AGI CPU 更多细节:台积电 3nm 制程、Neoverse V3 微架构
- Arm AGI CPU 重磅发布:构筑代理式 AI 云时代的芯片基石
- Arm 拓展其计算平台矩阵,首次跨足芯片产品
- 阿里达摩院发布RISC-V CPU玄铁C950,首次原生支持千亿参数大模型
- 边缘 AI 加速的 Arm® Cortex® ‑M0+ MCU 如何为电子产品注入更强智能




