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 的软件架构。这能帮你理解,你写的代码到底跑在哪个层级。
从这张图你能看到,移植工作主要集中在中下层:配置好硬件驱动(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 中配置工程
- 打开 STM32CubeMX,选择你的芯片型号(比如 STM32F746ZGT6)。
- 在 Pinout & Configuration 选项卡中,启用 LTDC、DMA2D、FMC(如果屏幕挂在 SDRAM 上)。
- 配置时钟树:LTDC 的像素时钟(PLLSAI)根据屏幕规格设置。比如 480x272 的屏幕,典型值是 9MHz 左右。
- 在 Middleware 分类下,选择 TouchGFX,勾选“Enable TouchGFX Generator”。
- 配置 FreeRTOS(如果要用多任务),或者保持默认的 BareMetal 模式。
- 点击 Project Manager,设置工程名称、路径、IDE 类型。然后点击 Generate Code。
我的习惯:生成代码后,先编译一次,确保底层驱动没有错误。不要急着打开 Designer。这一步能帮你把硬件问题隔离出来。
1.4.3 在 TouchGFX Designer 中创建界面
- 打开 TouchGFX Designer,点击 New Project。
- 选择 From STM32CubeMX,导入刚才生成的 .ioc 文件。
- Designer 会自动解析你的屏幕参数(分辨率、颜色深度、帧缓冲地址)。
- 在左侧控件面板中,拖一个 Text Area 到画布中央。
- 在属性面板中,设置文本为“Hello World”,字体大小 36,颜色白色。
- 点击右上角的 Run Simulator,你就能在 PC 上看到模拟效果了。
嗯,这里要注意:模拟器用的是 PC 的渲染能力,不代表实际硬件性能。但至少能验证你的 UI 布局对不对。
1.4.4 生成代码并烧录
- 在 Designer 中点击 Generate Code,它会生成 UI 相关的 C++ 代码,并自动覆盖到 CubeMX 工程目录下。
- 回到你的 IDE(IAR/Keil/STM32CubeIDE),重新编译整个工程。
- 连接开发板,烧录固件。
- 按下复位键——如果一切顺利,屏幕上应该出现“Hello World”。
常见问题:如果屏幕不亮,先检查背光引脚是否使能。如果屏幕亮了但花屏,检查 LTDC 的时序配置和帧缓冲地址是否正确。如果触摸没反应,检查 I2C/SPI 触摸驱动是否初始化成功。
1.5 本章小结
这一章,我们走了一遍 TouchGFX 的生态全景。从它在 STM32 软件栈中的位置,到它的设计哲学和核心优势,再到亲手搭建第一个工程。你想想看,整个过程其实并不复杂:CubeMX 负责底层配置,Designer 负责界面设计,两者通过 .ioc 文件无缝对接。
我个人觉得,TouchGFX 最大的价值在于,它让嵌入式工程师能把更多精力放在 UI 交互逻辑上,而不是纠结于像素怎么刷、图层怎么混合。当然,底层驱动还是得懂,不然出了问题你都不知道从哪查起。