首页 > 代码库 > boot os 互相升级
boot os 互相升级
以前老是听说boot升级os,os升级boot,觉得很高深,自己做了一次发现其实也很简单。
boot就是一段启动代码。芯片本身有默认的启动地址,把boot下载到默认的启动地址,开机后就会默认进入boot。boot中有一个跳转指令,就会跳转到os启动系统。
boot的代码简介
#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。这里有两种方式
一是:boot里接收os文件,然后写到要跳转到的地址APP_START_ADDR,写完后跳转。
二是:配置keil直接下载到APP_START_ADDR,这个主要用于研发阶段,调试下载方便。
keil下载主要配置
1,keil下载地址 IROM1 start 起始地址为APP_START_ADDR
2,分散加载文件修改起始地址
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擦写算法一些知识,这里不介绍了
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。