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

描述

作者ID:jf_92517703

环境搭建


 

板卡实物

匠芯创

首次编译烧写源码

下载源码:https://gitee.com/artinchip/luban-lite.git

VSCode 安装插件

匠芯创

在VSCode打开源码

匠芯创

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

匠芯创

下载烧写工具:

https://gitee.com/artinchip/tools,下载后安装。

匠芯创

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

匠芯创

否则报错

匠芯创

选择配置

匠芯创

编译bootloader程序,选择配置。

匠芯创

编译

匠芯创

编译helloword程序,选择配置。

匠芯创

编译APP
匠芯创

烧录固件

先按住【BOOT】,然后按下【RESET】,AiBrun显示设置已连接选择生成的固件,点击【开始】,完成下载。匠芯创

焊接调试串口

匠芯创

打开mobarxterm查看日志

匠芯创

SDK应用程序入口

匠芯创

修改RTT的main函数,循环打印输出计数。

application\rt-thread\helloworld\main.c

匠芯创

板卡初始化文件:target\d13x\kunlunpi88-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

匠芯创

匠芯创

LVGL-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 工具链)编译时,会自动定义宏【__RTTHREAD__】

匠芯创

线程初始化位置: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帧,CPU使用最高50%。

匠芯创

LVGL-自己添加APP


 

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

第一步

匠芯创

第二步

匠芯创

第三步

匠芯创

第四步

匠芯创

那我自己做一个串口工具的UI试试

在【packages\artinchip\lvgl-ui\lv_demo.c】中添加源码,源码由通义千问完成。

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

#include "lvgl.h"#include "stdio.h"#include "string.h"// 全局控件句柄static lv_obj_t *rx_textarea = NULL;static lv_obj_t *tx_textarea = NULL;static lv_obj_t *baud_dropdown = NULL;static lv_obj_t *port_dropdown = NULL;static lv_obj_t *hex_recv_checkbox = NULL;static lv_obj_t *hex_send_checkbox = NULL;static lv_obj_t *interval_textarea = NULL;static lv_obj_t *auto_send_checkbox = NULL;// 模拟发送按钮回调static void send_btn_event_cb(lv_event_t *e) {const char *text = lv_textarea_get_text(tx_textarea);if (text && strlen(text) > 0) {// 模拟追加到接收区(实际应由 UART 中断处理)static char buf[128];snprintf(buf, sizeof(buf), "Sent: %s\r\n", text);lv_textarea_add_text(rx_textarea, buf);// lv_textarea_cursor_end(rx_textarea); // 滚动到底部}}// 模拟打开串口按钮回调static void open_uart_btn_event_cb(lv_event_t *e) {

  •  
  •  
  •  

char msg[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);}// 创建串口调试助手 UIvoid create_uart_tool(void) {// 主容器:水平布局,左右分区lv_obj_t *main_cont = lv_obj_create(lv_screen_active());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') from building 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) for item in list:     if os.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  #ifdef RT_USING_ULOG #include  #endif
 rt_device_t g_serial;
 int user_app_entry(void) {     log_i("INIT_APP_EXPORT Hello World!\n");      g_serial = rt_device_find("uart2");
     if (!g_serial)     {         log_w("find %s failed!\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;     }
     return 0; } 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  #ifdef RT_USING_ULOG #include  #endif
 extern rt_device_t g_serial; void screen_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。

匠芯创

匠芯创

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

 

 

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

全部0条评论

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

×
20
完善资料,
赚取积分