【单片机】STM32 axf: Error: L6218E: Undefined symbol SystemInit (referred from startup_stm32f10x_md.o)

先说结论

assembling startup_stm32f10x_md.s...
linking...
..\OBJ\test.axf: Error: L6218E: Undefined symbol SystemInit (referred from startup_stm32f10x_md.o).
Not enough information to list image symbols.
Finished: 1 information, 0 warning and 1 error messages.
"..\OBJ\test.axf" - 1 Error(s), 2 Warning(s).

需要改写启动文件。

启动文件选取是根据flash大小来的:https://qq742971636.blog.csdn.net/article/details/132215006

这么改就可以了:
在这里插入图片描述

说说详细经过

我要写一个stm32f103的程序,是基于寄存器开发的。

官网的文件 STM32F10x_StdPeriph_Lib_V3.5.0.rar 里面是包含库函数如何开发的,在这个路径你会找到所有启动文件:

在这里插入图片描述
我的芯片是STM32F103RBT6,选芯片:

在这里插入图片描述
改写定义:

在这里插入图片描述
官网的启动文件就需要注释掉那几句话,或者自己外部定义一个SystemInit函数,我选择注释掉。

这三句汇编指令是用于STM32单片机的Keil开发环境中的代码片段。它们用于初始化系统并跳转到初始化函数。

在这里插入图片描述

  1. ;IMPORT SystemInit:这是一个注释行,指示代码库应该导入名为 “SystemInit” 的函数。该函数通常用于系统的初始化设置,如时钟配置、外设初始化等。

  2. ;LDR R0, =SystemInit:这是一条汇编指令,将名为 “SystemInit” 的函数的地址加载到寄存器 R0 中。这将使 R0 包含 “SystemInit” 函数的地址,以便后续的跳转。

  3. ;BLX R0:这是一条分支并链接指令,它将跳转到 R0 寄存器中存储的地址,并在跳转之前将返回地址保存到链接寄存器 LR 中。这实际上是一个函数调用指令,它将执行 “SystemInit” 函数,并且在函数返回时,程序将从保存在 LR 中的地址处继续执行。

总的来说,这三句指令的目的是从地址存储在 R0 中的 “SystemInit” 函数开始执行,以完成系统的初始化过程。

猜你喜欢

转载自blog.csdn.net/x1131230123/article/details/132215702