一、嵌入式GUI概述:什么是嵌入式GUI、手表GUI的特殊性、常见轻量级GUI框架对比

大家好,我是老李。做嵌入式这行十几年了,从最早的段式LCD到现在的彩色TFT,GUI这块我踩过的坑还真不少。今天咱们聊聊嵌入式GUI,特别是手表上的轻量实现。

说实话,很多人一听到GUI就想到PC上的Qt或者Android。但在嵌入式世界里,情况完全不同。你想想看,一个MCU可能只有几百KB的Flash,几十KB的RAM,你还想跑个华丽的动画?不现实。

什么是嵌入式GUI

嵌入式GUI,说白了就是给嵌入式设备做的一套图形界面系统。它负责把按钮、文字、图片这些东西画到屏幕上,同时处理用户的触摸或按键操作。

我习惯把嵌入式GUI分成三类:

  • 裸机直接画:自己写驱动,直接操作显存。优点是轻,缺点是你得啥都自己干。
  • 轻量级GUI框架:像LVGL、uGUI、emWin这些。它们帮你封装好了控件和事件处理。
  • 嵌入式Linux GUI:比如Qt Embedded、GTK。资源消耗大,一般用在性能强的平台上。

咱们这门课主要聊第二类。为什么?因为手表这种设备,MCU资源有限,但又需要一定的交互体验。轻量级GUI框架正好卡在这个平衡点上。

核心要点:嵌入式GUI不是把PC上的GUI搬过来,而是在资源受限的环境下,用最小的代价实现最必要的交互。

手表GUI的特殊性

手表GUI跟手机、平板上的GUI完全不是一回事。我在做第一款智能手表项目时,一开始没想明白这点,结果走了不少弯路。

手表GUI有几个特殊之处:

  1. 屏幕小:一般1.2到1.6英寸,分辨率从240x240到454x454。这么小的屏幕,你没法放太多信息。
  2. 功耗敏感:手表电池就那么点容量。GUI每刷新一帧都在耗电。我见过一个项目,就因为动画刷得太频繁,续航直接砍半。
  3. 交互方式受限:触摸屏很小,手指点不准。更多时候用滑动手势、抬腕亮屏、按键操作。
  4. 实时性要求高:秒针要一秒一秒地走,不能卡顿。心率数据要实时更新。
  5. 常亮显示:很多手表支持AOD(Always On Display),这时候GUI要切换到低功耗模式,只刷新局部。

个人经验:我建议在设计手表GUI时,先把核心功能列出来。比如时间显示、通知提醒、运动数据。其他花里胡哨的功能,能砍就砍。每多一个功能,代码量和功耗都会增加。

还有一个坑——字体渲染。手表屏幕小,字体太小看不清,太大又放不下。我曾经为了一个数字字体折腾了两天,最后发现用点阵字体比矢量字体省空间多了。

常见轻量级GUI框架对比

目前市面上主流的轻量级GUI框架有三个:LVGL、uGUI、emWin。我挨个说说我的使用感受。

特性 LVGL uGUI emWin
开源/商业 开源(MIT协议) 开源(BSD协议) 商业(SEGGER)
资源占用 Flash: ~100KB+,RAM: ~8KB+ Flash: ~20KB,RAM: ~2KB+ Flash: ~30KB+,RAM: ~4KB+
控件丰富度 非常丰富(50+控件) 基础(按钮、文本框等) 丰富(30+控件)
动画支持 内置动画引擎 无原生支持 有限支持
字体支持 内置字体引擎,支持抗锯齿 点阵字体 支持多种字体格式
学习曲线 中等 中等
社区活跃度 非常高 中等(商业支持)

LVGL

LVGL(LittlevGL)是我目前最常用的框架。它开源、功能全、社区活跃。你想想看,一个MIT协议的开源项目,有50多个控件,还自带动画引擎,这性价比没谁了。

不过LVGL也有缺点。它的资源占用相对较大,Flash至少100KB起步。如果你的MCU只有64KB Flash,那基本没戏。我有个项目用STM32F103,Flash 128KB,跑LVGL勉强够用,但加上应用代码就捉襟见肘了。

注意:LVGL的显存消耗跟屏幕分辨率直接相关。比如240x240的屏幕,16位色,一个显存缓冲区就需要240*240*2 = 115KB。如果你的RAM不够,可以用单缓冲区或者局部刷新模式。

uGUI

uGUI是个老牌框架了。它的最大优势就是轻——Flash只要20KB左右,RAM 2KB就能跑。我最早做手表项目时用的就是它。

但uGUI的问题也很明显。它只提供最基础的绘图API,比如画线、画圆、画矩形。控件?你得自己写。动画?别想了。说白了,uGUI更像是一个图形库,而不是完整的GUI框架。

我建议,如果你的MCU资源极度紧张,比如只有32KB Flash、4KB RAM,那uGUI是唯一的选择。否则,还是用LVGL吧。

emWin

emWin是SEGGER公司的商业产品。它功能强大,稳定性好,而且有专业的技术支持。很多工业设备和医疗设备都在用。

但emWin是收费的。虽然SEGGER提供了免费评估版,但商用需要购买授权。我记得有个初创公司找我咨询,他们想用手表方案,一听emWin授权费要几千美金,立马转向了LVGL。

emWin的优势在于它的WYSIWYG(所见即所得)工具——AppWizard。你可以像搭积木一样设计界面,然后自动生成代码。这对不擅长写GUI代码的工程师来说,确实方便。

我的建议

  • 资源充足、追求开发效率 → 选LVGL
  • 资源极度受限、只做简单显示 → 选uGUI
  • 商业项目、需要专业支持 → 选emWin

好了,这一章就聊这么多。下一章咱们会深入LVGL,从移植开始,一步步搭建一个手表界面。到时候我会分享一些实际项目中的代码和调试技巧,敬请期待。