TouchGFX与硬件驱动适配 - 第1节

一、TouchGFX 到底是什么?

先说说我个人的理解。TouchGFX 是一个专门给嵌入式设备做图形用户界面的框架。说白了,就是帮你在单片机屏幕上画出漂亮的按钮、滑动条、图表这些东西。

你可能会问:那跟普通的 GUI 库有什么区别?嗯,关键就在「硬件加速」这四个字上。TouchGFX 充分利用了 MCU 内部的 LTDC(液晶显示控制器)、DMA2D(图形专用 DMA)这些外设,让界面跑起来特别流畅。我记得第一次在 STM32F429 上跑 TouchGFX 的 demo,那个 60fps 的动画效果,说实话,比我预想的好太多了。

一句话总结:TouchGFX 是一个面向高性能 MCU、支持硬件加速、专为嵌入式 GUI 设计的 C++ 框架。

二、TouchGFX 的架构长什么样?

这部分我建议你从下往上理解。整个架构分三层,每一层各司其职。

2.1 应用层(Application Layer)

这一层是你写业务逻辑的地方。比如按钮按下去要做什么、数据怎么显示。说白了,就是你的 C++ 代码加上 TouchGFX Designer 拖出来的界面。

2.2 框架层(Framework Layer)

这是 TouchGFX 的核心。它帮你管理屏幕切换、事件分发、动画调度、字体渲染等等。你不需要关心底层怎么画像素,框架层全包了。

2.3 硬件抽象层(HAL Layer)

嗯,这里就是咱们课程的重点了。HAL 层把硬件差异给屏蔽了。你只需要实现几个接口——比如「把这一块内存刷到屏幕上」「告诉我触摸屏有没有按下」——剩下的 TouchGFX 自己搞定。

TouchGFX 三层架构图 应用层(Application Layer) 用户界面设计 · 业务逻辑 · 屏幕交互 框架层(Framework Layer) 屏幕管理 · 事件分发 · 动画调度 · 字体渲染 硬件抽象层(HAL Layer) LCD驱动 · 触摸驱动 · DMA2D配置 · 帧缓冲管理 💡 硬件抽象层是 TouchGFX 与具体 MCU 之间的桥梁,也是本课程的核心内容

三、TouchGFX 跟硬件到底是什么关系?

这个问题很关键。我见过不少新手,以为 TouchGFX 是个「装上去就能用」的东西。其实不是的。

TouchGFX 本身不直接操作硬件寄存器。它通过 HAL 层调用你写的底层驱动。举个例子:

  • 显示方面:TouchGFX 需要你把帧缓冲区的地址告诉它,然后它往里面填像素数据。至于这个数据怎么通过 LTDC 或者 SPI 送到屏幕,那是你的事。
  • 触摸方面:TouchGFX 会定期问你「触摸屏有没有坐标数据?」你从 I2C 或者 SPI 读回来给它就行。
  • 性能方面:如果你用了 DMA2D,TouchGFX 会调用你实现的 copyBuffer 函数来做快速图像拷贝。我当初调这个接口的时候,发现 DMA2D 的配置不对,画面一直撕裂——后来才发现是行同步信号没对齐。

我的经验:刚开始做 TouchGFX 适配时,别急着跑复杂的 demo。先把 HAL 层的几个关键接口调通:displayDriver->flushFrameBuffer() 和 touchDriver->sampleTouch()。这两个通了,界面就能亮起来、能点按了。

四、TouchGFX 的渲染机制

这部分稍微有点绕,我尽量讲清楚。

4.1 帧缓冲(Frame Buffer)

TouchGFX 使用帧缓冲来存储当前屏幕的像素数据。你可以配置单缓冲、双缓冲甚至三缓冲。双缓冲的好处是:一个缓冲在显示,另一个在后台绘制,切换时不会出现撕裂。

我曾经在一个项目里只用了单缓冲,结果画面刷新的时候总能看到「半截屏幕」的撕裂现象。后来改成双缓冲,问题就解决了。代价是多占一块内存——嗯,在资源紧张的 MCU 上,这个取舍你得想清楚。

4.2 渲染流程

TouchGFX 的渲染流程大致是这样的:

  1. 事件触发:用户触摸屏幕,或者定时器到期,触发重绘请求。
  2. 脏矩形计算:TouchGFX 只重绘发生变化的那一小块区域,而不是整个屏幕。这叫「局部刷新」,能省不少性能。
  3. 绘制调用:框架层调用各个控件的 draw() 方法,把像素数据写入帧缓冲。
  4. 刷屏:通过 HAL 层的 flushFrameBuffer() 把帧缓冲的数据送到物理屏幕。

注意:如果你发现界面卡顿,先检查脏矩形是不是太大了。我曾经遇到过一个情况:一个全屏弹窗导致整个屏幕都标记为脏矩形,帧率直接掉到 20fps。后来改成只刷新弹窗区域,帧率就回到 60fps 了。

4.3 硬件加速的角色

TouchGFX 支持多种硬件加速方式:

加速方式 作用 我遇到的坑
DMA2D 快速拷贝、填充、混合像素数据 DMA2D 的 FIFO 没清空,导致颜色错乱
LTDC 自动从帧缓冲读取数据并发送到屏幕 LTDC 的时序参数配错,屏幕闪得像迪斯科
Chrom-ART STM32 上的图形加速器,做图像处理 这个用得少,但一旦用上性能提升很明显

说白了,硬件加速就是让 MCU 的 CPU 少干活,让专用外设去干。你想想看,如果每个像素都要 CPU 去搬运,那 CPU 就别干别的了。

五、小结

这一章我们聊了 TouchGFX 是什么、它的三层架构、跟硬件的关系,以及渲染机制。核心就一句话:TouchGFX 是个好框架,但硬件适配做不好,它就跑不起来。

后面的章节,我们会一步步深入 HAL 层的每个接口,从 LCD 驱动到触摸驱动,再到 DMA2D 加速。嗯,到时候你会发现自己写的代码真的能让屏幕「动起来」——那种感觉,挺爽的。