TouchGFX超低配置移植教程

1.前言(一些废话)

  在正式讲解移植流程之前,笔者先简单的介绍一下TouchGFX。这里直接引用ST官网的介绍,TouchGFX是一款针对STM32微控制器进行了优化的免费高级图形软件框架。借助STM32图形功能和架构,TouchGFX可通过创建类似于智能手机的图形用户界面,来加快HMI-of-things技术革新。简单来说,TouchGFX是一个只能STM32使用的免费GUI框架,类似的框架还有LVGL、emWin等,用户可以借助它创建MCU都可以运行的精美界面。

  关于TouchGFX,笔者已经使用了一段时间,基本上都是运行在F7、H7系列的高性能MCU上并且配置了QSPI Flash SDRAM和RGB接口的LCD屏。这种配置对于MCU来说可以说是相当豪华,并且TouchGFX对于RGB接口屏的支持也非常棒,通过STM32CubeMX配置好相关参数生成代码,显示方面的驱动基本不需要用户修改,而且原生支持DMA2D。而且在笔者的印象中MCU运行GUI框架,对于MCU的性能,内部flash、RAM的大小都有一定的要求,当UI过于复杂时甚至需要外扩NOR-flash芯片、SDRAM芯片、SRAM芯片等用于放置显存和存储图片字体数据。笔者从未考虑过在性能较弱的MCU上部署GUI框架,直到ST官方展示了NUCLEO-G071RB配合X-NUCLEO-GFX01M1运行TouchGFX的案例。笔者这才了解到原来TouchGFX已经可以部署到性能如此孱弱的MCU上,而且效果相当不错,演示视频可以在ST官网观看,链接如下:低成本GUI解决方案 。笔者半个月前在贸泽下单的X-NUCLEO-GFX01M2模块也在最近一段时间到货,正好手头也有NUCLEO-G071RB的板子,通过TouchGFX Designer创建好模板工程后(TouchGFX Designer可以非常方便的创建官方带屏幕板子的模板工程),便以此工程和官方文档为参考,研究如何在自己的板子上运行同样配置的TouchGFX。

2.硬件配置

  笔者此次使用的是自己制作的核心板。主控型号为STM32F412RET6,主频100M Hz,片内flash大小为512KB,片内RAM大小为256KB,是一整块地址连续的RAM。屏幕使用的是笔者自己制作的电容触摸屏模块,屏幕使用的是浦洋家的这款屏,淘宝链接:https://item.taobao.com/item.htm?spm=a1z10.3-c-s.w4002-23459072829.15.cc6cafedyvNAMM&id=665897128566SPI接口的电容触摸屏,驱屏IC是常见的ST7789V 分辨率和X-NUCLEO-GFX01M1的屏一样都是240x320,电容触摸IC也是比较常见的FT系列的FT6336U。核心板上外扩了一个8MB Nor flash芯片W25Q64,用于存储字体和图片数据,通过SPI接口和MCU通信。X-NUCLEO-GFX01M1模组同样板载了一个8MB的SPI Flash,只不过型号没有W25QXX系列常见。本次移植并没有选择和官方方案同款芯片,主要原因是G071RBT6的片内RAM只有36KB,在使用Keil调试时无法同时加载两种下载算法,使用Keil Debug必须要同时加载两种下载算法。针对这种情况,官方提供了STM32CubeIDE和STM32CubeProgrammer专用的下载算法,STM32CubeProgrammer下载程序时不需要同时加载两种下载算法,至于STM32CubeIDE笔者暂时没有使用不太了解具体的情况。STM32F412RET6的片内RAM多达256KB就不存在上述问题,初次测试这种方案,能够正常使用Keil Debug还是非常重要的。

3.软件准备

  STM32CubeMX、TouchGFX Designer以及Keil没啥好说的,版本不要太低就行。笔者STM32CubeMX的版本为6.8.0,TouchGFX Designer的版本为4.21.1。最重要的是需要准备好移植平台SPI Flash的下载算法,笔者参考了这篇博客手把手系列--编写Keil MDK 外部FLASH下载算法_keil 下载算法_coder.mark的博客-CSDN博客 ,SPI接口的下载算法和QSPI接口的下载算法核心思路是一样的,把接口函数里面调用的函数替换成自己板子上的就行了。

  上图为笔者自己制作的下载算法,使用方法也很简单,先把这个.FLM文件粘贴到Keil存放下载算法的文件夹里,路径如下“\Keil_v5\ARM\Flash”,之后打开Keil下载器设置界面点击Add,就可以添加自己制作的下载算法了。这里需要注意Ram for Algorithm一栏中默认的Size是不够同时加载两种下载算法,需要增大Size,笔者通常增大到0XF000,这其实也是上文所提到的问题所在。

4.移植流程介绍

  啰嗦了那么多,接下来正式开始介绍移植的流程,STM32CubeMX+TouchGFX Designer的组合生成的代码相对还是比较完善的,移植时基本只需要按照官方文档和官方案例的工程提供接口函数即可。

4.1 工程模板的选取

  笔者选取了一个LCD屏能够正常工作并且是通过STM32CubeMX生成的工程作为此次移植的模板,因为使用的是官方同款方案,这里需要能够正常使用SPI+DMA的方式刷屏

  上图展示了模板工程的一些测试代码,笔者顺带测试了屏的触摸功能。

4.2 配置STM32CubeMX

  打开这个工程的STM32CubeMX,使用TouchGFX最基本的功能需要再配置两个外设。一是硬件CRC,TouchGFX是只有STM32才能使用的GUI框架,笔者猜测TouchGFX应该就是通过硬件CRC来检测移植的MCU是不是STM32。

  其次是开启一个频率为1K Hz的TIM,利用其溢出中断为TouchGFX提供时钟源,这里笔者选用了TIM7,这个没有PWM、输入捕获等功能的TIM,以节约硬件资源。

  配置好外设之后就可以开启TouchGFX框架了,一些低版本的STM32CubeMX的侧边栏中无法找到TouchGFX,需要通过Software Packs手动选取。点击Software Packs中的Select Components。

  找到X-CUBE-TOUCHGFX,展开之后像下图一样选中后点击OK,这样就可以在侧边栏看到TouchGFX的配置选项。

 

  打开TouchGFX配置栏,如下图所示配置TouchGFX的参数,这里的参数和官方NUCLEO-G070RB的参数相同

  如果使用的屏幕分辨率和笔者使用的不同,但是也是SPI接口,这里只需要根据屏幕的分辨率修改Width和Height即可。配置完成后,点击GENERATE CODE生成代码。由于启用了GUI,笔者推荐增大工程的堆栈大小,使用默认的堆栈大小可能存在一定的隐患。

4.3 生成TouchGFX相关代码

  如果直接打开刚刚通过STM32CubeMX生成的工程,编译是无法通过的。因为此时的代码并不完整,需要启动TouchGFX Designer生成代码。打开刚刚生成工程里面的TouchGFX Designer工程,其位于该工程的TouchGFX文件夹下。点击之后需要我们导入一个UI工程,这里选择Blank UI。

  当前只是测试TouchGFX是否正常,不需要引入过于复杂的UI,点击上方的菜单栏选中Box控件。

 

  将Box的大小修改为屏幕的尺寸并修改Box控件的颜色,这里随便挑一个不是白色和黑色并且比较显眼的颜色即可。

  点击Generate Code生成代码。

4.4 提供显示接口函数

  打开生成的工程,点击TouchGFXGeneratedHAL.cpp,其位于Application/User/ TouchGFX/target/generated一栏中,在该点cpp文件的开头就可以看到四个函数声明,前三个都是需要用户自己提供。

  下图为笔者提供的函数,简单的介绍一下这个三个函数touchgfxDisplayDriverTransmitActive函数是TouchGFX获取当前屏幕刷新状态的函数,返回值1表示屏幕正在刷新,返回值0标志屏幕已刷新完成。touchgfxDisplayDriverShouldTransferBlock函数,官方例程中是合LCD的TE引脚的状态使用,由于笔者使用的LCD屏模块并未引出TE引脚,因此只需要定义该函数的返回值为1即可。touchgfxDisplayDriverTransmitBlock函数为屏幕刷新的接口函数,用户需要在此函数中调用自己屏幕的刷屏函数。

 

  除了上述三个函数,还需要注意一个函数DisplayDriver_TransferCompleteCallback,用户需要在屏幕刷新完成时调用该函数。

4.5 为TouchGFX提供时钟源

  TouchGFX正常工作的前提条件是需要一个外部的时钟源,由于本例程使用的屏为SPI屏,STM32CubeMX中配置的时钟源选项默认为Custom,即需要用户自己为TouchGFX提供时钟源。TouchGFX相较于其他GUI框架一个非常有意思的点是其他GUI框架(例如emWin、LVGL)使用的时钟源都是和RTOS一样的以1ms为周期的时钟,而TouchGFX的时钟正常来说应该与屏幕实际刷新的帧率绑定。简单来说,假如MCU驱动屏的实际帧率为60帧,此时TouchGFX的时钟频率为60Hz。官方SPI屏和并口屏的标准方案是通过外部中断获取LCD屏的TE信号,并基于此为TouchGFX提供时钟源。由于本例程中使用的LCD屏并未引出TE信号引脚,笔者通过频率为1kHz的TIM(TIM7)为TouchGFX提供了一个频率约为60Hz的时钟,但是实际LCD的刷新帧率可能达不到60Hz,会存在一定的屏幕撕裂现象。本例程的时钟代码如下图所示。该函数在TIM7的溢出中断回调函数中被调用。

4.6 显示测试

  STM32CubeMX的生成的裸机工程中已经默认添加了TouchGFX的初始化代码和TouchGFX处理代码。在添加完上述用户自己提供的接口函数之后,就可以对工程进行编译并且下载到MCU。下载完成之后正常的现象为LCD屏全屏显示之前box控件的背景色。确认此步无误之后再开始接下来的步骤。

4.7 配置SPI Flash外设

  当UI过于复杂时,MCU片内的Flash容量一般很难满足需求,需要将图片以及字体等数据存储在外部的flash中,本例程使用了比较常用的SPI Flash芯片W25Q64JV,MCU通过SPI接口与其通信。再次打开STM32CubeMX,配置驱动W25Q64JV需要使用的SPI,笔者使用的板子为SPI3。

4.8 添加TouchGFX External Data Reader

  由于本例程中驱动的SPI Flash的接口为SPI接口而非QSPI接口,此时只能在非内存映射的情况下读写SPI Flash,因此需要启用TouchGFX的External Data Reader功能来读取其中的数据。例程的配置如下图所示。

其中External Data Reader: Memory base address中的地址与制作的下载算法中的地址有关,下载算法的制作具体请参考上文的链接。配置完成之后点击GENERATE CODE更新工程的代码,这里强调一下每次通过STM32CubeMX更新工程的代码时,最好也要打开TouchGFX Designer更新代码

4.9 在TouchGFX Designer中修改字体的存储格式

  上文提到本例程读写SPI Flash的方式为非内存映射,需要在TouchGFX Designer中修改字体的存储格式(默认的格式为内存映射),打开TouchGFX Designer,在Config菜单中点击Text Configuration,如下图所示勾上Unmapped storage format。然后点击Generate Code更新代码。

4.10 添加SPI Flash驱动和TouchGFX接口函数

  打开keil的工程,添加已经调试好的SPI Flash驱动。TouchGFX的External Data Reader的接口函数一共有三个,函数的声明位于TouchGFXGeneratedDataReader.cpp文件的开头,如下图所示。

DataReader_WaitForReceiveDone函数为阻塞式等待SPI Flash读取完成函数,DataReader_ReadData函数为使用轮询的方式读取SPI Flash数据,DataReader_StartDMAReadData函数为使用DMA的方式读取SPI Flash数据。例程中函数的定义如下图所示。

 

   DataReader_WaitForReceiveDone函数为空是因为轮询读取和DMA读取的驱动函数中已经做了阻塞式等待读取完成。

4.11添加触摸驱动和TouchGFX触摸接口函数

  本例程使用到了触摸屏,MCU与触摸IC的通信方式为软件IIC,因此不需要在STM32CubeMX中配置相应的外设。添加完调试好的触摸驱动之后,打开STM32TouchController.cpp文件,该文件包含了TouchGFX触摸接口函数。如下图所示添加触摸的初始化函数以及触摸坐标读取函数。

4.12 引入TouchGFX的Demo

  打开TouchGFX Designer,打开Edit菜单栏中的Import子菜单栏,选中GUI。

  之后会跳出一个弹窗,点击Save,进入导入外部TouchGFX项目的界面,此时可以导入用户自己的TouchGFX工程以及官方的demo和example。这里选择AIRCON REMOTE DEMO,点击Import导入,导入完成后点击Generate Code更新代码。

4.13 修改分散加载设置

  打开Keil工程,此时直接编译的话一定会报错,因为MCU内部的flash空间不足以存放图片、字体等数据,需要通过分散加载的方式将图片、字体等数据放入外部Flash。有关keil分散加载的介绍请自行搜索网上的教程。本例程使用的.sct文件如下图所示。

4.14 添加外部flash下载算法

  修改完分散加载设置之后,重新编译。编译完成之后在下载器设置中添加已经制作好的外部flash的下载算法。

  这里不是很推荐勾选Vertify,SPI Flash下载本来就非常的慢,下载完再进行校验过于浪费时间。

4.15 下载代码到目标板

  完成下载器的设置之后,就可以将代码下载到板子上因为使用的是SPI Flash,下载速度不是很快,需要耐心等待一段时间。笔者也曾试着将全速的CMSIS-DAP Link更换为高速的ST link V3,但是下载速率基本没啥变化。下载完成后,如果上述步骤均无误的话,就可以在LCD屏上看到非常华丽并且流畅的TouchGFX Demo界面了。

  • 8
    点赞
  • 37
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值