STM32F030中VTOR未找到,寻求Bootloader应用跳转操作指导
STM32F030 跳转Bootloader/应用代码的VTOR配置与实操指南
1. 先搞定VTOR的正确访问
STM32F030的VTOR属于系统控制块(SCB),物理地址是0xE000ED08。不管用标准库还是裸机开发,都能直接访问:
- 用标准库的话,直接调用
SCB->VTOR - 裸机开发可以直接定义指针访问:
#define SCB_VTOR (*((volatile uint32_t *)0xE000ED08))
注意:F0系列的VTOR偏移地址必须对齐到向量表长度的整数倍(F030默认向量表长度为0x100,所以偏移地址得是0x100的倍数,比如0x20000400合法,0x20000410就不行)。
2. 跳转前必须做的准备(不做必出问题)
跳转前一定要清理所有中断相关的状态,否则大概率触发硬fault:
- 全局关闭中断:
__disable_irq(); - 清空所有挂起的中断标志:
for (int i = 0; i < 8; i++) { NVIC->ICER[i] = 0xFFFFFFFF; NVIC->ICPR[i] = 0xFFFFFFFF; } - 关闭系统滴答定时器(SysTick):
SysTick->CTRL = 0;
3. 核心跳转代码示例
假设你的应用向量表起始地址是APP_START_ADDR(比如你指定的RAM地址0x20000400),直接用这段代码实现跳转:
typedef void (*pFunction)(void); void jump_to_app(uint32_t app_addr) { pFunction app_reset_handler; uint32_t app_stack_ptr; // 先校验栈顶地址是否在RAM范围内,非法则进入死循环 app_stack_ptr = *(volatile uint32_t *)app_addr; if ((app_stack_ptr & 0x2FFE0000) != 0x20000000) { while(1); } // 配置VTOR指向应用的向量表 SCB_VTOR = app_addr; // 加载应用的栈指针 __set_MSP(app_stack_ptr); // 获取应用的复位处理函数地址(向量表的第二个入口) app_reset_handler = (pFunction)*(volatile uint32_t *)(app_addr + 4); // 执行跳转 app_reset_handler(); }
4. 链接脚本的关键配置要点
要确保链接脚本确实把向量表放到了你指定的RAM地址,示例配置如下:
MEMORY { RAM (xrw) : ORIGIN = 0x20000400, LENGTH = 0x1C00 /* 向量表起始地址设为0x20000400 */ FLASH (rx) : ORIGIN = 0x8000000, LENGTH = 0x10000 } SECTIONS { .isr_vector : { . = ALIGN(4); KEEP(*(.isr_vector)) /* 必须保留向量表,防止被编译器优化移除 */ . = ALIGN(4); } >RAM /* 指定向量表存储到RAM区域 */ /* 其他段的配置按项目需求调整即可 */ }
5. 常见问题排查
- 找不到VTOR:检查是否包含了正确的头文件(
stm32f0xx.h),或者编译器是否正确定义了SCB结构体;裸机开发直接用物理地址指针访问肯定没问题。 - 跳转后触发硬fault:检查栈顶地址是否合法,VTOR偏移地址是否对齐,以及是否遗漏了关闭中断或SysTick的操作。
内容的提问来源于stack exchange,提问作者Kishor Giri
相关产品推荐
相关产品推荐

