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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.06 16:45:04