扫码加入

  • 正文
  • 相关推荐
申请入驻 产业图谱

单片机开发的开源UI库大盘点,你知道几个?

01/12 11:51
1730
加入交流群
扫码加入
获取工程师必备礼包
参与热点资讯讨论

大家好,我是杂烩君。之前的文章有朋友留言:裸机环境下用什么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库?欢迎留言讨论哈

相关推荐

登录即可解锁
  • 海量技术文章
  • 设计资源下载
  • 产业链客户资源
  • 写文章/发需求
立即登录

本公众号专注于嵌入式技术,包括但不限于C/C++、嵌入式、物联网、Linux等编程学习笔记,同时,公众号内包含大量的学习资源。欢迎关注,一同交流学习,共同进步!