2. 嵌入式 GUI 基础
在 MCU 上做触摸交互界面,和写一个桌面 Qt 程序完全不同。嵌入式 GUI 的每一帧像素都要由芯片自己算出来、自己搬进显存、自己送到屏幕;触摸事件也要从模拟信号变成坐标,再变成控件状态。理解这条链路,才能判断 TouchGFX 为什么适合某些场景,而不适合另一些场景。
一、嵌入式图形系统的组成
一个最小可用的嵌入式图形系统通常由四层构成:显示控制器(LTDC/DSI)负责按像素时钟把显存内容扫描输出;帧缓冲(Frame Buffer)是存放一帧像素的连续内存;图形库/渲染引擎负责绘制控件、混合图层、做透明与动画;输入子系统把触摸屏或按键事件转换为坐标和动作。TouchGFX 位于渲染引擎层,向上提供控件与交互框架,向下直接操作帧缓冲和 LTDC。
与 Linux 上的 GUI 不同,MCU 图形系统没有窗口管理器、没有虚拟内存、没有 GPU 着色器。所有绘制都靠 CPU 或 DMA2D 完成,因此“画什么、画多大、多久画一次”直接决定 CPU 占用和功耗。
二、帧缓冲:像素的落脚点
帧缓冲是一块按屏幕分辨率与色深计算出的内存区域。以 480×272、RGB565 为例,单缓冲需要 480×272×2 = 261,120 字节,约 255 KB。若使用双缓冲,则翻倍到约 510 KB。对 STM32F4/F7/H7 来说,这通常放在外部 SDRAM 或内部 SRAM 中。
单缓冲大小 = 宽 × 高 × 每像素字节数
480 × 272 × 2 = 261120 B ≈ 255 KB
双缓冲 = 2 × 255 KB ≈ 510 KB
RGB888 时每像素 3 B,单缓冲 ≈ 382 KB
帧缓冲的关键参数包括:起始地址、行跨度(pitch)、像素格式、是否双缓冲。LTDC 会按行读取帧缓冲并叠加图层,若帧缓冲地址或 pitch 配错,屏幕会出现花屏、错位或撕裂。双缓冲配合 LTDC 的垂直消隐(VSYNC)切换,可以避免画面撕裂,但会占用更多内存和带宽。
三、触摸屏原理与坐标映射
嵌入式常用电阻触摸屏和电容触摸屏。电阻屏通过 ADC 读取 X/Y 电压,需要做校准;电容屏通过 I2C 读取触摸控制器(如 FT6236、GT911)的坐标和触摸状态。无论哪种,最终都要把原始坐标映射到屏幕像素坐标。
触摸事件在 TouchGFX 中会经历:采样 → 滤波 → 坐标变换 → 命中测试 → 控件回调。命中测试决定触摸点落在哪个控件上,回调再触发按钮、滑动条或页面切换。若坐标映射矩阵不准,会出现“点不准”或边缘无法触发的问题。
四、TouchGFX 的适用场景与边界
TouchGFX 是 ST 主推的 MCU GUI 框架,核心优势是与 STM32 硬件深度耦合:直接使用 LTDC、DMA2D、Chrom-ART 加速,支持部分帧缓冲和双缓冲,能在 200~500 MHz 的 Cortex-M4/M7 上跑出流畅动画。它适合以下场景:
- 家电、工业 HMI、医疗设备等中低分辨率触摸界面(320×240 到 800×480)。
- 需要动画、透明、滑动列表,但不想上 Linux 的低成本产品。
- 已有 STM32 硬件平台,希望快速用 Designer 拖拽出原型。
但它也有边界:不适合 1080p 以上高分辨率、多窗口复杂桌面、需要 GPU 着色器的场景;也不适合没有 LTDC/DMA2D 的低端 MCU,因为纯 CPU 刷屏会非常吃力。
| 对比项 | TouchGFX | 裸机自绘 | Linux + Qt |
|---|---|---|---|
| 硬件依赖 | STM32 + LTDC/DMA2D | 任意 MCU | 带 MMU 的 MPU |
| 开发效率 | 高,Designer 可视化 | 低,全部手写 | 高,但资源重 |
| 内存占用 | 中,可部分帧缓冲 | 低 | 高,需 DDR |
| 动画能力 | 强,硬件加速 | 弱 | 很强 |
| 适用分辨率 | ≤ 800×480 为主 | ≤ 320×240 | 1080p 及以上 |
五、常见误区与复盘
误区一:把帧缓冲放在内部 SRAM。480×272 双缓冲约 510 KB,多数 MCU 内部 SRAM 不够,必须外扩 SDRAM,否则链接阶段就会溢出。
误区二:忽略 LTDC 时钟与屏幕时序。像素时钟、HSYNC/VSYNC 前后肩配错,屏幕会黑屏或偏移,和 GUI 代码无关。
误区三:触摸坐标不校准。电阻屏必须做两点或四点校准;电容屏要确认控制器输出的坐标方向与屏幕一致。
误区四:UI 刷新率与触摸采样率不匹配。触摸采样太慢会丢点,刷新太慢会卡顿,通常触摸 50~100 Hz、UI 30~60 FPS 比较合理。
复盘时可以用一个简单清单排查:帧缓冲地址与大小是否正确、LTDC 是否正常输出、触摸中断是否触发、坐标映射是否准确、DMA2D 是否使能。把这五步走通,TouchGFX 的界面才能稳定跑起来。
一句话总结:嵌入式 GUI 的本质是“用有限内存和带宽,把像素按时送到屏幕,把触摸准确变成事件”。TouchGFX 的价值,在于把这条链路中与 STM32 硬件相关的部分封装好,让开发者专注界面逻辑,而不是重复造帧缓冲和触摸驱动的轮子。