带有 GDB 的 STM32 微控制器:当我更改闪存结构时,调试不起作用

带有 GDB 的 STM32 微控制器:当我更改闪存结构时,调试不起作用

我想使用 JLinkGDBServer 和 arm-none-eabi-gdb 客户端调试 STM32F107 微控制器的应用程序。我正在使用 ST 默认为 STM32F107 微控制器提供的启动汇编文件和链接器脚本。

如果我不修改链接器脚本,一切都会正常工作:在一个终端窗口上运行arm-none-eabi-gdb,在另一个终端中以运行 GDB 服务器JLinkGDBServer -select USB -device STM32F107RC -if SWD -speed auto。然后在 GDB 客户端上,我连接到端口 2331 上的服务器、load我的 elf 文件、、,monitor semihosting enable最后monitor resetcontinue该程序从 Reset_Handler 启动(我看到它的地址写入 PC 寄存器)并完美运行,我甚至在端口 2333 上运行 telnet 的新终端窗口上看到我的 std 输出。

当我修改 LD 链接器脚本以使用自定义地址时,问题就出现了。默认的 FLASH 部分从 0x08000000 开始,但我想为引导加载程序和其他一些数据保留该空间,并将我的程序存储在 0x08004000。在链接器脚本中进行此更改后,我按照与之前相同的步骤进行调试,但不起作用。我的应用程序似乎从某个随机地址开始,而不是从 Reset_Handler 开始。但是,根据 GDB 服务器的输出,Reset_Handler 的地址已正确写入 PC 寄存器。

我错过了什么?

答案1

问题在于 ISR 向量的位置。我需要将 ISR 向量偏移写入 VTOR 寄存器。此外,monitor reset从 GDB 执行不会执行实际重置,因为它会将闪存开头的值加载到 SP 寄存器中,而闪存开头不再是我的向量所在的位置。但是 PC 寄存器似乎确实加载正确。总而言之,在我的启动代码中,我添加了 2 项:1) 我设置了 VTOR 寄存器。2) 我将 SP 寄存器初始化为堆栈的开头。之后,它工作正常。

相关内容