编译& 烧录
本节描述如何完成从TouchGFX应用程序代码到程序执行这一过程,即如何在特定的设置中进行编译和烧录。
编译TouchGFX应用程序
当编译一个TouchGFX应用程序时,有两个选项:面向PC模拟器进行编译,或面向目标硬件进行编译。
面向PC模拟器进行编译
面向PC模拟器编译项目时有两个选项:GCC和Visual Studio。
这两个选项始终可用,因为它们是由TouchGFX Designer生成的。
GCC
Makefile的位置<touchgfx_application_root_folder>/simulator/gcc/Makefile
TouchGFX包含一个MinGW环境,该环境预装了一个GCC编译器和GNU Make,可以轻松执行面向PC模拟器生成的Makefile。
TouchGFX Environment可以从C:/TouchGFX/4.18.0/env/MinGW/msys/1.0/msys.bat
启动,或者从添加到Windows启动菜单的快捷方式(名为“TouchGFX x.y.z Environment”,其中x、y和z描述版本号)启动。
在启动TouchGFX Environment并导航到TouchGFX Application根文件夹后,可以执行下面的简单命令以生成一个simulator.exe文件。
make -f simulator/gcc/Makefile
然后可以使用以下命令从TouchGFX Environment启动模拟器可执行文件。
./build/bin/simulator.exe
也可以从TouchGFX Designer编译和启动PC模拟器,方法是使用Run Simulator命令。
Visual Studio
要使用Visual Studio编译PC Simulator,只需使用Visual Studio打开位于<touchgfx_application_root_folder>/simulator/msvs/Application.sln
的已生成解决方案文件。
可以直接从Visual Studio启动PC 模拟器,启用代码调试。
Note
面向目标硬件进行编译
对于基于TouchGFX板卡设置的应用程序来说,面向STM32评估套件进行项目编译是非常简单的。
每个TouchGFX板卡设置包含面向GCC、STM32CubeIDE、IAR和Keil的项目文件:
- GCC:
<project_root_folder>/gcc/MakeFile
- STM32CubeIDE:
<project_root_folder>/STM32CubeIDE/.cproject
- IAR:
<project_root_folder>/EWARM/Project.eww
- Keil:
<project_root_folder>/MDK-ARM/<STM32_evaluation_kit_name>.uvprojx
STM32CubeMX默认设置的活动工具链为STM32CubeIDE。 请注意!所有项目文件不会同时出现。 生成的项目文件取决于在STM32CubeMX中选择的工具链
TouchGFX包含一个MinGW环境,该环境预装了面向Arm 和GNU Make的GNU嵌入式工具链,可以轻松执行所包含的面向目标硬件的Makefile。
TouchGFX Environment可以从C:/TouchGFX/4.18.0/env/MinGW/msys/1.0/msys.bat
启动,或者从添加到Windows启动菜单的快捷方式“TouchGFX x.y.z Environment”启动
在启动TouchGFX Environment并导航到项目根文件夹后,可以执行下面的简单命令,面向目标硬件进行项目编译。
make -f gcc/Makefile
Note
烧录STM32评估套件
因为项目基于预先完成的TouchGFX板卡设置,将项目烧录到STM32评估套件是非常轻松的。
每个项目在构建之后都会生成一个二进制文件,该文件可以通过ST Link Utility或STM32CubeProgrammer刷写。
因此,必须安装这些工具,才能进行烧录。
建议将这些工具安装到默认位置。
- ST Link Utility默认安装位置:
C:/Program Files (x86)/STMicroelectronics/STM32 ST-LINK Utility/ST-LINK Utility
- STM32CubeProgrammer默认安装位置:
C:/Program Files/STMicroelectronics/STM32Cube/STM32CubeProgrammer
Note
GCC与TouchGFX Designer
Makefile(包含在位于<project_root_folder>/gcc/MakeFile
的TouchGFX板件设置中)内置一条刷写命令(如下所示),使用ST Link Utility或STM32CubeProgrammer(取决于TBS)来刷写 STM32评估套件。
您可以使用与TouchGFX设计器相同的指令从命令行开始刷写:
make -f gcc/Makefile flash
也可以使用桌面版刷写工具,通过生成的.hex文件烧录板卡。 .hex文件位于 <project_root_folder>/TouchGFX/build/bin/target.hex
中
仅烧录内部flash
许多开发板和产品都使用两个FLASH。 微控制器的内部flash和外部flash。 通常,内部flash包含代码和小/常用数据,而外部flash包含图像、视频和字体等大数据项。
许多情况下,您需要同时对两个闪存进行刷写,因为内部flash中的程序包含指向外部flash中数据的地址。 但在某些情况下,可在不刷写外部flash的情况下执行刷写内部flash,例如,当您对应用程序代码进行了小修改(如:更改盒子的颜色或位置)时。 这种情况下,外部flash中的所有数据均未修改,无需再次刷写。 如果您有大量的图片,这样可以大大减少刷写时间。
但是,您需要确保自从上次写入外部flash以来,外部flash的内容没有改变。 如果外部flash的内容已经改变,而又不重新刷写,您会看到奇怪的行为。 在这种情况下,需要同时烧录内部和外部flash。
make -f gcc/Makefile intflash
内部flash的.hex文件位于:<project_root_folder>/TouchGFX/build/bin/intflash.hex
。
链接器脚本
intflash make目标首先编译并链接应用程序。 然后烧录intflash.hex
文件。 链接步骤后,通过从应用程序elf
文件中删除ExternalFlashSection
、TextFlashSection
和FontFlashSection
部分生成该文件。 通过以下命令实现此操作:
arm-none-eabi-objcopy -O ihex --remove-section=ExtFlashSection --remove-section=FontFlashSection --remove-section=TextFlashSection target.elf intflash.hex
该指令的结果为十六进制文件,只包含位于内部flash中的数据。 只有当链接器脚本将上述三个部分放入外部flash中时,方才有效。 TouchGFX板设置的gcc链接器脚本通常如下所示:
... /* Details skipped */
MEMORY
{
RAM (xrw) : ORIGIN = 0x20000000, LENGTH = 320K
FLASH (rx) : ORIGIN = 0x8000000, LENGTH = 1024K
QUADSPI (r) : ORIGIN = 0x90000000, LENGTH = 16M
SDRAM (xrw) : ORIGIN = 0xC0000000, LENGTH = 8M
}
SECTIONS
{
... /* Sections for RAM, Flash, SDRAM */
ExtFlashSection :
{
*(ExtFlashSection ExtFlashSection.*)
*(.gnu.linkonce.r.*)
. = ALIGN(0x4);
} >QUADSPI
FontFlashSection :
{
*(FontFlashSection FontFlashSection.*)
*(.gnu.linkonce.r.*)
. = ALIGN(0x4);
} >QUADSPI
TextFlashSection :
{
*(TextFlashSection TextFlashSection.*)
*(.gnu.linkonce.r.*)
. = ALIGN(0x4);
} >QUADSPI
}
链接器脚本首先定义了四个内存区域: RAM
、 FLASH
、QUADSPI
和 SDRAM
. QUADSPI
区域为外部flash。 ExtFlashSection
、FontFlashSection
和TextflashSections
这三个部分链接至QUADSPI
区域。 QUADSPI
区域中无其他内容。 这就是我们可以通过删除target.elf
文件中这三个部分为内部flash生成一个十六进制文件的原因,该文件包含所有内容。 如果链接器脚本还将其他数据放入外部flash中,则需删除该数据,以便只使用内部flash内容。
如果您使用其他makefile或编译器构建目标elf
文件,则可以重复使用上述技巧为内部flash创建十六进制文件,并从TouchGFX设计器或指令行对其进行刷写。
TouchGFX设计器配置
TouchGFX板设置为TouchGFX-设计器提供配置,使其能够通过运行目标指令烧录项目。 被TouchGFX Designer用于进行烧录的命令可以在TouchGFX Designer中配置视图的构建部分看见并覆盖。
STM32CubeIDE
TouchGFX板卡设置使用STM32CubeIDE输出的.elf文件支持通过STM32CubeProgrammer对用STM32CubeIDE编译的项目进行烧录。
.elf文件位于<project_root_folder>/STM32CubeIDE/Debug/<STM32_evaluation_kit_name>.elf
e.g. C:/TouchGFXProjects/MyApplication/STM32CubeIDE/Debug/STM32F746G_DISCO.elf
IAR
TouchGFX板卡设置使用IAR输出的.hex文件支持通过STM32CubeProgrammer对用IAR编译的项目进行烧录。
.hex文件位于<project_root_folder>/EWARM/<STM32_evaluation_kit_name>/Exe/<STM32_evaluation_kit_name>.hex
例如,C:/TouchGFXProjects/MyApplication/EWARM/STM32F469I-DISCO/STM32F469I-DISCO.hex
Keil
TouchGFX板卡设置使用Keil输出的.hex文件支持通过STM32CubeProgrammer对用Keil编译的项目进行烧录。
.hex文件位于<project_root_folder>/MDK-ARM/<STM32_evaluation_kit_name>/<STM32_evaluation_kit_name>.hex
e.g. C:/TouchGFXProjects/MyApplication/MDK-ARM/STM32F469I-DISCO/STM32F469I-DISCO.hex
烧录自定义硬件
如果需要刷写的是自定义硬件,而不是STM32评估套件这样的预定义硬件设置,则仍然可以使用STM32CubeProgrammer。 STM32CubeProgrammer不一定带有针对你的特定外部存储器的flash加载机制。 然而,可以创建一个自定义的flash loader。 参阅关于如何为外部存储器开发自定义加载器的用户手册可了解更多信息。