1、嵌入式GUI概述:什么是嵌入式GUI、嵌入式GUI的应用领域、主流嵌入式GUI框架对比

大家好,我是老周。做嵌入式这行十几年了,今天咱们来聊聊嵌入式GUI。

很多人一听到「GUI」,脑子里蹦出来的就是手机、电脑桌面。但在嵌入式世界里,GUI 的画风完全不一样。它跑在资源受限的 MCU 上,没有 Linux 那么大的内存,也没有 GPU 给你用。说白了,就是用几 KB 的 RAM 和几十 MHz 的主频,硬生生画出漂亮的界面来。

嵌入式GUI的核心矛盾:有限的硬件资源 vs 用户对交互体验的无限期待。

1.1 什么是嵌入式GUI

嵌入式GUI,全称是 Graphical User Interface for Embedded Systems。它是一套运行在嵌入式设备上的图形显示和交互系统。你看到的智能手表表盘、空调控制面板、医疗监护仪上的波形图,背后都是嵌入式GUI在干活。

我习惯把嵌入式GUI拆成三层来看:

  • 底层驱动层:负责往屏幕刷像素点,操作显存,处理触摸/按键输入。
  • 中间件层:提供绘图API、字体渲染、控件库、事件处理机制。
  • 应用层:你写的业务逻辑,比如点击按钮切换页面、显示传感器数据。

嗯,这里要注意——嵌入式GUI和桌面GUI最大的区别在于:桌面GUI可以随便new对象,内存不够了有虚拟内存撑着。嵌入式GUI不行,你每申请一块内存都得精打细算,搞不好就内存碎片了。

1.2 嵌入式GUI的应用领域

这些年我跑过的项目,几乎覆盖了嵌入式GUI的主流战场。你想想看,哪些地方需要小屏幕+交互?

领域 典型设备 屏幕特点
智能家居 智能面板、温控器、门锁 3.5~7寸,电阻/电容触摸
工业控制 HMI人机界面、PLC显示模块 7~15寸,常带物理按键
医疗电子 监护仪、注射泵、手持超声 高分辨率,需高刷新率
消费电子 智能手表、手环、家电屏 圆形/方形,低功耗
汽车电子 仪表盘、中控屏、T-Box 车规级,高可靠性
物联网终端 扫码枪、物流终端、对讲机 小尺寸,低功耗

我在做智能家居面板项目时踩过一个坑:屏幕刷新率不够,导致触摸滑动时界面撕裂。后来发现是底层驱动没开双缓冲。嗯,这种问题在嵌入式GUI里特别常见,后面章节我会专门讲。

1.3 主流嵌入式GUI框架对比

现在市面上主流的嵌入式GUI框架,我挑四个最有代表性的:LVGL、TouchGFX、emWin、Qt for MCU。它们各有各的脾气。

先看一张总览对比表:

特性 LVGL TouchGFX emWin Qt for MCU
开源/商业 开源 (MIT) 商业 (ST授权免费) 商业 (SEGGER) 商业 (Qt公司)
最低RAM需求 ~8 KB ~32 KB ~16 KB ~64 KB
最低Flash需求 ~64 KB ~128 KB ~100 KB ~256 KB
渲染方式 软件渲染 硬件加速(Chrom-ART) 软件+部分硬件 软件渲染
控件丰富度 ★★★★★ ★★★★ ★★★ ★★★★
学习曲线 低 中 中 高
社区活跃度 极高 高 低 中

LVGL

我个人最常用的是LVGL。为什么?因为它开源、轻量、社区活跃。你想想看,一个MIT协议的开源库,随便改随便用,出了问题还能在GitHub上提issue,多爽。

LVGL的架构设计得很清晰:

  • 核心层:对象管理、事件分发、动画引擎
  • 控件层:按钮、标签、列表、图表等70+控件
  • 绘制层:支持抗锯齿、圆角、阴影
  • 输入层:触摸、按键、编码器

我曾经在一个STM32F103项目上跑LVGL,RAM只有20KB可用。通过裁剪功能、关闭不必要的控件,硬是跑起来了。嗯,这里有个技巧——LVGL的lv_conf.h里可以开关很多功能,别一股脑全开。

TouchGFX

TouchGFX是ST主推的框架,专门为STM32优化。它的亮点是硬件加速——利用STM32的Chrom-ART图形加速器,渲染速度非常快。

但要注意,TouchGFX的免费版本只支持ST的MCU。如果你用其他厂家的芯片,就得买商业授权。我记得有个项目,客户非要指定NXP的芯片,结果TouchGFX用不了,临时换成了LVGL。

emWin

emWin是SEGGER公司的商业产品,老牌、稳定。很多工业HMI设备都在用。它的优点是文档齐全、技术支持好。但缺点也很明显——闭源、收费、社区资源少。

emWin的API风格偏传统,有点像Windows的GDI。如果你是从桌面GUI转过来的,可能会觉得亲切。但说实话,它的控件样式比较老旧,想做出漂亮的现代UI需要自己花功夫。

Qt for MCU

Qt for MCU是Qt公司把桌面Qt移植到MCU上的产物。它最大的卖点是「一套代码,多平台复用」——你在Qt Creator里写的UI,可以编译到MCU上跑。

但代价也很高:需要至少64KB RAM、256KB Flash,而且目前只支持少数高端MCU。我试过在STM32H7上跑,资源勉强够,但动画一多就卡。说白了,Qt for MCU更适合那些「从Linux降级到MCU」的项目。

我的选型建议:

  • 资源紧张(RAM < 32KB):选LVGL
  • 用STM32且需要高性能:选TouchGFX
  • 工业产品、需要商业支持:选emWin
  • 团队有Qt经验、MCU资源充裕:选Qt for MCU

1.4 嵌入式GUI框架选型决策流程

下面这张图是我自己总结的选型决策流程,每次接新项目我都会走一遍:

嵌入式GUI框架选型决策流程 项目启动 RAM < 32KB ? 是 LVGL 否 使用 STM32 ? 是 TouchGFX 否 需要商业支持 ? 是 emWin 否 有Qt经验 ? 是 Qt for MCU 否 LVGL(通用方案) LVGL 是资源受限场景的默认选择

避坑提醒:我曾经在一个项目里,团队拍脑袋选了TouchGFX,结果MCU是GD32的,根本跑不了。后来硬着头皮移植到LVGL,多花了两周时间。所以选框架之前,先确认你的硬件平台支不支持。

1.5 小结

这一章我们聊了嵌入式GUI的基本概念、应用场景,以及四个主流框架的对比。说白了,选框架没有银弹,关键看你的硬件资源、团队经验和项目需求。

我个人建议:如果你刚开始接触嵌入式GUI,先从LVGL入手。它社区活跃、资料多、上手快。等你把LVGL玩熟了,再去看其他框架,会发现很多设计思路是相通的。