嵌入式UI
未读看文档使用
docs.nxp.com/bundle/GUIGUIDERUG_1.9.1/page/topics/welcome.html
代码结构使用GUI Guider生成的代码目录如下:接下来对其进行介绍
Custom/自定义代码和LVGL扩展配置(custom.c/h为自定义事件实现,lv_conf_ext.h为扩展配置,custom.mk为Makefile片段)。
Generated/
GUI Guider自动生成的所有核心代码和资源,包括:
字体文件夹(guider_customer_fonts/、guider_fonts/)
图片资源文件夹(images/)
事件处理(events_init.c/h)
界面创建和入口(gui_guider.c/h)
主界面/布局(setup_scr_screen.c)
控件初始化(widgets_init.c/h)
generated.mk为Makefile片段
LV ...
嵌入式UI
未读前言我们在使用LVGL进行UI设计的时候,每次都需要烧录到MCU上才能看到结果,这样效率太低下了,所以这里使用VScode实现在PC上模拟LVGL
以下是基于LVGL v9.x在windows下实现的vscode搭建模拟器,老版本的模拟方法略有却别,具体请百度
准备工作mingw64下载由于官网更新后,导致官网直接下载的都是源码,现在下载需要前往github获取编译后的bin
github:Releases · niXman/mingw-builds-binaries
下载这个即可
CMake下载CMake官网:Download CMake
SDL2下载 SDL2,全称为Simple DirectMedia Layer,是一个跨平台的多媒体开发库。SDL2提供了一系列函数,用于访问音频、键盘、鼠标、游戏杆和图形硬件,允许开发者编写一套代码即可在不同平台上运行。它的主要应用之一是游戏开发,许多知名游戏都是基于SDL2构建的。此外,SDL2也用于游戏开发工具、模拟器、样本演示和多媒体应用等。
在这里的LVGL就是使用了SDL2模拟一个显示触摸屏操作。
SDL2 github: ...
嵌入式UI
未读SquareLine的使用软件介绍SequareLine Studio 是由 LVGL 官方推出的嵌入式 UI 设计工具,专注于为嵌入式设备(如 MCU、Linux 网关、智能手表等)提供高效的可视化界面开发方案。
支持 C 语言和 Python 语言。
对于个人用户,是免费的,不过限制了单个工程组件使用个数和页面个数(不够就直接多创几个工程)
官方例程使用SquareLine官方有一些例程Example,我们可以打开学习他是怎么进行绘制的,以便于我们自己进行绘制
深入学习可以参考官方Example+LVGL官方文档+AI的方式学习
工程创建选择Create 选择LVGL版本,分辨率,像素格式,主题等
进去后主页面如下:
基础控件使用如何添加控件左侧是对应的控件,使用时直接拖动到页面上即可
右边可以就可以对控件的名称、属性、样式进行修改了
如何使用自定义字体首先下载一个你喜欢的字体.ttf/.otf格式的,将文件放到项目下的assets文件夹,然后就可以访问该素材了
然后到我们创建的项目中,右边选择Font:
Fontname:通常以字体+大小形式规范字体命名
Selec ...
嵌入式UI
未读移植LVGL到STM32官方英文移植教程:
Getting LVGL(获取 LVGL) — LVGL 文档
韦东山中文移植教程:
Porting(移植) — LVGL 文档
源码获取然后从github上下载源码:https://github.com/lvgl/lvgl
官方移植方法:https://docs.lvgl.io/master/details/integration/adding-lvgl-to-your-project/getting_lvgl.html
这是LVGL v9.3版本
移植该笔记基于lvgl v9.x往上的,如果使用版本较低,就可能与本笔记中的内容不同
我们的只需要关注源码中需要移植的部分:
以keil工程为例,我们找到项目根目录下Middlewares(没有就创建一个),然后再其中创建一个lvgl文件夹用于存放我们移植lvgl相关的内容
然后在该lvgl目录下新建src和port文件夹
src文件夹:lvgl源码
port文件夹:存放我们自己的移植代码,比如显示驱动移植、输入设备(触摸/按键)接口移植等等
src源码将下载下来的lvg ...
裁剪LVGLLVGL主打的就是轻量且多功能,其官网介绍中有这两句话:
RAM: 4kB + 150byte / widget (~48kB for a UI with a few screens)
Flash:~1OOkB for LVGL (depends on the enabled features)
这里的意思是,经过裁剪之后能达到这样的效果,并不是我们拿到手默认的配置就能达到这样效果。LVGL的裁剪在lv_conf.h文件中进行。
实际项目过程中,我们的Flash和SRAM可能不够用,所以需要进行裁剪优化LVGL占用的内存!
Flash优化lvgl的flash占用主要是以下内容:
控件与核心代码(lv_conf.h中控制,使能的控件越多,占用越多)
字体点阵数组(如ui_font_opensasnsitalic100.o里的点阵数据)。
图片/图标等资源(如你用LVGL/SquareLine导出的图片c文件)。
音频、logo、动画帧等。
这些都是由const修饰的数组,只读区域在Flash之中
字体裁剪在使用SquareLine ...
前言在做项目的过程中使用到了LVGL,遇到了一些问题,于LVGL的调度有关,所以这里写一篇笔记记录LVGL调度相关内容
LVGL任务调度任务处理介绍LVGL通过定时器轮询机制周期性检查并执行所有任务(动画、事件、刷新等),由主循环中持续调用lv_task_handler() 处理任务。
所有动画、控件刷新、事件分发等任务操作,都是在该函数内执行,并且最终都是通过定时器机制驱动。
我们必须在循环中间隔5~20ms持续调用lv_task_handler() 来处理任务,
在使用LVGL时,通常伴随RTOS的使用,所以我们都是将lvgl任务处理单独由一个任务执行,保证lv_task_handler()周期性的被调用处理所有的事件(UI刷新,输入检测等)
12345678910/* LVGL Handler task,驱动LVGL运行 */void LvglHandlerTask(void *argument){ while(1) { lv_task_handler(); // 启动lvgl的事务处理 osDelay(5); }}
定时 ...
前言对于LVGL相关的任务,出现异常时会进入lv_assert_handler,为了准确定位是哪里出了问题,是出了什么问题导致的死机等,我们需要知道以下调试的方法
日志输出默认情况下,LVGL的日志输出关闭,如果想要开启,在lv_conf.h中,将LV_USE_LOG配置为1
自定义日志输出自定义的日志回调函数通过注册回调函数的方式,将日志内容输出到串口、文件等。
1.设置LV_LOG_PRINTF = 0
2.然后注册回调函数即可,之后LVGL内部所有通过 LV_LOG_INFO、LV_LOG_WARN、LV_LOG_ERROR、LV_LOG_TRACE 等宏产生的日志,都会被发送到你注册的回调函数输出日志
函数原型:
1void (*lv_log_print_g_cb_t)(lv_log_level_t level, const char * buf);
参数:
level:表示输出日志的等级,有以下的等级
LV_LOG_LEVEL_TRACE 跟踪(最详细)
LV_LOG_LEVEL_INFO 信息
LV_LOG_LEVEL_WARN 警告
LV_LOG_LEVEL ...
LVGL介绍LVGL是什么?LVGL(Light and Versatile Graphics Library)- 轻便是且多功能的图形库,一个开源、跨平台的轻量级嵌入式图形界面库(GUI),专为资源有限的MCU/MPU设备设计(无操作系统)。它广泛应用于手表、家电、仪表、工控、物联网等场景。
最初LVGL叫做LittlevGL
官网:https://lvgl.io/英文文档:LVGL 9.3 documentation
中文文档:Introduction(介绍) — LVGL 文档
LVGL软硬件所需资源(推荐内存分配)
处理器要求
16、32 或 64 位微控制器或处理器
推荐主频 > 16MHz
存储资源
Flash/ROM:
最低 > 64 KB(仅包含最基本组件)
推荐 > 180 KB(功能更全面)
RAM:
静态RAM占用约 2KB(视使用的控件和功能而定)
处理任务堆栈(stack):最低 > 2 KB,推荐 > 8 KB (lv_task_handler任务)
动态内存池(heap):最低 > ...
软件层次架构在嵌入式系统开发中,常见的软件架构会把代码分为多个”层”(Layer),以便于管理、移植和维护。不同项目可能会有不同的划分,但主流嵌入式系统常见的层主要有:
应用层、中间件层、操作系统层、驱动层/硬件抽象层、硬件层
以下是对各层的详细介绍
应用层介绍:应用层(Application layer),有时也叫业务层,一般是实现产品的业务逻辑和最终功能,由开发者根据具体需求编写,比如界面、控制逻辑、协议处理等。
包含内容:
主程序入口(如main函数、app_main)
各种业务模块(如任务管理、UI界面、页面管理、控制流程)
设备/算法应用(如温度采集、数据上传、蓝牙通信等)
通常只通过中间件或驱动API访问下层,不直接操作硬件。
典型文件/模块
main.c、app.c、tasks.c、ui_app.c、page_manager.c等
中间件层介绍:中间件(Middleware),中间件层是为应用层提供通用功能的支撑库或协议栈,起到“工具箱”作用,帮助应用层快速实现复杂功能。常见的中间件为为协议栈、文件系统、GUI库、音频库等。
包含内容:
RT ...










