-
Notifications
You must be signed in to change notification settings - Fork 25
改用 Keil MDK 编译工程
如果需要使用 Keil MDK 环境编译和开发代码,可以参考本文进行转换,或者直接下载转好的 MDK 工程。
除了此项目,其它项目也可以参考此文进行转换。
- 使用 STM32CubeMX 打开 Cube 工程,修改输出工程,由 Makefile 工程改为 MDK 工程,版本选择 V5 最新:
重新生成代码前,可以考虑删除 Cube 之前生成的相关代码,方便去除用不到的文件:
- 检查生成 MDK 工程后,和最初代码的改动情况:
由于我们删掉了老代码,所以老代码中添加的用户代码也丢失了,通过 gitk 和 meld 对比工具恢复用户增加的代码:
恢复后,再次察看代码的改动情况:
- 使用 Keil MDK 打开生成的 MDK 工程(本文使用的 MDK 版本为 V5.35)
先修改图中的 3 个地方,其中 ROM 地址是按照 fw 固件做的修改,如果是 bl 固件,则要填写 bl 的地址和范围:
然后修改下面 3 个地方,最后鼠标所指是增加头文件搜寻路径:
头文件搜寻路径添加后如下(从 usr 开始为手动添加,添加的路径斜线原本为 \,我统一修改为 /,可以不用修改):
- 接下来添加 c 代码,先建立一个组
给组随便改个名字,然后开始添加 c 代码:
添加完成后如下(此为 fw 例子,如果是 bl 固件,则参考 bl 的 Makefile 列出的 c 代码):
- 尝试编译,解决编译错误
直接屏蔽找不到的头文件:(最新代码已经默认去掉了这个头文件)
SW_VER 没有定义(原本是 Makefile 传入的字符串),临时直接修改成一个字符串:
注释掉报错的 file 相关判断:(最新代码已经去掉了这些判断)
end 是 gcc 连接脚本中定义的,改为 MDK 工程后就找不到了,先屏蔽掉:
同时屏蔽掉 stack 检查的 init 和 check 函数调用:
删掉 int: 所在行,int 和 int32_t 重复,所以报错:
- 编译通过
虽然编译通过,但是无法运行,调试发现死在首次调用 printf 打印,修改 printf 底层函数 _write 为 fputc 即可:
至此,固件可以正常运行。
- 已经转换好的 MDK 工程打包
基于此 git 库 24aa108 版本代码做转换操作,STM32CubeMX 版本为 6.11.0, STM32G0 MCU Package 固件版本 1.6.2
(建议使用和 Makefile 工程相同的固件库版本进行 MDK 工程转换操作,或者先通过 Cube 升级 Makefile 工程的固件库版本。)
打包下载(部分修改未提交至本地 git 库):