STM32不用固件库容易产生的一个问题:Undefined symbol SystemInit

最近接触STM32F10x,有时只想实现一些小功能,实在不想用冗大的官方固件库,

于是除了MDK提供的STM32F10x.s外,其余源文件都自己写。但MDK提供的启动文件

不完善,对外设和中断支持不好,于是把STM32固件库里的startup_stm32f10x_cl.s

(我的芯片是stm32f107vct6)加了进来,不过,链接报错!出错信息如下:

uart.axf: Error: L6218E: Undefined symbol SystemInit (referred from startup_stm32f10x_cl.o).

百度搜到了如下的解决办法,以记之。

 

/************************************************************************************************/

/***************************我是分割线,以下是转载内容*************************************/

/**********************************************************************************************/ 

 

STM32_TEST.axf: Error: L6218E: Undefined symbol SystemInit (referred from startup_stm32f10x_md.o).

     此问题错误提示已经十分清楚的告诉你错在哪里了,Undefined symbol SystemInit ,翻译过来就是:SystemInit 这个符号没有定义,随后的小括号告诉你了,是在 startup_stm32f10x_md.o这个文件里面被提及的,这个.o文件在工程里面并没有,它是一个在编译的时候根据.c/.s文件生成的。所以我们只需要找到工程里面的.s或者.c即可,这里对应这个名字的就是startup_stm32f10x_md.s了。

   在此文件里面可以找到SystemInit的所在:
Reset_Handler    PROC
                 EXPORT  Reset_Handler             [WEAK]
     IMPORT  __main
     IMPORT  SystemInit
                 LDR     R0, =SystemInit
                 BLX     R0
                 LDR     R0, =__main
                 BX      R0
                 ENDP
  
 原来在复位中断服务函数里面,调用了SystemInit这个函数,而这个函数在.s文件里面没有定义。
    所以解决的办法有两个。
   1,在外部(其他任何.c文件里面)定义SystemInit这个函数,哪怕是个空函数也可以。
   2,把                
                 LDR     R0, =SystemInit
                 BLX     R0

      这两句话去掉。

/************************************************************************************************/

/***************************我是分割线,以上是转载内容*************************************/

/**********************************************************************************************/ 

 
    另外,固件库中的SystemInit()函数的定义在如下位置
\Libraries\CMSIS\CM3\DeviceSupport\ST\STM32F10x\system_stm32f10x.c 的第172行开始定义。
  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值