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)切换,可以避免画面撕裂,但会占用更多内存和带宽。

在 TouchGFX Designer 中配置 Display 时,Frame Buffer Start Address、Width、Height、Pixel Format 必须与 LTDC 初始化一致,否则运行时会出现颜色错乱或偏移。

三、触摸屏原理与坐标映射

嵌入式常用电阻触摸屏和电容触摸屏。电阻屏通过 ADC 读取 X/Y 电压,需要做校准;电容屏通过 I2C 读取触摸控制器(如 FT6236、GT911)的坐标和触摸状态。无论哪种,最终都要把原始坐标映射到屏幕像素坐标。

触摸事件在 TouchGFX 中会经历:采样 → 滤波 → 坐标变换 → 命中测试 → 控件回调。命中测试决定触摸点落在哪个控件上,回调再触发按钮、滑动条或页面切换。若坐标映射矩阵不准,会出现“点不准”或边缘无法触发的问题。

嵌入式 GUI 显示与触摸链路 触摸面板 电阻/电容 触摸控制器 ADC / I2C 坐标映射与滤波 校准矩阵 TouchGFX 事件 命中测试 / 回调 图形库 / TouchGFX 控件 / 动画 / 混合 帧缓冲 RGB565 / 双缓冲 LTDC / DSI 扫描输出 LCD 屏幕 像素显示 事件驱动界面更新 关键约束:帧缓冲带宽 = 宽 × 高 × 色深 × 刷新率;触摸采样率与 UI 刷新率需匹配,避免丢点或卡顿。 TouchGFX 通过 LTDC 双缓冲 + DMA2D 加速,把 CPU 从像素搬运中解放出来。

四、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 硬件相关的部分封装好,让开发者专注界面逻辑,而不是重复造帧缓冲和触摸驱动的轮子。