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

