1. TouchGFX 生态概览:从 STM32 到你的第一个界面

大家好,欢迎来到《TouchGFX界面移植实战课》。我是你们这趟旅程的向导,一个在嵌入式 UI 领域摸爬滚打多年的工程师。

第一节课,我们不急着写代码。先聊聊 TouchGFX 在整个 STM32 生态里到底扮演什么角色,它的设计思路是什么,以及——嗯,我们怎么用最快的方式点亮屏幕,跑起第一个“Hello World”。

1.1 TouchGFX 在 STM32 生态中的位置

STM32 的软件生态,说白了就是一个巨大的工具箱。从底层的 HAL 库、LL 库,到中间层的 FreeRTOS、FatFS、USB 协议栈,再到上层的图形界面——TouchGFX 就是那个负责“画图”的顶级模块。

我个人习惯把 STM32 的软件栈想象成一栋楼:

  • 地基:硬件抽象层(HAL/LL),直接操作寄存器。
  • 承重墙:实时操作系统(FreeRTOS),管理任务调度。
  • 水电管道:文件系统、网络协议栈、USB 驱动。
  • 精装修:TouchGFX,负责用户看到的一切。

TouchGFX 不是孤立存在的。它依赖底层的驱动(LTDC、DMA2D、FMC)来刷新屏幕,依赖 FreeRTOS 来管理渲染线程,依赖 HAL 库来配置时钟和中断。你想想看,如果底层时钟配错了,TouchGFX 再牛也刷不出画面。

核心认知:TouchGFX 是 STM32 生态的“上层应用框架”,它的稳定性完全建立在底层硬件和中间件的正确配置之上。移植 TouchGFX,本质上是把这三层(硬件驱动 + 操作系统 + 图形引擎)正确对接的过程。

我曾经在一个项目里,因为 LTDC 的像素时钟极性配反了,屏幕一直闪。折腾了两天,最后发现是 CubeMX 里一个下拉菜单选错了。嗯,这种坑,后面我会专门讲。

1.2 TouchGFX 的设计哲学与核心优势

TouchGFX 的设计哲学,我总结为四个字:硬件加速。它不像 emWin 那样靠 CPU 逐像素画图,而是充分利用 STM32 内部的 2D 图形加速器(DMA2D)和硬件图层(LTDC)。

为什么这很重要?因为嵌入式设备的 CPU 资源极其有限。如果所有界面渲染都靠 CPU 去刷,你的 UI 帧率会惨不忍睹,而且其他任务(比如读取传感器、控制电机)都会被拖死。

TouchGFX 的核心优势,我列个表,大家一目了然:

特性 说明 我的实战感受
硬件加速渲染 利用 DMA2D 进行图像混合、颜色填充、像素格式转换 帧率轻松跑到 60fps,CPU 占用不到 20%
所见即所得设计器 TouchGFX Designer 拖拽式布局,实时预览 UI 设计师和嵌入式工程师可以并行工作
低内存占用 支持局部刷新、帧缓冲压缩、动态位图加载 在仅有 512KB SRAM 的芯片上跑过复杂仪表盘
丰富的控件库 按钮、滑块、图表、键盘、容器等 40+ 控件 覆盖 90% 的工业/HMI 场景,不用自己造轮子
与 STM32CubeMX 深度集成 一键生成工程,自动配置时钟、GPIO、LTDC 减少 70% 的底层配置工作量

我的建议:如果你正在选型,芯片至少要带 DMA2D 和 LTDC 外设。比如 STM32F429、STM32F746、STM32H743 这些系列。没有硬件加速的芯片跑 TouchGFX,体验会打折扣。

1.3 TouchGFX 软件架构速览

在动手之前,我们先看一眼 TouchGFX 的软件架构。这能帮你理解,你写的代码到底跑在哪个层级。

TouchGFX 软件架构分层 应用层(你的 UI 逻辑:屏幕、控件、交互) TouchGFX 框架(渲染引擎、控件库、事件系统) 硬件抽象层(HAL:LTDC、DMA2D、FMC、触摸驱动) 中间件层(FreeRTOS、FatFS、USB 协议栈) 硬件层(STM32 MCU、LCD 屏、触摸芯片) 移植关注点

从这张图你能看到,移植工作主要集中在中下层:配置好硬件驱动(LTDC、DMA2D、触摸),对接好 FreeRTOS 的任务和时钟,然后 TouchGFX 框架就能在上面跑起来。你只需要在应用层写界面逻辑。

1.4 搭建第一个“Hello World”工程

好了,理论说够了。我们直接动手,用 STM32CubeMX + TouchGFX Designer 创建一个最简单的工程,让屏幕亮起来,显示“Hello World”。

1.4.1 准备工作

你需要以下工具:

  • 硬件:一块带屏幕的 STM32 开发板(我用的 STM32F746G-DISCO,你也可以用其他板子)
  • 软件:STM32CubeMX(6.x 以上)、TouchGFX Designer(4.20 以上)、IAR/Keil/STM32CubeIDE

注意:TouchGFX Designer 和 CubeMX 的版本要匹配。我曾经因为 Designer 版本太新,CubeMX 生成的代码不兼容,编译报了一堆错。建议都用最新版。

1.4.2 在 CubeMX 中配置工程

  1. 打开 STM32CubeMX,选择你的芯片型号(比如 STM32F746ZGT6)。
  2. 在 Pinout & Configuration 选项卡中,启用 LTDC、DMA2D、FMC(如果屏幕挂在 SDRAM 上)。
  3. 配置时钟树:LTDC 的像素时钟(PLLSAI)根据屏幕规格设置。比如 480x272 的屏幕,典型值是 9MHz 左右。
  4. 在 Middleware 分类下,选择 TouchGFX,勾选“Enable TouchGFX Generator”。
  5. 配置 FreeRTOS(如果要用多任务),或者保持默认的 BareMetal 模式。
  6. 点击 Project Manager,设置工程名称、路径、IDE 类型。然后点击 Generate Code。

我的习惯:生成代码后,先编译一次,确保底层驱动没有错误。不要急着打开 Designer。这一步能帮你把硬件问题隔离出来。

1.4.3 在 TouchGFX Designer 中创建界面

  1. 打开 TouchGFX Designer,点击 New Project。
  2. 选择 From STM32CubeMX,导入刚才生成的 .ioc 文件。
  3. Designer 会自动解析你的屏幕参数(分辨率、颜色深度、帧缓冲地址)。
  4. 在左侧控件面板中,拖一个 Text Area 到画布中央。
  5. 在属性面板中,设置文本为“Hello World”,字体大小 36,颜色白色。
  6. 点击右上角的 Run Simulator,你就能在 PC 上看到模拟效果了。

嗯,这里要注意:模拟器用的是 PC 的渲染能力,不代表实际硬件性能。但至少能验证你的 UI 布局对不对。

1.4.4 生成代码并烧录

  1. 在 Designer 中点击 Generate Code,它会生成 UI 相关的 C++ 代码,并自动覆盖到 CubeMX 工程目录下。
  2. 回到你的 IDE(IAR/Keil/STM32CubeIDE),重新编译整个工程。
  3. 连接开发板,烧录固件。
  4. 按下复位键——如果一切顺利,屏幕上应该出现“Hello World”。

常见问题:如果屏幕不亮,先检查背光引脚是否使能。如果屏幕亮了但花屏,检查 LTDC 的时序配置和帧缓冲地址是否正确。如果触摸没反应,检查 I2C/SPI 触摸驱动是否初始化成功。

1.5 本章小结

这一章,我们走了一遍 TouchGFX 的生态全景。从它在 STM32 软件栈中的位置,到它的设计哲学和核心优势,再到亲手搭建第一个工程。你想想看,整个过程其实并不复杂:CubeMX 负责底层配置,Designer 负责界面设计,两者通过 .ioc 文件无缝对接。

我个人觉得,TouchGFX 最大的价值在于,它让嵌入式工程师能把更多精力放在 UI 交互逻辑上,而不是纠结于像素怎么刷、图层怎么混合。当然,底层驱动还是得懂,不然出了问题你都不知道从哪查起。