☰
ART-Pi TouchGFX工程包从解压到真机显示:完整避坑指南
2026/10/19 19:22:14 网站建设 项目流程

简介:面向ART-Pi与TouchGFX开发者的文件系统读图示例资源包,适合嵌入式图形界面工程师、RT-Thread系统学习者以及需要降低固件图片存储占用的人群。工程演示了TouchGFX在运行时从文件系统读取并显示图片的方法,与图片直接编译进固件的传统方式形成对比,可帮助理解图形界面图片动态加载机制及文件系统交互流程。包内共3767个文件,以C/C++源码、头文件与构建脚本为主,另有网页文档、PNG格式图片资源和TouchGFX核心静态库,整体约87.79MB。通过此工程包可掌握文件系统挂载与图片路径配置思路,了解TouchGFX核心静态库的链接与配置方式,并能基于现成工程二次开发,节省搭建时间。目前已有683人学习下载,适合正在基于ART-Pi开发板进行图形界面开发并希望实现图片动态加载的中高级开发者。 我最近整理资料时又翻出了这个 art_pi_touchgfx.zip,看到它的第一眼就想起当初下载时的经历:一个看似普通的压缩包,后面藏着TouchGFX工程的版本问题、zip的编码问题、还有一连串解压和导入的坑。art_pi_touchgfx这个名字拆开看很直白——ART-Pi开发板上的TouchGFX工程,被打成一个zip包分发。ART-Pi是RT-Thread主推的DIY物联网开发板,主控是STM32H750,板载RGB LCD和SDRAM,而TouchGFX是ST官方的GUI框架,二者结合可以在资源有限的MCU上做出流畅触摸界面。这篇文章适合刚拿到ART-Pi、准备跑TouchGFX demo,以及已经被“导入失败”“invalid zip archive: could not find eocd”这类问题卡住的开发者,我会从压缩包本身一路讲到真机显示,尽量把中间每一步的坑都摊开。

1. 为什么一个zip压缩包会让ART-Pi和TouchGFX绑在一起

1.1 ART-Pi这块板子,和TouchGFX的缘分是哪来的

ART-Pi的硬件核心是STM32H750VBT6,Cortex-M7内核,主频最高跑480MHz,外设接口相当齐全。更关键的是,它把RGB LCD接口、SDRAM、I2C触摸接口都直接设计在板上了,这正好是TouchGFX能运行的底气。TouchGFX的渲染机制需要一块足够大的帧缓冲,H750内部SRAM显然不够支撑一个分辨率尚可的界面,必须外挂SDRAM。ART-Pi版载的8MB SDRAM拿来做480x272或800x480的RGB565帧缓冲,富余量很充足,屏幕上还能做双缓冲来防撕裂。

ST收购TouchGFX之后,它就成了STM32生态里官方主推的GUI方案,和CubeMX、STM32CubeIDE深度集成,还有TouchGFX Designer这个可视化编辑器。ART-Pi社区里很多人拿它做界面原型,因为开发效率确实高——拖控件、换素材、定时器动画自动生成代码,比纯手写渲染逻辑要省不少功夫。当然LVGL也有自己的优势:轻量、开源、控件生态大,但TouchGFX在像素级渲染性能上更狠,尤其是配合ST自家的DMA2D图形加速器,刷屏效果很丝滑。所以art_pi_touchgfx.zip这种包的出现并不奇怪,它就是把在ART-Pi上验证过的TouchGFX工程,连同资源、代码一起压缩成分发包,方便别人直接拉起来跑。

1.2 压缩包里应该有的文件,以及它们的用途

我这类工程包见得多了,拿到手就应该先看目录结构,而不是急着解压完就双击打开。一个完整的ART-Pi TouchGFX工程包里,核心文件长这样:

  • 根目录下的project.touchgfx,这是TouchGFX Designer的工程文件,GUI所有配置、控件树、素材引用都在里面。
  • assets/目录,专门放图片、字体、文本和音频等原始素材,Designer处理后会把这些素材转成可编译的代码。
  • generated/目录,Designer根据工程配置自动生成的代码,里面包含模拟器部分和STM32平台部分,这个目录在每次点Generate按钮后都会被重写。
  • Target/目录,这是用户代码区,触摸驱动、LCD初始化、硬件相关的main函数都在这里,Designer不会覆盖它。
  • 与RT-Thread集成时,根目录或相关子目录里必须出现SConscript、rtconfig.h之类的RT-Thread构建文件,还有板级BSP的链接脚本。

如果下载的包里缺少assets/或generated/,那这个包基本废了一半,因为Designer打开工程后找不到素材,会满屏红叉。还有一次我收到一个包,发现里面只有Target/但没有generated/,显然是分享者把工程在Designer里Clean过再打包,导致自动生成代码缺失。遇到这种情况,别傻乎乎想办法重建所有生成代码,先找分享者要完整包,或者让他重新Generate一次再打包。

2. 解压art_pi_touchgfx.zip:先解决“could not find eocd”和乱码

2.1 “找不到EOCD”到底意味着什么

我搜到很多人在解压或导入时遇到invalid zip archive: could not find eocd的报错。这个EOCD的全称是End of Central Directory,翻译过来就是“中央目录结束记录”,它在zip文件的最末尾。zip格式设计上有个特点:文件中央目录并不在开头,而是在文件尾部,解压工具必须先从末尾读到EOCD,才能反向定位到中央目录,然后再找到各个压缩条目。如果EOCD丢了,整个zip的索引就断了,解压工具当然无从下手。

EOCD丢失最直接的原因是文件被截断。这种情况在以下场景里特别常见:网盘下载中途断开、微信或邮件附件传输被服务端限流、浏览器下载时磁盘满了导致临时文件不完整。还有一个隐蔽原因是,某些下载工具在文件后缀上做文章,比如自动改名为.zip但实际下载的是不完整的临时文件。另外,老式FTP工具以ASCII模式传输二进制zip包时,也会把0x0A和0x0D做转换,导致文件字节层面被污染,尾部EOCD也可能被改坏。

遇到这个报错,第一步不是修复,而是重新下载。我都会先看本地文件大小和分享者标注的大小是否一致,不一致就不用浪费时间了。下载完强烈建议做一次哈希校验:Windows下用certutil -hashfile art_pi_touchgfx.zip MD5,Linux下用md5sum,如果分享者提供了SHA256,就优先对SHA256。拿到手先校验而不是先解压,这个习惯能帮你省下大量排错时间。

注意:如果压缩包是在Windows上用老工具制作的,而你在Linux或macOS下解压,还可能遇到编码问题,这个和EOCD无关,是文件名编码导致的,接着往下看。

2.2 文件名乱码、分卷缺失、密码保护的处理

“解压后文件名乱码”在zip使用中几乎绕不开。zip格式本身没有统一规定文件名必须用什么编码,早期Windows中文环境下的压缩工具习惯用GBK,而后来的工具(包括7-Zip、WinRAR新版本、macOS自带解压)默认用UTF-8。如果一个zip包用GBK编码文件名,放到默认按UTF-8解压的工具里,就会出现中文、韩文、日文文件名全部乱码的情况,严重时连文件都无法正常打开。

解法很简单:换用Bandizip或7-Zip。在Bandizip的设置里打开“自动检测编码”,大多数历史遗留包都能正确还原。如果遇到工具自动检测也识别不出来的情况,可以手动指定代码页。7-Zip命令行里可以用7z x 文件名.zip -scs:GBK但这种指定解压时字符集的做法,实际效果取决于压缩包是否包含编码标识,不一定百分百奏效。所以我的原则是:乱码能靠工具解决就解决,解决不了就直接解压后手动重命名,比如包内就5个文件,重命名比折腾工具更省时间。

分卷包的问题我也被问过很多次。“必须有下列压缩分卷z01”意思是这个zip不是完整独立压缩包,而是分卷压缩的一部分。分卷包的典型后缀是.z01、.z02加最后一个.zip,必须把所有分卷放在同一个目录,且文件名保持原名,才能正确解压。一个容易忽略的点:从某些海外网盘下载分卷时,浏览器会自动给重名文件添加(1)后缀,这会导致解压工具找不到z01分卷,需要手动去掉后缀。

至于“zip密码移除”“zip密码恢复”这类需求,我只想说:合法场景下,密码遗忘后可以去自己的密码管理器里找(KeePass、Bitwarden都行),或者通过备份的恢复码重置;网上那些声称能“移除密码”的工具,普遍是暴力破解程序,跑起来吃满CPU不说,还经常带恶意软件。更重要的是,破解他人压缩包可能踩法律红线,这条线我建议大家都踩都不要踩。

3. TouchGFX工程导入失败的原因和整套排查链路

3.1 Designer导入资源包的报错现场

TouchGFX Designer里有一个资源包的概念,比如从官方下载的字体包、模板包或者外设资源包,都是一些zip压缩文件。Designer在导入这些资源包时,会先把zip解压到本地缓存,然后校验内容格式。如果包本身损坏、下载不完整,或者Designer在解压时发现内部结构不对,就会在界面上弹出“导入失败 caused by: invalid zip archive: could not find eocd”。这个报错出现时,一半是资源包文件的问题,另一半是Designer的本地缓存出了问题——比如你之前导过一次失败,残留在缓存里的半截文件被Designer再次引用。

还有一种情况是:用户把project.touchgfx工程文件直接拖进Designer,而Designer尝试后台下载对应版本的组件或字体,结果网络中断、HTTP缓存不完整,最终报出同样的zip错误。表面看是工程导入失败,实际是下载行为失败。

3.2 排查步骤:从校验包到重建工程

我在现场处理这种报错有一套固定的排查顺序,这里完整写出来:

  1. 先定位报错触发点:是操作设计器导入资源包时弹错,还是启动Designer加载工程时弹错?触发点不同,排查方向就不一样。
  2. 找到Designer的缓存目录,通常在用户文档目录下,比如文档/TouchGFX/下的缓存或缓存子目录。把报错对应的zip文件找出来,看文件大小、用7-Zip手动打开。如果7-Zip也提示包损坏,那就是下载源的锅:删掉这个缓存,重新下载、校验、再导入。
  3. 如果7-Zip能正常打开,但Designer还是报错,那大概率是包格式版本过老或过新。TouchGFX Designer 4.21版本打开太老或太新的资源包时,可能会因为组件格式不兼容而报错,这时需要去官网找对应的兼容版本。
  4. 如果工程本身打开失败,但资源包没问题,就试试备份project.touchgfx和generated/,然后在Designer里新建一个工程,把assets/目录复制过去,重新生成代码。
  5. 最后的手段是把Target/下自己的源码移植过去,绕开坏掉的工程文件。这个办法土,但往往能救急。

我自己踩过最深的坑是第二种:当时用的设计器版本是4.20,而同学发我的工程是4.22版本保存的,他打包时也没有清理掉自己本地的老缓存,于是我这边解压出的资源文件结构对不上,Designer一直报“eocd”错误。最后他重新Generate并打包,问题才彻底消失。所以如果你在GitHub或社区下载这类zip,先看设计器版本和工程版本是否一致,能省掉一大半问题。

3.3 环境兼容:和RT-Thread Studio/MDK的配合

TouchGFX生成的代码风格是ST原生的一套,跟RT-Thread Studio的构建体系是两套逻辑,不是说解压后双击RT-Thread Studio工程就能直接编译的。常见做法有两种:一是把TouchGFX生成的代码作为一个组件,集成到RT-Thread工程的SConscript里,手动维护源文件列表和头文件路径;二是先用TouchGFX Designer生成基于STM32CubeIDE的工程,再用CubeMX把生成的HAL配置统一管理,RT-Thread这边只把应用层框架接进去。

我建议初学者优先走RT-Thread Studio集成这条路,因为ART-Pi的BSP本身已经很完善,LCD、触摸、SDRAM驱动都有人做过了,你只需要专注于TouchGFX层。要注意的是:RT-Thread Studio生成的工程里,HAL库版本和TouchGFX Designer依赖的HAL库版本有时不同步,比如H750的stm32h7xx_hal_conf.h配置里没有开启LTDC和DMA2D模块,那么编译TouchGFX驱动时就会报一堆未定义类型。排查方法很简单:编译报错里凡是出现LTDC_HandleTypeDef未定义、DMA2D_HandleTypeDef未定义,先去检查HAL配置头文件,而不是去改TouchGFX源码。

4. 字体图标:TouchGFX支持,但不是“导个图标进去”这么简单

4.1 字体图标的工作原理

“touchgfx可以使用字体图标吗”这个问题我见得太多了,答案是能用,而且比我预想的好用。字体图标的本质是把图标做成了字体文件,每个图标对应一个Unicode码位,界面上显示一个“字符”,但这个字符的形状是图标的样子。这样做的优势很明显:图标缩放不模糊,颜色可以像文字一样自由设置,加载速度快,体积也比一套图标图片小。

TouchGFX的文本渲染组件本身就基于字体引擎,天然支持这种用法。这也是为什么TouchGFX官方推荐用字体图标来表示功能性的小图标,而不是切一张张PNG图片。我记得自己在ART-Pi上做过一个温湿度仪表盘界面,所有功能小图标(风扇、排水、Wi-Fi状态)全部用一个图标字体文件搞定,生成的flash占用比图片方案少了差不多一半。

4.2 把FontAwesome装进TouchGFX的完整流程

以FontAwesome为例,我把完整流程写一下:

  1. 去FontAwesome官网或者GitHub仓库下载fa-solid-900.ttf字体文件,注意最好是官方源,字体文件被人改过的话可能出现渲染异常。
  2. 把这字体文件放进工程的assets/fonts/目录。
  3. 打开TouchGFX Designer,在Typographies视图里新建一个文本样式,比如叫T_Icon,字体类型选择前面放进去的字体文件,设置好字号。
  4. 在“字符范围”设置里,勾选或手动输入需要的Unicode范围。FontAwesome图标大多集中在0xF000到0xF8FF这个段位,如果只是用其中几个图标,可以只填那几项,裁剪后的字体体积会小很多。
  5. 界面上拖一个Text控件,把它连接到T_Icon这个typography,在text属性里输入Unicode转义,比如\uF0C9就能显示一个特定图标。
  6. 生成代码并编译。运行时想动态改图标,代码里通过TypedText关联到T_Icon,再用Wildcard或setTypedText替换成另一个Unicode值即可。

这里有个关键细节:TouchGFX生成字体时,默认只给你“用到”的字符范围做裁剪,省flash空间。如果你要动态替换的某个图标代码位没有在范围设置里包含,生成后运行时它就是一个空白方框,而且不会自动补进去。所以做字体图标前,先把要用的所有图标码位列出来,在字符范围里统一添加。

4.3 中文字体回退:最容易踩的坑

在ART-Pi上做中文界面时,经典的坑又出现了:TouchGFX默认字体是英文字体,不含中文字形,显示中文全是方框。有人以为“把微软雅黑字体文件放进去就能显示中文”,这个方向没错,但还差一个关键配置——字体回退机制。

TouchGFX从4.x版本开始支持字体回退(Font Fallback),简单说就是:当当前字体里没有某个字符字形时,自动到备选字体里去找。配置方法是在Typographies里给主text样式添加一个fallback字体,把中文字体(比如思源黑体、阿里巴巴普惠体)设进去,并把字符范围设置为常用汉字区,比如0x4E00到0x9FFF。这部分设定之后,Designer生成的字体缓存才会把中文字形包含进去。

实操时还有个小坑:如果文本是动态生成的,比如从传感器读取的数值拼成字符串,那字符范围必须提前把可能出现的字符都覆盖进去,否则运行时那些动态字符照样是方框。我的建议是:动态文本的中文范围就统一用0x4E00-0x9FFF,虽然字库体积大一些,但至少不会现场丢字。如果flash空间实在吃紧,可以考虑精简字库,只收录界面里实际会用到的几百个汉字,把裁剪范围写死,这也是TouchGFX支持的做法。

5. 编译烧录和屏幕效果验证:从代码到真机

5.1 在RT-Thread Studio里构建TouchGFX工程

工程导入并配置好字体后,接下来就是编译。在RT-Thread Studio里构建TouchGFX工程,有几个地方必须盯紧:

第一,SConscript里必须包含TouchGFX的生成源码路径,尤其是generated/gui_generated和generated/images这几个目录,漏掉任何一个都会出现链接时“找不到符号”的错误。我通常会在SConscript里加上src += Glob('generated/**/*.cpp')之类的方式,把目录整体纳入。

第二,编译器优化级别建议用-O1或-Os。TouchGFX的渲染循环在-O2下偶尔会被编译器过度优化,出现浮点计算误差,导致界面元素位置对不齐或闪烁。有次我把优化级别改成-Ofast,结果图标颜色都乱了,查了大半天发现是编译器把某些关键循环的边界计算简化掉了,把这个坑写出来给大家提个醒。

第三,链接脚本里的内存布局。H750的Flash分区在ART-Pi上通常有bootloader,所以app的起始地址不是默认的0x08000000,而是偏后一段,比如0x08008000或自己项目定义的位置。如果烧录后板子反复重启或程序跑飞,先查链接脚本里的Flash偏移量对不对,别一上来就怀疑TouchGFX代码。

构建完成后,在RT-Thread Studio里可以直接下载,也可以用scons --target=mdk5生成MDK工程,拿到Keil里编译调试。两条路我都走过,MDK的调试器集成做得更顺手一些,断点查看TouchGFX内部渲染状态很方便;Studio则和RT-Thread内核的日志、shell命令配合更紧密,各取所需。

5.2 烧录运行后,屏幕和触摸的适配点

代码烧进去,屏幕上要是出了花屏、白屏、触摸不响应,先别慌,这些大都是硬件初始化或缓存一致性问题,按顺序排查:

  • 屏幕分辨率匹配:ART-Pi常见屏有4.3寸480x272和7寸800x480。LTDC的时序配置里,屏幕分辨率、像素时钟(Pixel Clock)要和屏规格一致,否则画面偏移或撕裂。比如7寸屏的hfp、hsync、vbp这类参数,一个数不对就会整体错位。
  • 颜色格式:RGB565和RGB888不匹配会直接花屏。TouchGFX生成的HAL配置里会指定帧缓冲格式,屏幕物理接口也得对应。我在一块RGB888接口的屏上跑过RGB565的TouchGFX,整屏颜色完全不对,改回888就正常了。
  • SDRAM和Cache:这是最容易踩的深坑。TouchGFX帧缓冲通常放在SDRAM中,如果SDRAM内存区域被配置成cacheable,CPU写入的数据还在Cache里,DMA2D或LCD控制器直接读SDRAM时就会读到旧数据,画面出现拖影、闪烁或“撕裂”。正规解法是在MPU配置里把帧缓冲所在SDRAM区域设为非cacheable,或者用SCB_CleanDCache手动刷新。ART-Pi的BSP里通常默认给SDRAM开了cache,接TouchGFX时一定要手动改这块MPU配置。
  • 触摸坐标方向:主板Layout和屏的接口方向可能导致触摸坐标和显示方向不一致。触摸点位和UI位置错位时,检查TouchGFX的HAL::setDisplayOrientation,把方向设置成ROTATION_90、ROTATION_180之类的值,直到双向都对上。

如果你跑到这一步,屏幕和触摸都正常了,那这个工程基本就通了。整个链路从 zip 包一路走到真机渲染,中间要过的关卡不少——压缩包本身缺损是第一个坎,压缩包内文件编码和分卷处理是第二个,TouchGFX导入和版本兼容是第三个,字体图标和中文字体是第四个,最后还有板级显示适配的第五个。我自己在这条路上断断续续踩过好几周的坑,现在把这些经验整理出来,希望后来人拿到 art_pi_touchgfx.zip 这类包时,能少走点弯路。

最后再分享一个小习惯:每次拿到新的TouchGFX工程包,第一件事就是先复制一份原始zip,然后在新目录里解压、校验、导入;要是哪个环节出了问题,原始包还在,重来一遍成本很低。别把原始包反复解压又打补丁,那样最后连自己都不知道改过什么,出问题只能从头再来。

本文还有配套的精品资源,点击获取

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询