本帖最后由 ihavedone 于 2019-11-19 11:31 编辑
本文档以STM32F429单片机为例,说明如何在RT-Thread上移植TouchGFX。 需要用到CubeMX工具,暂只适用于STM系列带LTDC和FMC的单片机。 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下,并改名。2.2. 修改工程模板设置打开工程模板(我使用的为MDK5),选择单片机型号,根据需要设置编译连接等参数。后面使用scons命令生成工程时,将采用该模板中的参数。 3. CubeMX工程
3.1. 删除board/CubeMX_Config中的所有文件3.2. 新建CubeMX工程保存到board/CubeMX_Config
3.2.1. 选择单片机型号为STM32F429IGTx
3.2.2. 设置调试方式和基础时钟因为TouchGFX必须开启FreeRTOS,所以基础时钟选择定时器。这一步只是为了CubeMX工程无错误,后续并未使用。 3.2.3. 配置RCC3.2.4. 开启定时器随便开一个定时器,后续TouchGFX使用,不需要配置参数。 3.2.5. 开启串口开启一个串口,用于RT-Thread shell功能。只需要开启串口,不需要其他任何配置,不要开中断和DMA。 3.2.6. 配置FMCFMC存在复用引脚,根据实际情况调整GPIO(我这里不需要调整)。设置的参数值需要根据所使用的SDRAM进行调整。 3.2.7. 配置DMA2D3.2.8. 配置LTDCLTDC配置参数需要根据实际所使用的屏幕进行设置(我使用的为RGB565屏幕),具体各参数的意义此处不做详述,请参考其他使用文档。 Layer配置为1层。 需要开启LTDC global中断。 根据需要调整GPIO复用功能。 设置所有GPIO速度为very high。 3.2.9. 开启CRC3.2.10. 配置FreeRTOS选择CMSIS_V1,修改default任务的堆栈大小为1024。后续并不使用FreeRTOS,此处修改堆栈是后面验证阶段需要用,默认的128不够,多大刚好够不清楚,反正经尝试1024够。 3.2.11. 配置TouchGFX开了多个硬件定时器的情况下,注意选择前面为TouchGFX分配的定时器(我这里只开启了一个定时器,默认选中)。 设置TouchGFXDesigner路径和屏幕尺寸参数。Execute按钮暂时为灰色,先不管。 下面这个界面我还没搞明白怎么用,不管它也能用。个人猜测为外部FLASH的控制相关引脚设置,当图片比较多的时候,会存储到外部FLASH。此处仅实现功能移植,暂不考虑。如果有知道怎么用的,也还请指教一下。 3.2.12. 时钟配置3.2.13. 工程配置红框处选base,否则board下的Sconscript将不能正常工作,除非你知道怎么修改Sconscript文件。 工程路径一定要在board文件夹下,工程名称不能错。 3.2.14. 生成代码生成代码会弹出一个框,原因为上面TouchGFX配置的最后一步没有设置完。直接点Yes忽略。 代码生成后不要打开工程,直接点Close关闭提示框。 3.2.15. 打开TouchGFX Designer回到前面的TouchGFX配置界面,现在Execute按钮为可用状态,点击打开TouchGFX designer。 编辑界面后,点右上角的生成代码,等左下角出现完成信息。 注意:如果要再修改CubeMX设置,需要先关闭TouchGFX Designer,否则CubeMX将无响应,看起来像是死机了。 3.2.16. 验证CubeMX功能关闭TouchGFX Designer,重新生成代码,点打开工程进行编译和下载运行。看是否正常显示。 编译时我遇到了错误,原因为默认添加的触摸屏驱动,跟实际情况不符。可以先不用触摸屏,直接屏蔽。 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时序参数,与具体器件有关。 4.2. 创建操作系统接口文件在目录board/CubeMX_Config/Src 中创建文件OSWrappers_rtthread.cpp,内容如下: 4.3. 新建touchgfx_entry.cpp文件此文件用于初始化TouchGFX,并创建一个任务运行TouchGFX。内容如下:
4.4. 编辑board/KConfig添加如下三部分代码(注意不能开启BSP_USING_LCD,开启该条件后,会自动添加drv_lcd.c到工程,会与TouchGFX的内容相冲突): 4.5. 编辑board/SConscript1、 路径添加port文件夹。 2、 将文件中所有的407改成429。 3、 添加最后一个红框里的内容。 4.6. 创建board/CubeMX_Config/SConscript创建以下文件,用于添加TouchGFX相关内容到工程。 4.7. 复制系统时钟初始化函数将 /board/CubeMX_Config/Src/main.cpp 中的 SystemClock_Config函数复制并替换 /board/board.c中的同名函数。 修改/board/board.h中的参数为实际值。 4.8. 修改链接文件/board/linker_scripts/link.sct修改如下。根据不同单片机的flash和ram大小进行正确配置。 4.9. 修改main.hBoard/CubeMX_Config/Inc/main.h中,void Error_Handler(void)函数的定义与RT-Thread中同名函数定义有冲突,做如下修改。 注意:在使用CubeMX修改配置并重新生成代码后,该文件需要重新修改。
5. Menuconfig进行系统配置5.1. 开启SDRAM栈管理RT-Thread Kernel-> Memory Management进行如下配置。这两个配置会将SDRAM通过RT-Thread管理起来,可动态分配SDRAM中的内存。 5.2. 开启硬件定时器开启硬件定时器模块,TouchGFX需要用到。不开启该模块将不会添加定时器相关的HAL库文件,编译会报错。 5.3. 开启TouchGFX在Hardware Dervers Config中开启TouchGFX。开启后 Onboard Peripheral Dervers->Enable SDRAM将自动开启。 6. 生成工程在ENV中通过 scons –target=mdk5–s命令生成工程,并打开。编译下载即可正常运行。 注意:在TouchGFX Designer修改界面后,最好是重新生成一次工程。(增删了界面,使用和修改了图片都会生成新文件或删除旧文件,这时候就需要重新生成工程,其他时候不需要。为保险起见,建议修改了界面后重新生成一次。) 7. 编译并下载运行8. 遗留问题1、 没有用到外部SPI Flash,目前图片都存在内部flash。还不知道怎么将资源自动下载到外部flash中。据说是要个加载文件,有知道的同志能写个教程就最好了。 2、 暂时没有加触摸驱动,这个简单。。 3、 上面每次CubeMX重新生成代码就要改一次main.h,要是能在SConscript中自动实现就最好了。继续研究下,应该能实现,只是对应的Python代码不晓得。
// 2019.11.19 附件上传不了,贴上程序包链接 // 必须解压缩到 rt-thread/bsp/stm32下,否则不能正确执行env。
|