使用 GCC arm-none-eabi 进行 STM32F0 编程:__libc_init_array 中出现硬故障

STM32F0 programming with GCC arm-none-eabi : hardfault in __libc_init_array

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

我做了一个简单的代码,它似乎可以在带有 STM32L030x8 MCU 的评估板上运行。 'seems to work' 我的意思是我能够到达主 fct 并切换 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 调用的洞察力?

非常感谢

Since flash sizes are different I changed the linker script accordingly

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

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

如果您打算手动完成,那将是一种压力和沮丧的方式。