TouchGFX与硬件驱动适配工程 - 第1节
1. 课程导入
先说说我个人的理解。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 跟硬件到底是什么关系?
这个问题很关键。我见过不少新手,以为 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 的渲染流程大致是这样的:
- 事件触发:用户触摸屏幕,或者定时器到期,触发重绘请求。
- 脏矩形计算:TouchGFX 只重绘发生变化的那一小块区域,而不是整个屏幕。这叫「局部刷新」,能省不少性能。
- 绘制调用:框架层调用各个控件的
draw()方法,把像素数据写入帧缓冲。 - 刷屏:通过 HAL 层的
flushFrameBuffer()把帧缓冲的数据送到物理屏幕。
注意:如果你发现界面卡顿,先检查脏矩形是不是太大了。我曾经遇到过一个情况:一个全屏弹窗导致整个屏幕都标记为脏矩形,帧率直接掉到 20fps。后来改成只刷新弹窗区域,帧率就回到 60fps 了。
4.3 硬件加速的角色
TouchGFX 支持多种硬件加速方式:
| 加速方式 | 作用 | 我遇到的坑 |
|---|---|---|
| DMA2D | 快速拷贝、填充、混合像素数据 | DMA2D 的 FIFO 没清空,导致颜色错乱 |
| LTDC | 自动从帧缓冲读取数据并发送到屏幕 | LTDC 的时序参数配错,屏幕闪得像迪斯科 |
| Chrom-ART | STM32 上的图形加速器,做图像处理 | 这个用得少,但一旦用上性能提升很明显 |
说白了,硬件加速就是让 MCU 的 CPU 少干活,让专用外设去干。你想想看,如果每个像素都要 CPU 去搬运,那 CPU 就别干别的了。
五、小结
这一章我们聊了 TouchGFX 是什么、它的三层架构、跟硬件的关系,以及渲染机制。核心就一句话:TouchGFX 是个好框架,但硬件适配做不好,它就跑不起来。
后面的章节,我们会一步步深入 HAL 层的每个接口,从 LCD 驱动到触摸驱动,再到 DMA2D 加速。嗯,到时候你会发现自己写的代码真的能让屏幕「动起来」——那种感觉,挺爽的。