707 LVGL8最小GPU系统实现
📎 原始文档:https://www.kdocs.cn/l/cmKTNLUADv8K 707 LVGL8最小GPU系统实现
前言
本文档描述了LVGL8的补丁更新和使用说明,包括基础触摸和显示,文字和图片显示等功能。支持基本绘制功能和复杂绘图功能,支持2.5D变换、JLANI动画模块(使用PSRAM)。
为了方便代码更新:后续的707 lvgl watch sdk 版本使用git 管理,默认使用aliyun,这里会定期更新修复bug 补丁和发布,请定时查收和验证,首先需要先注册阿里云和申请加入方可访问克隆下载代码,如下为新连接:
https://account-devops.aliyun.com/account/invite?sign=d9f460060cc5237cdc14f2532ae6b0a5&next_url=https%3A%2F%2Fcodeup.aliyun.com%3Forg_id%3D69143f1be6c3e0425dbdae2b
已加入组织可通过云效链接进入获取代码:云效 Codeup · 组织级代码管理平台
内部管理员邀请客户操作:
点击云效 Codeup · 组织级代码管理平台登录,选707lvgl项目,点击邀请按钮,更新最新的邀请链接到本文档上,有效期2天。
- 707LVGL彩屏充电宝版本更新(正式分支:lvgl-powerbank)新国标充电宝.otl
707-powerbank-sz-lvgl-powerbank-project-2026.07.24
升级SDK到707v200patch272版本
从彩屏仓项目同步了一些共性改动
目前具备基本的按键响应、灭屏低功耗、简单UI显示(尚未从充电IC取数据,后续会安排对UI的进一步重构优化,目前仅作开发参考)、SW6306的IIC协议以及数据打印、基本APP协议
707-powerbank-sz-lvgl-powerbank-project-2026.07.21
更新PowerBank协议,优化power_bank_det.c文件写法,可以正常连接APP
707-powerbank-sz-lvgl-powerbank-project-2026.07.09
基于707彩屏充电宝开发板对lvgl-release做基础适配
- 彩屏耳机仓LVGL(JL-Guibuilder)版本更新(正式分支:lvgl-chargebox)707lvgl(Flash-2MByte)彩屏仓开发入门指导.otl
707-chargebox-sz-lvgl-release-project-2026.05.09-19.29
- 2M彩屏仓sdk大版本更新到707v200patch2.7.1
- 整理部分文件封库逻辑
- 整理近期优化改动(卡片页面滑动优化、文字默认2BP等等)
- 为确保首次clone下来能正常编译烧录,请在GuiBuilder工具点击清理后再次打包,并且在vscode运行clean任务后再进行编译。
- 在使用jlstudio更新sdk版本时,请注意不要修改lvgl_v8.a 该库更新由深圳办事处维护。


- WATCH标准(第三方工具)版本更新(正式分支:lvgl-release)
707-watch-stander-sz-lvgl-release-project-2026.04.30-14.42
- 升级到2.7.1版本
- 修复L1格式zalloc与psram模式冲突
- 添加页面跳转特效DEMO,支持跟手和非跟手模式
- 修复原生bin和jl bin冲突
707-watch-stander-sz-lvgl-release-project-2026.04.07-18.47
1.修复psram内存泄漏
2.添加完整表盘与页面滑动DEMO
707-watch-stander-sz-lvgl-release-project-2026.04.07-17.09
- 添加页面框架DEMO watch_c_slide_demo
707-watch-stander-sz-lvgl-release-project-2026.04.02-19.40
- 解决lv阻塞bt问题以及ani不刷新问题
- 添加TTF矢量字体功能(要开PSRAM)
- 添加LUA5.3+市场表盘DEMO,参考LVGL表盘-beta版.otl(建议带PSRAM,仅是开源示例,不强制要求使用)
- 添加imgfont单独支持图片文字,仅支持图片显示,不支持混合显示
- JL资源添加P:盘符兼容
- 添加图片视频记录字符串路径(lv_img_t->filename)
- 取消lv_jlres接口使用
- 修复全局OPA渐变闪烁
- 添加PC端模拟lvgl,参考LVGL表盘-beta版.otl(仅是开源示例,不强制要求使用)
- 添加进出休眠控制avi、jpg、ani的自动加载释放
707-watch-stander-sz-lvgl-release-project-2026.01.28-14.36
- 修复无声avi的播放问题
707-watch-stander-sz-lvgl-release-project-2026.01.28-12.20
- avi添加支持音频
707-watch-stander-sz-lvgl-release-project-2026.01.23-17.08
- 增加休眠控制测试LVGL_SLEEP_TEST
- 添加ani_play_ctrl视频播放控制接口
707-watch-stander-sz-lvgl-release-project-2026.01.21-09.45
- 优化长文本帧率
- 优化切换PSRAM内存占用大问题
707-watch-stander-sz-lvgl-release-project-2025.12.11-20.20
- 添加外部字库
707-watch-stander-sz-lvgl-release-project-2025.11.27-14.31
- 升级SDK到2.5.0补丁
- 停止跟踪部分文件
707-watch-stander-sz-lvgl-release-project-11.25-19.30
- 修复GB2312编码编译问题
- 修复绘图闪烁问题
- 增加编译自动打包资源
- 不推屏加延时挂起避免阻塞
707-watch-stander-sz-lvgl-release-project-11.21-16.17
- 添加支持nand、sd res资源解析
- 修复ani库编译内存申请错误问题
- 修复视频切换内存泄露
- 修复切换同名视频线程冲突死机
- 视频资源错误文件跳过
- 增加矩形填充变换
707-watch-stander-sz-lvgl-release-project-1117
- 增加支持obj变换,即lv_obj_set_style_transform_xxx接口支持
- 修复gpu库不兼容开psram问题
- 改2bpp降低文字内存消耗
- 修复圆环出现裂痕问题
707-watch-stander-sz-lvgl-release-project-1016
707-watch-stander-sz-lvgl-release-project-1016.zip
- 新增加控件变换实现
- 新增资源压缩打包工具与解析
- 开放GPU任务链配置
- 合并添加INDEXED_1BIT
- 临时关闭AVI音频
- 添加画线
- 添加二维码显示示例
- A1\2\4不转tile方式
707-watch-stander-sz-lvgl-release-project-0928
707-watch-stander-sz-lvgl-release-project-0928.7z
- 新增加 2.5D 实现 - 新增加 jpeg 图片显示 - 新增加 arc复杂绘图 - 新增加res打包,id方式访问 - 优化 lru 缓存问题 - 优化avi、ani格式资源 - 优化7074+nandflash 支持
707-watch-stander-sz-lvgl-release-project-0915(2025.9.19)
1.修复编译问题
707-watch-stander-sz-lvgl-release-project-0904(2025.9.4):
- 合并到最新的标准版手表SDK,并附带可视化工具的git信息
- 新增支持ani视频(360x360平均15FPS不含音频,必须要psram)
- 新增支持avi视频 (466x466极限30FPS带音频,超过240*240建议用psram,sram内存非常紧张)
- 部分复杂绘图补充(部分复杂圆角绘制回退到软件渲染)
- 增加lvgl 内存池psram支持
- 补充色块填充
视频播放调用规则如下,avi、ani共用接口
AVI转换指令参考:
ffmpeg -i test.mp4 -vf "scale=320:384:force_original_aspect_ratio=decrease,pad=320:384:(ow-iw)/2:(oh-ih)/2,fps=23" -c:v mjpeg -q:v 8 -c:a pcm_s16le -ar 16000 -ac 1 -f avi Atest.avi
AVI视频播放功能开发说明.otl
7074A7S+nandflash配置:
~~lite_SDK DEMO(lite版本后续不再更新) ~~
~~关psram版本:707_watch_lite_sdk_add_lvgl8_demo_release_20250805_101358-lvgl.zip ()~~
SDK下载开发板常见报错处理方法:
1.若显示不正常:请根据开发板屏幕型号更换正确的屏幕驱动,如TCFG_LCD_SPI_ST77916_ENABLE或TCFG_LCD_SPI_GC9B71_ENABLE
2.若ASSERT-FAILD: buf_len == use_len错误:请修改LCD_BLOCK_H与CONFIG_LCD_BUF_STATIC_RAM_LEN配置一致
3.若报错:ASSERT-FAILD: rect->left + rect->width<=this->led w left:0 width:320 led w:240 rets:c0189de,为lvgl框架的分辨率与屏幕驱动分辨率不一致,请按照以下修改.
4.使用ani高压缩动画必需使用带psram的芯片,如7074A7S
LVGL官方资源
- LVGL官方网站: https://lvgl.io/
- LVGL GitHub仓库: https://github.com/lvgl/lvgl
- LVGL文档: https://docs.lvgl.io/
- PC模拟器仓库: https://github.com/lvgl/lv_port_pc_simulator
- 开发板环境配置 确认屏幕是不是77916,不是的话要更换屏幕驱动
开发版区别:
7070顶板:要将TCFG_7074_EX_NORFLASH_CONFIG置为0
7074顶板:要将TCFG_7074_EX_NORFLASH_CONFIG置为1(git默认) - LVGL入口 搜索关键词:
NEW_LVGL_V8_DEMO
LVGL的入口位于 app_main.c文件中,具体路径为:apps/watch/app_main.c 。该文件包含以下关键内容:
- GPU启动
- LVGL线程入口
- 推屏处理 触摸坐标获取功能由 cst816d.c文件实现,路径为:apps/common/device/touch_panel/cst816d/cst816d.c。
- Flash资源划分 搜索关键词:
NEW_LVGL_V8_DEMO
Flash资源的代码划分区域定义在 board_ac707n_demo_cfg.h文件中,路径为:apps/watch/board/br35/board_ac707n_demo/board_ac707n_demo_cfg.h。 - 编译与资源占用 当前开启的LVGL demo和example编译后,代码总占用约2.5M。用户可以根据需求关闭部分功能以减少资源占用。
- VSCode模拟器工程 lv_port_pc_vscode文件夹是一个可以在VSCode环境中运行的LVGL模拟器工程,依赖CMake和SDL。具体安装依赖库的方法请参考官方 lv_port_pc_vscode GitHub仓库。初次编译时,请清除 build文件夹以避免报错。 https://github.com/lvgl/lv_port_pc_simulator
- LVGL源码与示例 所有LVGL源码和示例位于 lv_port_pc_vscode文件夹中。
- UI初始化示例 ui_init()是一个表盘demo示例,由SquareLine生成。SquareLine内存占用较大,用户需控制页面加载数量。理论上Guigider也可以直接导入运行(需选择纯数组资源)。
- LVGL配置 lv_conf.h文件中的关键配置:
- #define DIS_HOR_RES 320 和 #define DIS_VER_RES 384 定义了屏幕尺寸,需与屏驱动同步。
- #define LV_USE_CUSTOM_GPU 用于引入JL GPU,关闭则为纯软件绘制。
性能对比
| 页面类型 | 软件渲染 (FPS/内存) | 硬件加速 (FPS/内存) | 性能提升 |
|---|---|---|---|
| 模拟钟表 | 22FPS / 77K | 41FPS / 77K | +86% |
| 数字钟表 | 27FPS / 77K | 41FPS / 71K | +52% |
| 天气动画 | 24FPS / 81K | 41FPS / 75K | +71% |
| 天气列表 | 26FPS / 66K | 41FPS / 58K | +58% |
| 电话页 | 25FPS / 78K | 41FPS / 75K | +64% |
- JLANI动画模块 LV_USE_JLANI是JL高压缩视频格式,需同时开启 LV_USE_CUSTOM_GPU。相关库位于 lib_gpu文件夹中。
使用方法
参考 jlani.h文件,类似于 lv_gif的使用方法:
lv_obj_t * ani = lv_jlani_create(ui_watch_digital);
lv_jlani_set_src(ani, "mnt/sdfile/EXT_RESERVED/RESFS/che.ani");
完整JLANI动画示例
/**
* 创建并显示JLANI动画
*/
void create_jlani_animation(lv_obj_t *parent)
{
// 创建JLANI对象
lv_obj_t *ani = lv_jlani_create(parent);
// 设置对象大小和位置
lv_obj_set_size(ani, 200, 200);
lv_obj_align(ani, LV_ALIGN_CENTER, 0, 0);
// 加载ANI文件
lv_jlani_set_src(ani, "mnt/sdfile/EXT_RESERVED/RESFS/animation.ani");
// 设置动画循环播放
lv_obj_add_flag(ani, LV_OBJ_FLAG_CLICKABLE);
// 添加事件处理
lv_obj_add_event_cb(ani, jlani_event_cb, LV_EVENT_CLICKED, NULL);
}
/**
* JLANI事件回调函数
*/
static void jlani_event_cb(lv_event_t *e)
{
lv_obj_t *obj = lv_event_get_target(e);
lv_event_code_t code = lv_event_get_code(e);
if (code == LV_EVENT_CLICKED) {
// 点击时重新开始动画
lv_jlani_restart(obj);
}
}
JLANI文件格式说明
ANI文件是一种高压缩比的动画格式,具有以下特点:
- 高压缩率,比GIF小3-5倍
- 支持循环播放设置 可以使用JL提供的转换工具将GIF、APNG或视频文件转换为ANI格式。
- ANI工具使用说明
- 程序使用方式
方式一:双击运行(GUI模式)
直接双击 move_pic_converter.exe 启动图形界面,可以:
- 选择输入文件
- 设置输出路径
- 调整分辨率和帧率
- 查看转换日志

方式二:命令行模式
使用命令行参数运行程序,支持以下参数:
.\move_pic_converter.exe -h # 查看帮助信息
.\move_pic_converter.exe -i input.mp4 -o output --size 240x240 --fps 20 # 完整示例
参数说明:
- -i, --input:输入文件路径(必需)
- -o, --output:输出文件路径(可选)
- --size:输出分辨率(默认:240x240)
- --fps:输出帧率(默认:20)
PS E:\Release> .\move_pic_converter.exe -h
usage: move_pic_converter.exe [-h] -i INPUT [-o OUTPUT] [--size SIZE] [--fps FPS]
动图转换打包工具 - 完整的动图处理解决方案
功能说明:
1. 将输入动图转换为指定格式和分辨率
2. 自动生成动图索引文件
3. 将动图和索引打包为单个.ani文件
注意事项:
- 输入文件必须存在且可访问
- 如果目标文件已存在将被覆盖
options:
-h, --help show this help message and exit
-i INPUT, --input INPUT
输入动图文件路径(必需参数)
-o OUTPUT, --output OUTPUT
输出文件路径(可选参数)
--size SIZE 输出动图分辨率(默认: 240x240)
--fps FPS 输出动图帧率(默认: 20)
- 注意事项
- 推荐的分辨率和帧率组合:
- 240x240 @20FPS(标准模式)
- 320x240 @20FPS(宽屏模式)
- 320x384 @15FPS(竖屏模式)
- 360x360 @15FPS(圆屏模式带圆形遮罩)
- GPU相关配置
- GPU初始化完整示例
/**
* 初始化GPU和LVGL显示系统
*/
void init_gpu_and_display(void)
{
// 初始化GPU
szjl_gpu_init();
// 配置GPU缓存
// 参数1: 总缓冲大小 (12KB)
// 参数2: 每个字的平均大小 (128字节)
szjl_set_gpu_cache(12*1024, 128);
// 初始化LVGL
lv_init();
// 初始化显示缓冲区
// 注意: 传入NULL参数让GPU管理内存
static lv_disp_draw_buf_t disp_buf;
lv_disp_draw_buf_init(&disp_buf, NULL, NULL, DIS_HOR_RES * DIS_VER_RES);
// 初始化显示驱动
static lv_disp_drv_t disp_drv;
lv_disp_drv_init(&disp_drv);
// 配置显示驱动参数
disp_drv.draw_buf = &disp_buf;
disp_drv.flush_cb = szjl_gpu_disp_flush; // 使用GPU推屏接口
disp_drv.hor_res = DIS_HOR_RES;
disp_drv.ver_res = DIS_VER_RES;
disp_drv.full_refresh = 0; // 使用局部刷新
// 注册显示设备
lv_disp_t *disp = lv_disp_drv_register(&disp_drv);
// 设置默认屏幕
lv_disp_set_default(disp);
}
- 文字缓冲大小
extern void szjl_set_gpu_cache(int f, int a);
szjl_set_gpu_cache(12*1024, 128);
- 第一个参数是总缓冲大小。
- 第二个参数是每个字的平均大小(长 * 宽 * bpp / 8)。
- GPU推屏接口
extern void szjl_gpu_disp_flush(lv_disp_drv_t * disp_drv, const lv_area_t * area, lv_color_t * color_p);
szjl_gpu_disp_flush(disp_drv, area, color_p);
最终通过 lv_send_task_to_gpu(上层可见)传送。
4. 分块内存管理
lv_disp_draw_buf_init(&disp_buf1, NULL, NULL, DIS_HOR_RES * DIS_VER_RES);
分块内存由GPU管理,即屏驱动的分块高度配置 LCD_BLOCK_H,不使用原生LVGL缓冲。
12. GPU移植 直接移植 LV_USE_CUSTOM_GPU包含的内容以及 lib_gpu中的 .a库。
- GPU移植步骤详解
- 配置LVGL
- 在 lv_conf.h中启用自定义GPU:
#define LV_USE_CUSTOM_GPU 1
- 如需使用JLANI动画,同时启用:
#define LV_USE_JLANI 1
- 添加GPU库文件
- 将 lib_gpu文件夹中的 .a库文件添加到项目中
- 根据目标平台选择对应的库文件
- 修改显示驱动
- 使用GPU推屏接口替换原有的刷新回调:
disp_drv.flush_cb = szjl_gpu_disp_flush;
- 初始化GPU
- 在LVGL初始化前调用GPU初始化函数:
szjl_gpu_init();
- 配置GPU缓存:
szjl_set_gpu_cache(12*1024, 128);
- 配置显示缓冲区
- 使用GPU管理的分块内存:
lv_disp_draw_buf_init(&disp_buf, NULL, NULL, DIS_HOR_RES * DIS_VER_RES);
- 移植注意事项
- GPU库与特定硬件平台相关,确保选择正确的库文件
- 根据实际屏幕分辨率调整 DIS_HOR_RES和 DIS_VER_RES
- 根据系统内存情况调整GPU缓存大小 直接移植 LV_USE_CUSTOM_GPU包含的内容以及 lib_gpu中的 .a库。
- 正在进行的功能完善
- 矩形填充
- 复杂绘图
- 位图压缩
- JPEG支持
- MJPEG支持
- 功能开发路线图
| 功能 | 状态 | 说明 |
|---|---|---|
| 矩形填充 | 开发中 | 支持纯色和渐变填充 |
| 复杂绘图 | 规划中 | 包括圆角、圆形、弧线等 |
| 位图压缩 | 开发中 | 支持RLE和自定义压缩算法 |
| JPEG支持 | 规划中 | 硬件加速JPEG解码 |
| MJPEG支持 | 规划中 | 视频播放支持 |
- 总结 本文档提供了LVGL8最小GPU系统实现的关键信息,包括入口、触摸、Flash资源划分、性能对比、JLANI动画模块和GPU配置等。用户可根据需求调整配置,并参考示例代码进行开发。
- 关键性能指标
- 渲染速度:GPU加速后平均提升60-70%
- 适用场景
- 资源受限的嵌入式设备
- 需要流畅UI体验的可穿戴设备
- 电池供电的便携设备
- 参考资源
- 技术支持
- 如有问题,请联系杰理技术支持团队:
- 本文档提供了LVGL8最小GPU系统实现的关键信息,包括入口、触摸、Flash资源划分、性能对比、JLANI动画模块和GPU配置等。用户可根据需求调整配置,并参考示例代码进行开发。