You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

STM32CubeIDE如何调试位于偏移地址的应用程序?

问题

我的应用程序因Bootloader和配置数据位于应用地址之前存在偏移。调试不带Bootloader的应用时,仅需考虑配置数据的偏移——该数据占用1页Flash(0x800),因此应用程序位于0x08000800。

我已相应配置了链接脚本和向量表偏移:

链接脚本配置:

LD_DEVICE_SIZE = 512K;
LD_DEVICE_START = 0x08000000;
LD_BOOTLOADER_START = LD_DEVICE_START;
LD_BOOTLOADER_SIZE = 0x8000;
LD_MFG_DATA_START = LD_DEVICE_START;
LD_MFG_DATA_SIZE = 0x800;
LD_APP_START = LD_DEVICE_START + LD_MFG_DATA_SIZE;
LD_APP_SIZE = LD_DEVICE_SIZE - LD_MFG_DATA_SIZE;
LD_FLASH_START = LD_APP_START;
LD_FLASH_SIZE = LD_APP_SIZE;

/* Memories definition */
MEMORY
{
    RAM (xrw)       : ORIGIN = 0x20000000,          LENGTH = 160K
    RAM2 (xrw)      : ORIGIN = 0x10000000,          LENGTH = 32K 
    MFGDATA (rx)    : ORIGIN = LD_MFG_DATA_START,   LENGTH = LD_MFG_DATA_SIZE
    FLASH (rx)      : ORIGIN = LD_FLASH_START,      LENGTH = LD_FLASH_SIZE  
}

向量表偏移配置:

#ifdef DEBUG
    #define VECT_TAB_BASE_ADDRESS   FLASH_BASE
    #define VECT_TAB_OFFSET         LD_MFG_DATA_SIZE
#else
    #define VECT_TAB_BASE_ADDRESS   FLASH_BASE
    #define VECT_TAB_OFFSET         LD_BOOTLOADER_SIZE + LD_MFG_DATA_SIZE
#endif

但我无法调试该偏移地址的应用程序:能进入调试模式,但恢复运行后调试器即终止。我尝试修改Debug Configuration中“Startup”的“Set program counter”和“Set vector table”选项,但未生效,也不确定这些值应基于0x00000000还是0x08000000。请问应如何调试位于偏移地址的应用程序?

解决方案

1. 正确设置调试器启动参数

调试器的Set program counter和Set vector table参数需基于Flash物理地址(以0x08000000为基地址):

  • Set program counter:设为应用复位地址0x08000804(因为0x08000800是向量表首项,复位向量在偏移4字节的位置)
  • Set vector table:设为应用向量表起始物理地址0x08000800

2. 强制硬件层面的向量表偏移

在应用初始化阶段(如main函数开头或启动文件初始化代码中),直接设置SCB寄存器的VTOR,确保硬件能正确定位中断向量:

#ifdef DEBUG
SCB->VTOR = FLASH_BASE + LD_MFG_DATA_SIZE; // 等价于0x08000800
#endif

这一步可覆盖调试器配置的潜在问题,确保向量表偏移在硬件层面生效。

3. 验证链接脚本的入口点配置

在链接脚本中明确指定应用入口点,避免调试器找不到正确启动地址:

ENTRY(Reset_Handler)

同时通过生成的.map文件,确认Reset_Handler的地址被链接到0x08000804位置。

4. 检查符号文件加载配置

在Debug Configuration中,确保符号文件(.elf/.out)的加载地址与应用实际Flash地址匹配。若链接脚本已正确配置,通常无需手动修改,但需确认未设置错误的加载偏移。

5. 验证Flash烧录正确性

用调试器的内存查看功能,检查:

  • 0x08000800地址处是否正确烧录了应用向量表
  • 0x08000804地址是否为正确的复位函数地址
    若烧录地址错误,调试器运行时会因执行无效代码而终止。

内容的提问来源于stack exchange,提问作者bluscape

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.26 11:23:21