IAR程序跳转bootloader跳转到APP


前言

`
IAP(在线应用编程)程序通过提前写入用于升级代码的 bootloader,可以完成 MCU APP 功能的升级,增强了代码的灵活性,在完成 APP 代码升级之后,程序需要从 Bootloader 代码跳转到 APP 代码运行, 本应用笔记基于 stm32/GD32F10x 系列(跳转函数通用),介绍如何实现程序从 Bootloader 代码跳转到 APP 代码

—`

一、IAR程序

AP 程序通常由两个部分组成:Bootloader 和 APP。Bootloader 和 APP 分别为两个工程程序,存放在 Flash 的 Main Flash 区,即 0x08000000 开始的区域。

二、Bootloader

当检测不需要更新时,调用下面这个函数,就会跳转到APP程序地址运行

#include "IAP.h"

void MSR_MSP(uint32_t addr)
{
__ASM volatile("MSR MSP, r0"); 
__ASM volatile("BX r14");
}

typedef  void (*iapfun)(void);定义一个函数指针结构体
iapfun jump2app; 
//跳转到应用程序段        appxaddr:用户代码起始地址.
void iap_load_app(uint32_t appxaddr)
{
    if(((*(uint32_t*)appxaddr)&0x2FFE0000)==0x20000000)//检查栈顶地址是否合法.
   { 
   /* Jump to user application */
    jump2app=(iapfun)*(uint32_t*)(appxaddr+4);//用户代码区第二个字为程序开始地址(复位地址)
    
 //   + 4 地址处存储的是 Reset_Handler 向量,该向量为 Reset_Handler 处理函数的入口地址,
    /* Initialize user application's Stack Pointer */
    MSR_MSP(*(uint32_t*)appxaddr); //初始化APP堆栈指针(用户代码区的第一个字用于存放栈顶地址)
   jump2app();//跳转到APP.
  }
  
  // HAL_NVIC_SystemReset();  系统软复位命令

}

2.APP程序

代码如下(示例):

 /* set the NVIC vector table base address to APP code area */
 nvic_vector_table_set(NVIC_VECTTAB_FLASH, APP_OFFSET);//GD32单片机使用
 或者使用STM32
 SCB->VTOR = FLASH_BASE | 0x20000;  //将中断向量地址和程序存储区域一起偏移

要完成 APP 的升级,要事先将编写好的 Bootloader 代码下载到 MCU 0x08000000 地址开始的 Flash 中。并且要保证 APP 代码区域不与 Bootloader 代码区域有重叠。

APP地址设置
在这里插入图片描述
BOOT 地址设置
在这里插入图片描述


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

亚特兰蒂斯MQ

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值