STM32L4编写bootloader如何跳转至0x08008000地址运行应用
STM32L4 Bootloader跳转实现步骤
一、先完成blinky应用的地址偏移适配
这一步是跳转成功的前提,未适配的固件跳转后会直接跑飞:
- 打开blinky项目工程配置,将FLASH起始地址从默认的
0x08000000修改为烧写地址0x08008000,FLASH总大小对应减去0x8000(即32KB,匹配bootloader占用的空间) - 修改中断向量表偏移为
0x8000,可以直接在SystemInit()函数中修改SCB->VTOR的赋值,也可以在工程宏定义中添加VECT_TAB_OFFSET=0x8000 - 重新编译生成新的BIN文件,再次烧写到
0x08008000地址,确认固件本身逻辑正常
二、Bootloader端跳转功能实现
跳转前需要关闭所有bootloader用到的外设、中断,避免对应用运行产生干扰:
/* 定义应用分区起始地址 */ #define APPLICATION_ADDRESS 0x08008000 typedef void (*pFunction)(void); pFunction JumpToApplication; uint32_t JumpAddress; void Bootloader_JumpToApp(void) { /* 1. 禁用全局中断、复位所有外设配置 */ __disable_irq(); HAL_RCC_DeInit(); HAL_DeInit(); /* 2. 校验应用栈顶地址合法性,STM32L4 SRAM起始地址为0x20000000,栈顶必须落在SRAM范围内 */ if (((*(volatile uint32_t *)APPLICATION_ADDRESS) & 0x2FFE0000) == 0x20000000) { /* 3. 读取应用的复位中断函数入口地址 */ JumpAddress = *(volatile uint32_t *)(APPLICATION_ADDRESS + 4); JumpToApplication = (pFunction)JumpAddress; /* 4. 将主栈指针设置为应用的栈顶地址 */ __set_MSP(*(volatile uint32_t *)APPLICATION_ADDRESS); /* 5. 跳转至应用执行 */ JumpToApplication(); } }
三、按键触发跳转逻辑
在bootloader主循环中添加按键扫描逻辑,按下按键后调用跳转函数即可:
int main(void) { HAL_Init(); SystemClock_Config(); /* 初始化按键对应的GPIO端口 */ Key_GPIO_Init(); while (1) { if (HAL_GPIO_ReadPin(KEY_GPIO_PORT, KEY_GPIO_PIN) == GPIO_PIN_RESET) // 假设按键为低电平触发 { HAL_Delay(20); // 按键消抖 if (HAL_GPIO_ReadPin(KEY_GPIO_PORT, KEY_GPIO_PIN) == GPIO_PIN_RESET) { Bootloader_JumpToApp(); } } /* 其他bootloader业务逻辑 */ } }
常见问题排查
- 跳转后跑飞:优先检查应用的FLASH起始地址、中断向量表偏移是否修改正确,其次确认跳转前是否关闭了所有未处理的中断和外设
- 按键触发无响应:检查按键GPIO初始化配置是否正确,消抖时长是否匹配按键硬件特性
内容的提问来源于stack exchange,提问作者Amin-nano-sys
相关产品推荐
相关产品推荐

