boot os 互相升级

之前总是据说boot升级os,os升级boot,以为很高深,本身作了一次发现其实也很简单。算法

boot就是一段启动代码。芯片自己有默认的启动地址,把boot下载到默认的启动地址,开机后就会默认进入boot。boot中有一个跳转指令,就会跳转到os启动系统。
app

boot的代码简介spa

#define APP_START_ADDR						0x1C010000UL

int main() 
{

    //这里进行系统初始化能够有些须要的配置,如须要串口接收数据 usb 网口等;
    
    //这里实现跳转
    SCB->VTOR  = APP_START_ADDR;     //要跳转到的地址   
    ExceuteApplication();	   //汇编指令,实现跳转
}

__asm void ExceuteApplication(void)
{
	/* Load main stack pointer with application stack pointer initial value,
	    stored at first location of application area */
	ldr r0, =0x1C010000
	ldr r0, [r0]
	mov sp, r0

	/* Load program counter with application reset vector address, located at
	    second word of application area. */
	ldr r0, =0x1C010004
	ldr r0, [r0]
        BX  r0
}

boot下载到系统默认的启动地址处(由于是flash存储,数据会永远保存,因此每次启动都是从boot启动)。调试

而后,下载os。这里有两种方式code

一是:boot里接收os文件,而后写到要跳转到的地址APP_START_ADDR,写完后跳转。flash

二是:配置keil直接下载到APP_START_ADDR,这个主要用于研发阶段,调试下载方便。it

keil下载主要配置io

1,keil下载地址   IROM1 start 起始地址为APP_START_ADDRasm

2,分散加载文件修改起始地址 class

LR_IROM1 0x1C010000 0x00400000  {    ; load region size_region
  ER_IROM1 0x1C010000 0x00400000  {  ; load address = execution address
   *.o (RESET, +First)
   *(InRoot$$Sections)
   .ANY (+RO)
  }
  RW_IRAM1 0x10080000 0x0000A000  {  ; RW data
   .ANY (+RW +ZI)
  }
}

好了,这样就能够经过keil把os下载到APP_START_ADDR,

在os里添加这个中断偏移量 SCB->VTOR  = 0x1C010000 & 0x3FFFFF80;

到这里os升级boot已经完成。

os升级boot,原理是同样的,os经过串口 usb等接收到boot文件,而后,写到cpu默认启动地址,这样boot就更换完成,固然,这里涉及到flash擦写算法一些知识,这里不介绍了

相关文章
相关标签/搜索