硬汉嵌入式论坛

 找回密码
 立即注册
查看: 6981|回复: 7
收起左侧

[TouchGFX] RT-Thread 移植 TouchGFX 成功额

  [复制链接]

58

主题

267

回帖

446

积分

高级会员

积分
446
发表于 2019-11-13 16:39:55 | 显示全部楼层 |阅读模式
本帖最后由 ihavedone 于 2019-11-19 11:31 编辑

本文档以STM32F429单片机为例,说明如何在RT-Thread上移植TouchGFX
需要用到CubeMX工具,暂只适用于STM系列带LTDCFMC的单片机。
1.  准备工作
这部分为准备工作,不详述。
1、            下载 RT-Thread和ENV。
2、            会使用ENV。
3、            会编辑KConfig文件和修改SConscript文件。
4、            会使用MDK、IAR等IDE环境。
5、            会使用CubeMX。
6、            会使用TouchGFX Designer。

2.  新建工程BSP

2.1.  根据所选单片机型号,从样板本复制BSP文件夹到stm32下,并改名。
1.png
2.png
2.2.  修改工程模板设置
打开工程模板(我使用的为MDK5),选择单片机型号,根据需要设置编译连接等参数。后面使用scons命令生成工程时,将采用该模板中的参数。
3.  CubeMX工程

3.1.  删除board/CubeMX_Config中的所有文件
3.png
3.2.  新建CubeMX工程保存到board/CubeMX_Config

3.2.1.   选择单片机型号为STM32F429IGTx


3.2.2.   设置调试方式和基础时钟
因为TouchGFX必须开启FreeRTOS,所以基础时钟选择定时器。这一步只是为了CubeMX工程无错误,后续并未使用。
4.png
3.2.3.   配置RCC
5.png
3.2.4.   开启定时器
随便开一个定时器,后续TouchGFX使用,不需要配置参数。
6.png
3.2.5.   开启串口
开启一个串口,用于RT-Thread shell功能。只需要开启串口,不需要其他任何配置,不要开中断和DMA。
7.png
3.2.6.   配置FMC
FMC存在复用引脚,根据实际情况调整GPIO(我这里不需要调整)。设置的参数值需要根据所使用的SDRAM进行调整。
8.png
3.2.7.   配置DMA2D
9.png
10.png
3.2.8.   配置LTDC
LTDC配置参数需要根据实际所使用的屏幕进行设置(我使用的为RGB565屏幕),具体各参数的意义此处不做详述,请参考其他使用文档。
Layer配置为1层。
需要开启LTDC global中断。
根据需要调整GPIO复用功能。
设置所有GPIO速度为very high。
11.png
12.png
13.png
14.png
3.2.9.   开启CRC
15.png
3.2.10.            配置FreeRTOS
选择CMSIS_V1,修改default任务的堆栈大小为1024。后续并不使用FreeRTOS,此处修改堆栈是后面验证阶段需要用,默认的128不够,多大刚好够不清楚,反正经尝试1024够。
16.png
17.png
3.2.11.            配置TouchGFX
开了多个硬件定时器的情况下,注意选择前面为TouchGFX分配的定时器(我这里只开启了一个定时器,默认选中)。
18.png
设置TouchGFXDesigner路径和屏幕尺寸参数。Execute按钮暂时为灰色,先不管。
19.png
下面这个界面我还没搞明白怎么用,不管它也能用。个人猜测为外部FLASH的控制相关引脚设置,当图片比较多的时候,会存储到外部FLASH。此处仅实现功能移植,暂不考虑。如果有知道怎么用的,也还请指教一下。
20.png
3.2.12.            时钟配置
21.png
3.2.13.            工程配置
红框处选base,否则board下的Sconscript将不能正常工作,除非你知道怎么修改Sconscript文件。
工程路径一定要在board文件夹下,工程名称不能错。
22.png
3.2.14.            生成代码
生成代码会弹出一个框,原因为上面TouchGFX配置的最后一步没有设置完。直接点Yes忽略。
代码生成后不要打开工程,直接点Close关闭提示框。
23.png
24.png
3.2.15.            打开TouchGFX Designer
回到前面的TouchGFX配置界面,现在Execute按钮为可用状态,点击打开TouchGFX designer。
编辑界面后,点右上角的生成代码,等左下角出现完成信息。
注意:如果要再修改CubeMX设置,需要先关闭TouchGFX Designer,否则CubeMX将无响应,看起来像是死机了。
25.png
26.png
3.2.16.            验证CubeMX功能
关闭TouchGFX Designer,重新生成代码,点打开工程进行编译和下载运行。看是否正常显示。
编译时我遇到了错误,原因为默认添加的触摸屏驱动,跟实际情况不符。可以先不用触摸屏,直接屏蔽。
27.png
28.png
29.png
4.  文件修改4.1.  新建board/port文件夹
新建文件夹,且新建文件sdram_port.h保存于文件夹中。后续SDRAM配置会用到。文件内容如下。
注意红框所示内容,SDRAM_BANK_ADDR为外部堆的首地址,用于系统动态分陪。我的SDRAM为32M,但TouchGFX地址设置为0xC0000000,所以SDRAM的首地址不能与TouchGFX冲突。SDRAM_SIZE为外部栈的大小,将SDRAM前16M用于TouchGFX,所以大小应当为16M(0x1000000)。
其余参数为SDRAM时序参数,与具体器件有关。
30.png
4.2.  创建操作系统接口文件
在目录board/CubeMX_Config/Src 中创建文件OSWrappers_rtthread.cpp,内容如下:
31.png
4.3.  新建touchgfx_entry.cpp文件
此文件用于初始化TouchGFX,并创建一个任务运行TouchGFX。内容如下:
32.png

4.4.  编辑board/KConfig
添加如下三部分代码(注意不能开启BSP_USING_LCD,开启该条件后,会自动添加drv_lcd.c到工程,会与TouchGFX的内容相冲突):
33.png
4.5.  编辑board/SConscript
1、        路径添加port文件夹。
2、        将文件中所有的407改成429。
3、        添加最后一个红框里的内容。
34.png
4.6.  创建board/CubeMX_Config/SConscript
创建以下文件,用于添加TouchGFX相关内容到工程。
35.png
4.7.  复制系统时钟初始化函数
将 /board/CubeMX_Config/Src/main.cpp 中的 SystemClock_Config函数复制并替换 /board/board.c中的同名函数。
修改/board/board.h中的参数为实际值。
36.png
37.png
4.8.  修改链接文件
/board/linker_scripts/link.sct修改如下。根据不同单片机的flash和ram大小进行正确配置。
38.png
4.9.  修改main.h
Board/CubeMX_Config/Inc/main.h中,void Error_Handler(void)函数的定义与RT-Thread中同名函数定义有冲突,做如下修改。
注意:在使用CubeMX修改配置并重新生成代码后,该文件需要重新修改。
39.png

5.  Menuconfig进行系统配置5.1.  开启SDRAM栈管理
RT-Thread Kernel-> Memory Management进行如下配置。这两个配置会将SDRAM通过RT-Thread管理起来,可动态分配SDRAM中的内存。
40.png
41.png
5.2.  开启硬件定时器
开启硬件定时器模块,TouchGFX需要用到。不开启该模块将不会添加定时器相关的HAL库文件,编译会报错。
42.png
5.3.  开启TouchGFX
在Hardware Dervers Config中开启TouchGFX。开启后 Onboard Peripheral Dervers->Enable SDRAM将自动开启。
43.png
6.  生成工程
在ENV中通过 scons –target=mdk5–s命令生成工程,并打开。编译下载即可正常运行。
注意:在TouchGFX Designer修改界面后,最好是重新生成一次工程。(增删了界面,使用和修改了图片都会生成新文件或删除旧文件,这时候就需要重新生成工程,其他时候不需要。为保险起见,建议修改了界面后重新生成一次。)
44.png
7.  编译并下载运行
45.png
8.  遗留问题
1、        没有用到外部SPI Flash,目前图片都存在内部flash。还不知道怎么将资源自动下载到外部flash中。据说是要个加载文件,有知道的同志能写个教程就最好了。
2、        暂时没有加触摸驱动,这个简单。。
3、        上面每次CubeMX重新生成代码就要改一次main.h,要是能在SConscript中自动实现就最好了。继续研究下,应该能实现,只是对应的Python代码不晓得。


// 2019.11.19 附件上传不了,贴上程序包链接
// 必须解压缩到 rt-thread/bsp/stm32下,否则不能正确执行env。




评分

参与人数 1金币 +100 收起 理由
eric2013 + 100 很给力!

查看全部评分

回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
107027
QQ
发表于 2019-11-13 16:48:58 | 显示全部楼层
cool,非常详细
回复

使用道具 举报

5

主题

26

回帖

41

积分

新手上路

积分
41
发表于 2019-11-15 08:59:12 | 显示全部楼层
太强了,学习一下。
回复

使用道具 举报

7

主题

125

回帖

146

积分

初级会员

积分
146
发表于 2019-11-15 09:29:24 | 显示全部楼层
我们用469,有QSPI接口,自己写external loader下载图片资源到Nor Flash里
你可以自己写个loader来加在外部flash数据,参考cubeprog下的工程
STM32CubeProgrammer\bin\ExternalLoader\N25Q256A_STM32L476G-EVAL_Cube\Projects\STM32L476G_EVAL\Examples\QSPI\N25Q256A_STM32L476G-EVAL
回复

使用道具 举报

1

主题

6

回帖

9

积分

新手上路

积分
9
发表于 2019-11-19 20:59:03 | 显示全部楼层
很好的资料存着
回复

使用道具 举报

1

主题

1

回帖

4

积分

新手上路

积分
4
发表于 2019-11-29 10:09:08 | 显示全部楼层
朋友,我的touch移植完一放置图片DMA不就刷新了,放Touch自带的控件就可以,麻烦赐教谢谢
回复

使用道具 举报

58

主题

267

回帖

446

积分

高级会员

积分
446
 楼主| 发表于 2019-12-6 09:45:39 | 显示全部楼层
ZSS 发表于 2019-11-29 10:09
朋友,我的touch移植完一放置图片DMA不就刷新了,放Touch自带的控件就可以,麻烦赐教谢谢

你好,我这边用的是F429IG,显示一张800*480的16位图是可以的。
但要注意的是,我的移植里没有做外部FLASH烧写算法,图片存在内部FLASH,所以图片不能太大,800*480 16位图的话需要750K。
你看看是不是这里的问题。
回复

使用道具 举报

0

主题

2

回帖

2

积分

新手上路

积分
2
发表于 2020-1-9 16:05:07 | 显示全部楼层
你好,touchgfx_entry.cpp打开都是乱码,能否贴一下程序,截图看不清,谢谢 TIM截图20200109160209.png
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2024-5-14 13:06 , Processed in 0.316385 second(s), 32 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

快速回复 返回顶部 返回列表