跳转到主要内容

将Keil编译器5项目转换为Keil编译器6

简介

STM32CubeMX并非对所有MCU都支持生成Keil编译器6/armclang项目。 若需在此类场景中将项目转换至Keil编译器6(适配TouchGFX),请按以下步骤操作:

开始操作前请备份项目,以防需要撤销更改。

在STM32CubeMX中切换工具链

首先,在STM32CubeMX的“Project Manager”选项卡中将工具链更改为MDK-ARM,即可创建Keil项目。 随后生成代码。

选定MDK-ARM工具链

在TouchGFX Designer中生成代码

Generate code from TouchGFX Designer by pressing the button or the F4 key on your keyboard, to add the TouchGFX specific code to the project.

生成代码

修改Keil分散加载文件

Keil用于链接项目的分散加载文件需进行调整,以确保TouchGFX创建的缓存不被初始化——这些缓存通常位于启动时无法访问的外部RAM中。
在项目的MDK-ARM子目录中找到.sct文件,确认项目使用的缓存对象并添加对象名称前缀.bss。
常见缓存对象包括TouchGFX_Framebuffer、Video_RGB_Buffer、Nemagfx_Memory_Pool_Buffer和Nemagfx_Stencil_Buffer,但在项目中未必全部使用。

链接文件更新示例
; *************************************************************
; *** 由uVision生成的散点加载描述文件 ***
; *************************************************************

LR_IROM1 0x08000000 0x00100000 { ; load region size_region
ER_IROM1 0x08000000 0x00100000 { ; load address = execution address
*.o (RESET, +First)
*(InRoot$$Sections)
.ANY (+RO)
}
RW_IRAM1 0x24000000 0x00080000 { ; RW data
.ANY (+RW +ZI)
}
RW_HYPERRAM 0x70000000 UNINIT 0x00FFFFFF {
*.o (.bss.TouchGFX_Framebuffer)
*.o (.bss.Video_RGB_Buffer)
}
}

LR_EROM1 0x90000000 0x2000000 { ; load region size_region
ER_EROM1 0x90000000 0x2000000 { ; load address = execution address
*.o (ExtFlashSection)
; *.o (TextFlashSection)
; *.o (FontFlashSection)
}
}

修改Keil项目选项

在Keil uVision中打开项目,然后通过右键单击右侧列表中的第二个项目并选择“Options for Targetxxx”,或单击顶部的“Project”菜单并选择“Options for Targetxxx”,进入项目设置。
在“Project”选项卡中选择以下设置:

  • 将编译器设置为“Use default compiler 6”
  • 禁用“Use MicroLIB”

目标选项

在“C/C++”选项卡中,选择以下设置:

  • 将C语言设为“c11”,将C++设为“c++11”
  • 禁用“short enums/wchar”
  • 建议优化为-Oz,以减小代码量

C/C++选项

如果使用FreeRTOS,则需将端口改为gcc版本,以兼容Keil编译器6。 TouchGFX已内置gcc端口支持,但STM32CubeMX在生成Keil项目时不会默认包含该端口。
要进行更改,第一步是修改端口的包含文件搜索路径。 单击Include paths文本字段旁边的“...”。
找到以“../Middlewares/Third_Party/FreeRTOS/Source/portable/RVDS”开头的行。 然后在“..”后添加“/gcc”,并将“RVDS”改为“GCC”。

修改包含文件搜索路径

请注意,对于某些版本的Cortex M7,FreeRTOS建议使用Cortex M4f端口。 该端口适用于STM32H7系列芯片,原始搜索路径应体现此配置。

修改Keil项目包含的文件

为使项目能正确链接TouchGFX库,需将当前包含的库文件替换为Keil编译器6兼容版本。 为此,请在文件树中找到touchgfx_core.lib文件(通常位于“Lib”分类下),右键单击父文件夹并点击“Add Existing File to Group xxx”。

点击“Add”

导航至“[项目文件夹]/Middlewares/ST/touchgfx/lib/core/[Architecture]/Keil6.x”并添加“touchgfx_core_wchar32.lib”。
这里的[Architecture]指的是MCU的实际架构。 若不确定可参考现有库文件路径。

添加touchgfx_core_wchar32.lib

然后在文件树中找到旧库引用,右键单击并选择“Remove File xxx”。

删除引用

如果使用FreeRTOS,还需替换port.c文件。 在“Middlewares/FreeRTOS”下找到该文件,并按上述方法删除旧文件。 然后导入位于“[项目文件夹]/gcc/Middlewares/Third_Party/FreeRTOS/Source/portable/GCC/[FreeRTOS架构]”中的新port.c文件。

添加port.c

此时项目应能成功编译。
建议在此状态下创建项目文件夹副本作为参考,因为后续STM32CubeMX和TouchGFX的重新生成操作可能会覆盖部分修改。