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擦寫算法一些知識,這裏不介紹了

相關文章
相關標籤/搜索