CubeMx生成文件不正确



我想在VSCode环境中对STM32F103VCT6微控制器进行编程。我安装了用于vscode扩展的stm32。我用CubeMx创建了一个带有Makefile工具链设置的项目。我可以使用GNU ARM gcc编译器编译代码。这个项目很简单,我只配置了晶体和串行调试。我的问题是,如果我闪烁代码,晶体没有运行,我用示波器验证。如果我用CubeIde生成一个项目并在那里编译它,它会很好地工作,水晶就会启动。这两个项目中的C代码是相同的。

我的makefile有问题还是什么?

CubeMx项目

我可能会为您的具体问题迟到,但无论如何我都会留下答案。

即使使用不同的MCU(STM32F091RC(,我也遇到了同样的问题,但我找到了一个可能有用的解决方案。

首先,我意识到生成的二进制文件有不同的大小。因此,我分析了CubeMX生成的Makefile和CubeIDE执行的编译步骤。两者之间有一些不同的编译标志,其中一个特别引起了我的注意:优化标志

我注意到,在CubeMX生成的Makefile中,标志被设置为-0g,根据文档,它指示编译器:

Optimize debugging experience.
-Og should be the optimization level of choice for the standard edit-compile-debug cycle,
offering a reasonable level of optimization while maintaining fast compilation and a good
debugging experience. It is a better choice than -O0 for producing debuggable code because
some compiler passes that collect debug information are disabled at -O0.

尽管有最后一句话,我过去在gcc代码优化方面已经遇到了问题。因此,我将该标志设置为-O0,并重新编译了所有内容。请注意,我不需要调试任何东西,因此我无法判断使用-O0而不是-Og是否真的会影响调试体验以及在多大程度上影响调试体验。

我闪了一下生成的二进制文件(用openocd(,一切都正常。

关于vscode扩展的stm32的注意事项

请注意,尽管正确地编辑了Makefile,但该扩展将生成自己的Makefile,这将不考虑我们之前所做的优化标志的更改。

此外,您不能只编辑由扩展生成的Makefile,因为它在每次运行时都会重新生成它。

为了解决这个问题,我不得不下载扩展的源代码,并通过调整优化标志来重新编译它(此外,由于我有机会,我还在make命令中添加了-j选项,以加快编译速度(。

由于这超出了最初问题的范围,我不打算深入研究细节,但根据您的需要,您可能根本不需要扩展(例如,如果您只需要编译、清理或将二进制文件闪存到板中(。

希望这一切都有帮助!

最新更新