GNU端的应用程序由于某种原因在弱链接的WWDG中断处理程序中陷入了无限循环。该应用程序不启用WWDG,并且在复位时默认禁用它。我还验证了配置寄存器处于其默认启动值。
除了编译器之外,唯一的区别是链接器和启动文件。然而,两个工具链使用的启动文件和链接器文件都是由STM生成的默认文件。
有任何想法是什么导致这个问题?我已经快要束手无策了。
使用stm32f103XX,请告诉我是否需要其他信息。
编辑: 根据下面的评论,我能够确定实际上是触发了HardFault_Handler。 如果可能有帮助,我在下面包含了回溯输出。
GDB BT:
0 HardFault_Handler ()
1(信号处理程序被调用)
2 0x720a3de in ?? ()
3 0x80005534 在 foo() 中
回溯停止:前一帧与此帧相同(堆栈损坏?)
有两个问题引起了我的注意,虽然我不是 gdb 专家。1)foo 不是一个函数,它是一个常量字符数组;2)0x0720a3de 不是一个有效的内存地址,闪存地址范围从 0x08000000 开始。
while(1);
可能由于优化而共享了该代码。地图文件是否仅显示该地址处的WWDG? - D KruegerHardFault_Handler
,我花了整整一天一夜来找出原因,结果发现我忘记编译所有外设文件(stm32f10x_adc.o
、stm32f10x_bkp.o
、stm32f10x_can.o
、stm32f10x_cec.o
...misc.o
)并将它们链接起来,感觉自己像个傻瓜♂️。 - Kyung Lee