我想在VSCode环境下编写一个STM32F103VCT6微控制器。我安装了stm32-for-vscode扩展。我用CubeMx创建了一个带有Makefile工具链设置的项目。我可以用GNU ARM的编译程序编译这个代码。这个项目很简单,我只配置了晶体和串口调试。我的问题是,如果我闪烁的代码,晶体没有运行,我用我的示波器验证。如果我用CubeIde生成一个项目,并在那里编译它,它就会正常工作,水晶就会启动。两个项目中的C代码是相同的。
我的makefile有问题还是怎么的?
发布于 2021-01-14 23:23:34
对于你的具体问题,我可能会迟到,但无论如何我都会留下答案的。
我遇到了同样的问题,即使使用不同的单片机(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),一切都正常工作。
关于stm32-for-vscode扩展的说明
请注意,尽管正确编辑了Makefile,此扩展仍将生成自己的Makefile,这将不会考虑我们之前所做的优化标志的更改。
此外,您不能只编辑从扩展生成的Makefile,因为它会在每次运行时重新生成它。
为了解决这个问题,我不得不下载扩展的源代码,并通过调整优化标志来重新编译它(另外,由于我有机会在make命令中添加-j选项,以加快编译速度)。
由于这超出了原始问题的范围,我不打算深入讨论细节,但根据您的需要,您可能根本不需要扩展(例如,如果您只需要编译、清理或将二进制文件闪存到板上)。
希望这一切都能有所帮助!
https://stackoverflow.com/questions/63924869
复制相似问题