stm32 bootloader 跳转到app

一  相关配置

  • .bootloader和应用程序代码划分

  • 应用程序中断向量表

二  bootloader

bootloader具体功能不详述,最主要的是跳转到应用程序。主要有2点:

1. 跳转前,将应用程序的栈顶指针保存到MSP寄存器,应用程序的栈顶指针为地址0x08004000所对应的内容

2. 跳转到应用程序的复位向量(0x08004004)

下面是bootloader流程完成后,最后调用的跳转函数

#define APP_ADDR    0x08004000

typedef void (*func_app)(void);
volatile func_app func;//func需定义为全局变量

void run_app()
{
    unsigned long app_addr = APP_ADDR; 
   
    //跳转前关闭bootloader打开的中断,防止中断使能而应用程序没有相应的中断处理函数
    NVIC_DisableIRQ(USART1_IRQn);
    __disable_irq();
    
    unsigned long stack_pointer = *(unsigned long*)app_addr;
    
    //栈顶地址是否合法(假定sram大小为64k,栈顶指针不会超过0xffff)
    //举例,应用程序栈顶指针 = 0x20006958   
    if((stack_pointer & 0x2fff0000) == 0x20000000)
    {
        func = (func_app)(*(volatile unsigned long*)(app_addr + 4));        
      
        __set_MSP(stack_pointer);//将应用程序的栈顶指针保存到寄存器,需放在跳转前最后一步!
        func();       
    }
}

三 应用程序

  • 设置应用程序的起始地址为0x08004000,Keil设置

  • 设置中断向量表

main函数最开始的地方加入:

SCB->VTOR = 0x08004000;//设置中断向量表

四 程序下载

将bootloader下载到0x08000000起始的flash区间

将app下载到0x08004000起始的flash区间

使用Keil的话,在bootloader和应用程序的工程,分别 “Flash->Download”(F8)即可

 

  • 3
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值