我已经将所有 STM32 项目迁移到 Codeblocks IDE 和 GCC 编译器 (arm-none-eabi)。 该过程使用 STM 的 CubeMX 生成基本代码,然后将所有内容与代码块项目文件、.s、.ld 等合并到适当的文件夹中。
注意到我使用 cortexM0 的项目正在构建并运行良好,但是对于 cortexM4 项目(STM32F401RE),运行构建的可执行文件时会发生很多疯狂的事情,因此我在这里提出问题。
我的猜测是我没有正确调用 GCC 或者某个地方配置错误。
如“定义”
STM32F401xE
作为“编译器选项”:
-mcpu=cortex-m0(注意:应该是-mcpu=cortex-m4) -f函数部分 -fdata-部分 -fno-通用 -s
作为“链接器选项”:
-Wl,--gc-部分 -Wl,-Map,默认/ggmeg.map -T ./STM32F401RETx_FLASH.ld -Wl,--打印内存使用情况,--gc-sections,--relax
任何帮助表示赞赏。 谢谢你,
请注意,我没有实时调试,因为我使用旧的 segger Jlink 作为 SWD 接口。我的第一个调试步骤是 - HAL_Init() 之后;系统时钟_配置(); MX_GPIO_Init(); - 将 GPIO 设置为 1,然后执行 while(1){},这样我就知道我的代码到目前为止已执行。
现在是野生动物:
我的结论是MX_GPIO_Init();返回时崩溃,表明存在严重问题。
在使用 GCC 标志进行反复试验后,发现了问题:
-mcpu=cortex-m4 还必须传递给链接器(编译器和链接器)。
如果使用 -mcpu=cortex-m0 标志为 STM32F4 或 STM32L4 编译 CubeMX 代码。 CubeMX 库在主要问题上出现故障,包括无法初始化 PLL,并且程序将以 4MHz(引导加载程序的速度)运行。因此,在我们的例子中,systick 的运行速度慢了 20 倍,给人一种程序崩溃的错误印象(事实并非如此)。这个问题的原因尚不清楚,因为没有编译错误,M4 应该能够正常执行 M0 指令。
这仅影响皮层 M4,而不影响 M0。
谢谢你。