我正在尝试为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的调用有何见解?
非常感谢
答案 0 :(得分:0)
由于闪存大小不同,因此我更改了链接描述文件 相应地
我敢打赌,您没有在向量表中更改堆栈的初始地址(可能还有RAM大小),因此第一个调用会导致HF。
21世纪的BTW gdb命令行?浪费时间,极为不便。安装Atollic Studio-它是免费的,并且受STM支持(实际上STM是公司的所有者)。易于创建项目。
如果要手动进行操作,这将是缓解压力和挫败感的方法。