Skip to content

改用 Keil MDK 编译工程

dukelec edited this page Apr 1, 2024 · 5 revisions

如果需要使用 Keil MDK 环境编译和开发代码,可以参考本文进行转换,或者直接下载转好的 MDK 工程。

除了此项目,其它项目也可以参考此文进行转换。

  1. 使用 STM32CubeMX 打开 Cube 工程,修改输出工程,由 Makefile 工程改为 MDK 工程,版本选择 V5 最新:

02

重新生成代码前,可以考虑删除 Cube 之前生成的相关代码,方便去除用不到的文件:

01

  1. 检查生成 MDK 工程后,和最初代码的改动情况:

03

由于我们删掉了老代码,所以老代码中添加的用户代码也丢失了,通过 gitk 和 meld 对比工具恢复用户增加的代码:

04

恢复后,再次察看代码的改动情况:

05

  1. 使用 Keil MDK 打开生成的 MDK 工程(本文使用的 MDK 版本为 V5.35)

先修改图中的 3 个地方,其中 ROM 地址是按照 fw 固件做的修改,如果是 bl 固件,则要填写 bl 的地址和范围:

06

然后修改下面 3 个地方,最后鼠标所指是增加头文件搜寻路径:

07

头文件搜寻路径添加后如下(从 usr 开始为手动添加,添加的路径斜线原本为 \,我统一修改为 /,可以不用修改):

08

  1. 接下来添加 c 代码,先建立一个组

09

给组随便改个名字,然后开始添加 c 代码:

10

11

添加完成后如下(此为 fw 例子,如果是 bl 固件,则参考 bl 的 Makefile 列出的 c 代码):

12

  1. 尝试编译,解决编译错误

直接屏蔽找不到的头文件:

13

SW_VER 没有定义(原本是 Makefile 传入的字符串),临时直接修改成一个字符串:

14

注释掉报错的 file 相关判断:

15

end 是 gcc 连接脚本中定义的,改为 MDK 工程后就找不到了,先屏蔽掉:

16

同时屏蔽掉 stack 检查的 init 和 check 函数调用:

17

删掉 int: 所在行,int 和 int32_t 重复,所以报错:

18

  1. 编译通过

19

虽然编译通过,但是无法运行,调试发现死在首次调用 printf 打印,修改 printf 底层函数 _write 为 fputc 即可:

20

至此,固件可以正常运行。

  1. 已经转换好的 MDK 工程打包

基于此 git 库 24aa108 版本代码做转换操作,STM32CubeMX 版本为 6.11.0, STM32G0 MCU Package 固件版本 1.6.2

(建议使用和 Makefile 工程相同的固件库版本进行 MDK 工程转换操作,或者先通过 Cube 升级 Makefile 工程的固件库版本。)

打包下载(部分修改未提交至本地 git 库):

cdstep_mdk.zip

Clone this wiki locally