3.7 KiB
3.7 KiB
Boot2
1.二级 boot
由于 XIP(executed in place)本地执行。芯片采用这种系统,可以不用将执行代码拷贝 到 SRAM,而直接在代码的存储空间直接运行。但是芯片不能直接跑 XIP,因此需要借助二级 Boot 进行 XIP 配置再跳转启动。 在 OTA 中,二级 Boot 引导启动的程序可以是 RAM 启动的程序,二级 boot 要对主要对启动参数进行解析,并判断程序状态进行操作。
目前二级 boot 主要有 XIP_Dual_boot2、XIP_Quad_boot2、BLE_OTA_boot2 和 2.4g_OTA_boot2。
1.1 XIP_Dual_boot2& XIP_QUAD_boot2
1.1.1 XIP_Dual_boot2& XIP_QUAD_boot2 使用方法
选择 xip_dual&xip_quad 工程,点击编译
编译后生成 boot2 文件,修改名称为 xip_dual\xip_quad,放入相应的 XIP 工程,重新编译工程。
1.1.2 XIP_Dual_boot2& XIP_QUAD_boot2 Flash 分区
说明:
- 芯片上电,一级 Boot 需要在 Flash 中找到 0 地址的 data 段,然后将 Flash 中的 data 数据拷贝到 RAM 中,在二级 Boot 里完成 XIP 的配置并跳转。
- 在 XIP_Dual_boot2/XIP_QUAD_boot2 中,M0 用的是 XIP_Dual_boot2,M4 用的是 XIP_QUAD_boot2,两个的不同点在于 XIP 模式的配置(详细可参考 fmc_xip.pdf),M0 使用的两线模式,M4 使用的是四线模式。
- 第一个 Sector 存放二级 Boot,程序在 Flash 的存放地址为 0x00001000,启动地址为 0x11001000。
- XIP_Dual_boot2 和 XIP_Quad_boot2,默认是无法修改 APP 的启动地址。
1.2 BLE_OTA_boot2
在 BLE_OTA 升级中使用的二级 BOOT,主要作用是读取启动参数,判断程序状态并对相应的程序进行启动、擦写、覆盖等操作,BLE_OTA_boot2 不止可以跳转启动 XIP 程序也能跳转启动 RAM 程序。
1.2.1 BLE_OTA_boot2 使用方法
选择 xip_dual&xip_quad 工程,点击编译
编译后生成 boot2 文件,放入相应的 XIP 工程,重新编译工程。
1.2.1 Flash 分区
- MO 默认 B 区地址为 0x10800
- M4 默认 B 区地址为 0x1b000
- B 区地址可以通过 ota bin bat 文件修改
1.2.2 Ble_Ota_boot2 启动流程
说明:
- BLE_OTA_boot2 默认 APP1 是从 0x00003000 地址开始读取程序数据并运行,也可以通过更改启动参数和存放地址改变 APP 启动地址,APP2 同理。
- 假设 APP1 使用的 XIP 方式,则默认启动地址为 0x11003000,若是读取到 Sram 启动的方式,则默认启动地址为 0x100003000。
- 默认上电先跑二级 Boot,二级 Boot 跳转到 APP1 或者 APP2。
- 在 BLE_OTA 升级中,主程序会把 0x00002000 地址的启动参数覆盖,用看门狗重新启动 Boot2,Boot2 将倒数第三个扇区的启动参数备份进行 CRC32 校验值比对,来判断是否进行程序的升级覆盖。 升级完毕后,会将 0x00002000 地址的启动参数覆盖到倒数第三个扇区。
1.2.3 启动参数详解
#define PARAM_CNT 5
typedef struct
{
uint32_t status; /*程序状态位*/
uint32_t softver; /*软件版本*/
uint32_t acheck; /*A区CRC*/
uint32_t aaddr; /*A区地址,程序存放的地址*/
uint32_t alen; /*程序大小*/
uint32_t bcheck; /*Backup区CRC*/
uint32_t baddr; /*Backup区地址*/
uint32_t blen; /*Backup区程序大小*/
uint32_t aloadaddr;/*A区启动地址*/
uint32_t bloadaddr;/*Backup区启动地址*/
uint32_t RESERVED0[2];
} param_unit;
typedef struct
{
param_unit paramunit[PARAM_CNT];/* 程序条目,最大可存放5个程序*/
uint32_t ParamCrc32;/*启动参数CRC*/
uint32_t RESERVED1[3];
} sboot_message;

