BootLoader实现Boot跳转App

1:理解BootLoader

所谓BootLoader,无非是从一个地址跳转到另外一个地址,

这种跳转是通过修改处理器的程序计数器(PC)或跳转指令来实现的,

用到BootLoader更多的是用来和上位机进行通信升级,通过boot跳转到从上位机下载好的app地址中执行。

 

1: typedef  void (*pFunction)(void);

 

这种类型的指针可以指向一个不返回任何值(void)且不带任何参数的函数,用于跳转到另一个程序或者子程序的入口点,

2:pFunction Jump_To_Application;

 

Jump_To_Application是一个函数指针

3: if (((*(__IO uint32_t*)ApplicationAddress) & 0x2FFE0000 ) == 0x20000000)
   

在这里可能会有人疑惑,这个判断为何会成立,要看ApplicationAddress地址值 & 0x2FFE0000(掩码)是否等于0x20000000这个地址值。

掩码:是一种用来选择、屏蔽或者操作指定位的数值。

4: Jump_To_Application = (pFunction) JumpAddress;
函数指针会跳到 JumpAddress这个地址实现跳转。

 5:__set_MSP(*(__IO uint32_t*) ApplicationAddress);

MSP:主堆栈指针,作用是参数设置为应用程序的起始地址的值,意味着将主堆栈指针设置为应用程序的起始地址,这是启用应用程序的做法。

6:Jump_To_Application()

 为什么还会需要这个函数调用呢,在4中不是已经有了实现跳转吗。其实是用来触发4的地址上的代码执行。这样才可以启用应程序

2:理解APP

app在Flash另外一块地址上,图形界面和基本功能都是在APP上。在下位机和上位机升级过程中就会用到BootLoader实现跳转,下位机开发者会把app的bin文件给上位机开发者存储到升级软件中,当下位机把USART或者USB插入到上位机(电脑)中,(Ymodem协实现上位机和下位机升级下期再说),在设备管理中会识别出来USART或USB,此时已经实现了连接。

3:BOOT和APP地址设置

1:根据我们的bootloader预留的空间的大小,设置APP跳转的起始地址,以下我设置boot地址地址是0x8000000-0x8002000,而APP地址是0x8002000-Flash最大地址, 这个芯片是512K

 

2:跳转APP地址是在系统初始化中下面判断中,如果VECT_TAB_SRAM初始化了即用SRAM,而我们用的是Flash。

 

3:SCB->VOTR是向量表偏移寄存器(Vector Table Offset Register)的缩写,

找到 VECT_TAB_OFFSET初始化,可以看到初始状态是0x000。上面在BOOT和APP地址设置中有讲到,APP地址设置的是0x8002000。

所以我们把 VECT_TAB_OFFSET 设置成 0x2000。有没有人疑惑这里为什么要设置是0x2000,因为FLASH_BASE地址是((uint32_t)0x08000000)。

SCB->VTOR = FLASH_BASE | VECT_TAB_OFFSET;这样就实现跳转到APP了。

 

4:还有另外一种方法配置APP

不设置VECT_TAB_OFFSET值,直接在main函数初始化中添加,也是能成功跳转的。

boot跳转代码

typedef  void (*pFunction)(void);
pFunction Jump_To_Application;
uint32_t JumpAddress;
#define ApplicationAddress    0x8002000

int8_t IAP_RunApp(void)
{
    if (((*(__IO uint32_t*)ApplicationAddress) & 0x2FFE0000 ) == 0x20000000)
    {   

        JumpAddress = *(__IO uint32_t*) (ApplicationAddress + 4);
        Jump_To_Application = (pFunction) JumpAddress;
        __set_MSP(*(__IO uint32_t*) ApplicationAddress);
        Jump_To_Application();
        return 0;
    }
    else
    {

        return -1;
    }
}

APP代码

#define APP_FLASH_ADDR  0x08002000

    SystemInit();
    SCB->VTOR = APP_FLASH_ADDR;  
    __enable_irq();

 

  • 23
    点赞
  • 32
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
### 回答1: 可以回答这个问题。boot跳转app和irom1之间有关系,irom1是一个只读存储器,用于存储启动代码和引导程序,而boot跳转app则是指在引导完成后跳转到应用程序的执行。因此,boot跳转app需要依赖irom1中的启动代码和引导程序来完成跳转。 ### 回答2: "boot跳转app"和"irom1"是两个不同的概念,它们之间没有直接的关系。 首先,"boot跳转app"指的是启动过程中的一种操作,用于将设备从引导程序(boot跳转到应用程序(app)运行。在这个过程中,引导程序会加载应用程序的代码,并将控制权转交给应用程序来执行。 而"irom1"是指的是芯片中的一个存储区域,常常用来存放只读代码(Read-Only Memory,ROM),也被称为内部ROM(Internal ROM)。一般来说,irom1中存放的是一些固化的系统代码,如引导程序、底层驱动程序等。 尽管两者可以在系统启动过程中相互作用,但它们的关系并不是直接的。引导程序(boot)在启动过程中可以从irom1中加载代码,包括最终要跳转执行的应用程序。因此,在引导过程中,引导程序可能会从irom1中加载app的代码,并通过跳转操作将控制权转移到app上。这样,可以说"boot跳转app"一定程度上依赖于irom1中存储的代码,但并不意味着两者有直接的关联。 总之,"boot跳转app"和"irom1"在设备启动和代码执行过程中都扮演了重要的角色,但它们是两个独立的概念,没有直接的关系。 ### 回答3: boot跳转app和irom1之间是有一定关系的。irom1是指内部ROM区域1,它是嵌入式系统中的一个重要部分,主要负责存放引导程序和初始化代码。而启动过程中的boot跳转app则是指在系统启动时,bootloader程序会根据一定的规则和条件,跳转到应用程序进行加载和执行。 具体而言,boot跳转app需要通过bootloader程序来实现,而bootloader则通常会加载和执行irom1中的引导程序。引导程序主要负责进行硬件初始化、加载操作系统内核或应用程序的相关文件,并跳转到内核或应用程序的入口点。因此,boot跳转app实现离不开irom1的支持和协作。 同时,irom1中的引导程序也需要与boot跳转app进行配合,在引导程序中会有一些策略和规则,用来判断是否跳转到应用程序的入口点。例如,引导程序可能会检测外部设备的状态,判断是否需要进行恢复或者升级操作,然后根据结果决定是否跳转到应用程序。因此,boot跳转app和irom1之间是一种相互协作的关系。 总之,boot跳转app和irom1之间存在关系,它们共同实现了系统的启动过程,通过bootloader加载和执行irom1中的引导程序,然后跳转到应用程序的入口点,完成系统的启动和运行。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值