大家好,我是杂烩君。之前的文章有朋友留言:裸机环境下用什么UI库?
今天,我们就来一起盘点几款适用于单片机开发的开源 UI 库。
1. LVGL
LVGL(Light and Versatile Graphics Library)是目前嵌入式领域最受欢迎的图形库之一,是轻量级多功能图形库的首选。它采用 C 语言编写,完全开源,支持多种 MCU 架构和显示控制器。
| 项目信息 | 详情 |
|---|---|
| 开发语言 | C99 |
| 图形引擎 | 自带软件渲染器,支持硬件加速 |
| 许可证 | MIT |
| Github仓库 | https://github.com/lvgl/lvgl |
| Gitee仓库 | https://gitee.com/mirrors/lvgl |
特点:
- 内存占用低:最低配置下仅需 32KB Flash 和 8KB RAM硬件加速支持:内置多种图形硬件加速接口丰富的控件:提供 30+ 种控件和 10+ 种主题
底层机制:
LVGL 采用基于对象的架构,每个控件都是对象实例,通过继承关系共享基础属性。其绘图引擎采用脏矩形算法,只重绘发生变化的部分,极大提高效率。
static void btn_event_handler(lv_event_t * e) {
lv_event_code_t code = lv_event_get_code(e);
if(code == LV_EVENT_CLICKED) {
lv_obj_t * label = lv_event_get_user_data(e);
lv_label_set_text(label, "Button clicked!");
}
}
void lvgl_demo() {
lv_obj_t * btn = lv_btn_create(lv_scr_act());
lv_obj_set_size(btn, 120, 50);
lv_obj_center(btn);
lv_obj_t * label = lv_label_create(btn);
lv_label_set_text(label, "Click Me");
lv_obj_center(label);
lv_obj_add_event_cb(btn, btn_event_handler, LV_EVENT_ALL, label);
}
2. GUIX
GUIX 是微软 Azure RTOS 的图形组件,专门为实时操作系统设计,与 ThreadX RTOS 深度集成。适合已经使用 Azure RTOS 生态系统的项目,或者在产品中需要微软技术背书的企业级应用。
| 项目信息 | 详情 |
|---|---|
| 开发语言 | C99 |
| 图形引擎 | 自带渲染引擎,支持硬件加速 |
| 许可证 | MIT |
| Github仓库 | https://github.com/azure-rtos/guix |
| Gitee仓库 | https://gitee.com/mirrors/azure-rtos-guix |
特点:
- 线程安全:原生支持 RTOS 多任务环境事件驱动:基于消息队列的事件处理机制工具链完整:提供 Studio 图形化设计工具
工作原理:
GUIX 采用客户端-服务器架构,GUI 服务运行在独立线程中,应用程序通过消息队列与 GUI 服务通信。这种设计确保了 UI 响应的实时性和稳定性。
// GUIX 控件创建示例
VOID demo_widget_create(GX_WINDOW *window) {
GX_BUTTON *button;
GX_PROMPT *prompt;
gx_button_create(&button, "Button", window,
GX_ID_NONE,
GX_STYLE_ENABLED|GX_STYLE_BORDER_THIN,
100, 100, 80, 30);
gx_prompt_create(&prompt, "Status", window,
GX_ID_NONE,
GX_STYLE_ENABLED|GX_STYLE_TEXT_CENTER,
50, 150, 180, 30);
gx_widget_fill_color_set(&button->gx_widget,
GX_COLOR_ID_BUTTON_UPPER,
GX_COLOR_ID_BUTTON_LOWER);
}
3. GUILite
GUILite 如其名,是一个极度轻量级的 GUI 框架,核心代码仅 5000 行,却提供了完整的图形界面功能。
| 项目信息 | 详情 |
|---|---|
| 开发语言 | C++11 |
| 图形引擎 | 纯软件渲染,无依赖 |
| 许可证 | Apache 2.0 |
| Github仓库 | https://github.com/idea4good/GUILite |
| Gitee仓库 | https://gitee.com/idea4good/GuiLite |
特点:
轻量: 4千行C++代码,0依赖,单一头文件库(GuiLite.h)
超快: 高效渲染,单片机上也能流畅运行
兼容: 完美兼容第3方GUI框架(Qt/MFC/Winform/Cocoa/Web),现有Qt/MFC代码可以继续使用
最低硬件要求:
4. TouchGFX
TouchGFX 是 ST 微电子官方推出的图形框架,现已成为 STM32 生态的重要组成部分,免费用于 STM32 系列 MCU。
| 项目信息 | 详情 |
|---|---|
| 开发语言 | C++14 |
| 图形引擎 | 硬件加速为主,软件渲染为辅 |
| 许可证 | 商业许可(STM32用户免费) |
| Github仓库 | https://github.com/touchgfx |
| Gitee仓库 | https://gitee.com/mirrors/touchgfx |
STM32CubeMX 中安装 TouchGFX 软件包,或从 ST 官网下载
特点:
- 部分缓冲:智能更新屏幕部分区域,减少内存占用硬件加速:充分利用 Chrom-ART 加速器和 LTDC 控制器设计工具:提供 TouchGFX Designer 可视化设计工具
class MainView : public Screen<MainView> {
public:
MainView() {
button.setAction(buttonClickedCallback);
add(button);
add(label);
}
static void buttonClickedCallback(const AbstractButton& btn) {
Unicode::snprintf(labelBuffer, LABEL_SIZE, "Clicked at %d", touchgfx::HAL::getInstance()->getTicks());
label.invalidate();
}
private:
Button button;
TextAreaWithOneWildcard label;
staticconstuint16_t LABEL_SIZE = 20;
Unicode::UnicodeChar labelBuffer[LABEL_SIZE];
};
图形处理流程:
TouchGFX 采用独特的双缓冲与部分更新结合的策略。通过分析界面变化区域,只更新必要的屏幕部分,在保持流畅性的同时大幅降低内存需求。
5. LingDongGUI
LingDongGUI 是一个创新的立即模式(Immediate Mode)GUI 库,专为极度资源受限的环境设计。其核心设计哲学是"万物皆可画",采用函数式编程思想。
| 项目信息 | 详情 |
|---|---|
| 开发语言 | C99 |
| 图形引擎 | 立即模式,纯软件渲染 |
| 许可证 | MIT |
| Github仓库 | https://github.com/gzbkey/LingDongGUI |
| Gitee仓库 | https://gitee.com/gzbkey/LingDongGUI |
特点:
- 各种芯片通用:支持ARM单片机、RISC-V单片机、支持在PC上模拟运行(SDL)简单易用:对ARM-2D进行二次封装,极大降低ARM-2D的使用难度动态自动裁剪:无需宏定义裁剪,自适应最小化体积上位机:配套免费的通用上位机
大家还有什么推荐的GUI库?欢迎留言讨论哈
1730