将Keil编译器5项目转换为Keil编译器6
简介
STM32CubeMX并非对所有MCU都支持生成Keil编译器6/armclang项目。 若需在此类场景中将项目转换至Keil编译器6(适配TouchGFX),请按以下步骤操作:
开始操作前请备份项目,以防需要撤销更改。
在STM32CubeMX中切换工具链
首先,在STM32CubeMX的“Project Manager”选项卡中将工具链更改为MDK-ARM,即可创建Keil项目。 随后生成代码。
在TouchGFX Designer中生成代码
通过点击按钮或按下键盘F4键,从TouchGFX Designer生成代码,将TouchGFX专用代码添加至项目。
修改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,以减小代码量
如果使用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”。
导航至“[项目文件夹]/Middlewares/ST/touchgfx/lib/core/[Architecture]/Keil6.x”并添加“touchgfx_core_wchar32.lib”。
这里的[Architecture]指的是MCU的实际架构。 若不确定可参考现有库文件路径。
然后在文件树中找到旧库引用,右键单击并选择“Remove File xxx”。
如果使用FreeRTOS,还需替换port.c文件。 在“Middlewares/FreeRTOS”下找到该文件,并按上述方法删除旧文件。 然后导入位于“[项目文件夹]/gcc/Middlewares/Third_Party/FreeRTOS/Source/portable/GCC/[FreeRTOS架构]”中的新port.c文件。
此时项目应能成功编译。
建议在此状态下创建项目文件夹副本作为参考,因为后续STM32CubeMX和TouchGFX的重新生成操作可能会覆盖部分修改。