使用GCC arm-none-eabi进行STM32F0编程:__libc_init_array

时间:2018-09-28 16:50:04

标签: c gcc stm32

我正在尝试为STM32L030x6 MCU制作固件。

我编写了一个简单的代码,该代码似乎可以在具有STM32L030x8 MCU的评估板上使用。 “似乎可以正常工作”是指我能够到达主要功能并切换gpio。

但是当在目标STM32L030x6上闪烁时,我在启动代码的早期就遇到了硬故障:

Reset_Handler:
  ldr   r0, =_estack
  mov   sp, r0          /* set stack pointer */

/* Copy the data segment initializers from flash to SRAM */
  movs r1, #0
  b LoopCopyDataInit

CopyDataInit:
  ldr r3, =_sidata
  ldr r3, [r3, r1]
  str r3, [r0, r1]
  adds r1, r1, #4

LoopCopyDataInit:
  ldr r0, =_sdata
  ldr r3, =_edata
  adds r2, r0, r1
  cmp r2, r3
  bcc CopyDataInit
  ldr r2, =_sbss
  b LoopFillZerobss
/* Zero fill the bss segment. */
FillZerobss:
  movs r3, #0
  str  r3, [r2]
  adds r2, r2, #4


LoopFillZerobss:
  ldr r3, = _ebss
  cmp r2, r3
  bcc FillZerobss

/* Call the clock system intitialization function.*/
    bl  SystemInit
/* Call static constructors */
    bl __libc_init_array <-------------- after a breakpoint here, typing "ni" in gdb hardaulft
/* Call the application's entry point.*/
  bl main <----------------------------- never reach here

LoopForever:
    b LoopForever

由于闪存大小不同,因此我相应地更改了链接描述文件,因此内存初始化必须很好。

我不确定“ __libc_init_array”是libc的一部分(在我的情况下是newlib-nano)。

一个有趣的事情是,如果我评论对“ __libc_init_array”的调用,它在评估板上仍然可以正常运行,并且对我的目标仍然存在故障。因此,问题可能出在通话之前。

我对SystemInit充满信心,因为它是ST的模板,可以处理两个MCU。

这可能不是硬件问题,因为使用Keil,我能够成功地刷新目标并运行简单的应用程序代码。

关于可能是什么问题的任何想法?那么,对libc的调用有何见解?

非常感谢

1 个答案:

答案 0 :(得分:0)

  

由于闪存大小不同,因此我更改了链接描述文件   相应地

我敢打赌,您没有在向量表中更改堆栈的初始地址(可能还有RAM大小),因此第一个调用会导致HF。

21世纪的BTW gdb命令行?浪费时间,极为不便。安装Atollic Studio-它是免费的,并且受STM支持(实际上STM是公司的所有者)。易于创建项目。

如果要手动进行操作,这将是缓解压力和挫败感的方法。