news 2026/9/30 7:09:43

嵌入式通用bootloader(一)

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
嵌入式通用bootloader(一)

通用嵌入式boolloader,方便适配到不同平台,欢迎交流学习和合作。

https://gitee.com/maxwillmaxwill/boot

个人微信buycoffee2026

1. 设备ROAM 分布

分区名称起始地址结束地址空间大小核心功能说明
M_BootBaseAddress0x080000000x08003FFF16KB芯片上电启动入口,
存放Bootloader引导代码,
负责固件校验、升级逻辑和APP跳转
M_AppBaseAddress0x080040000x0800EFFF44KB存放用户业务APP固件,
需在初始化时重映射中断向量表,
避免与Bootloader中断冲突
M_AppConfigBaseAddress0x0800F0000x0800FFFF4KB独立配置扇区,
存储升级标志、
设备参数、校验信息等非易失数据,
不占用APP代码空间

注意事项:每个分区的首地址按FLASH_PAGE_SIZE 对齐。

2. 报文格式

2.1 报文包

偏移

字段

长度

说明

0

Header Low

1B

帧头低字节 (PROTOCOL_HEADER & 0xFF)

1

Header High

1B

帧头高字节 (PROTOCOL_HEADER >> 8)

2

Length High

1B

帧总长度高字节

3

Length Low

1B

帧总长度低字节

4

Cmd ID

1B

命令标识

5 ~ N-2

Data

变长

数据载荷(可选)

N-1

CRC

1B

校验和

2.2 命令讲解

// 定义命令类型别名 CmdType typedef enum { CMD_SET_RESET = 0x01, // CMD_ACK_RESET = 0x81, // CMD_GET_VERSION = 0x02, // CMD_ACK_VERSION = 0x82, // CMD_GET_STATUS = 0x03, // CMD_ACK_STATUS = 0x83, // CMD_SET_PROGRAM = 0x04, // CMD_ACK_PROGRAM = 0x84, // CMD_SET_ERASE = 0x05, // CMD_ACK_ERASE = 0x85, // CMD_SET_PROGRAM_END = 0x06, // CMD_ACK_PROGRAM_END = 0x86, // CMD_GET_DIAG = 0x7F, //diagnosis CMD_ACK_DIAG = 0xFF, // diagnosis } CmdType;

命令的bit7==1表示 上位机-->设备,bit7==0表示 上位机<-设备 .

3. 升级流程

3.1 上位机发送读取状态

上位机发送读取状态命令,设备如果工作在boot 段回复的返值为0,工作在app段回复的返值为1,如果设备只有boot 程序没有app程序一直回复的是0。

3.2 上位机准备升级设备

上位根据读状态的结果,结果是0,直接发送升级命令,结果是1,发送复位命令,然后在3s内发送读取状态命令,进入升级流程。

2.3 上位机开始升级设备

上位发送擦除命令,擦除M_AppConfigBaseAddress 和M_AppBaseAddress 区, 注意先擦AppConfig区然后擦除App区。

上位机读取本机app.bin 文件,分包发送发送编程数据,写入设备App区,直到发完整个app.bin。

3.4 上位机发送升级结束命令

上位机发送升级结束命令,设备收命令后在AppConfig 区写入标志位,标志APP 区程序完整。

3.5 设备重启。

上位机发送重启命令或者设备手动断电,设备运行在boot 区,读取AppConfig 区标志位,如果app 是完整的,3s 内读取一直读取上位机命令,超时后主动 跳转到App区。如果app 是不完整的boot永远工作在boot 区,不跳转到App区。

注意事项目:

设备从boot 跳转到App 的时间超时设置 不可太长也不可太短。太长从上电到运行到app 区要很长时间,太短设备在app区收到复位命令又马上进入了app区,boot区没有办法进行升级流程。

4. 报文交互详解

4.1 复位功能 (Reset)

请求帧:SetReset_t_Fun * 原始数据: `0xA5 0xA5 0x00 0x06 0x01 0x51` * 解析: * `Header`: `0xA5 0xA5` * `Length`: `0x0006` (6 字节) * `Cmd ID`: `0x01` (Set Reset) * `Data`: 无 * `CRC`: `0x51` 响应帧:AckReset_t_Fun * 原始数据: `0xA5 0xA5 0x00 0x07 0x81 0x00 0xD2` * 解析: * `Header`: `0xA5 0xA5` * `Length`: `0x0007` (7 字节) * `Cmd ID`: `0x81` (Ack Reset, 最高位通常置1表示响应) * `Data`: `0x00` (状态码,0表示成功) * `CRC`: `0xD2`

4.2 版本查询 (Get Version)

请求帧:GetVersion_t_Fun * 原始数据: `0xA5 0xA5 0x00 0x06 0x02 0x51` * 解析: * `Header`: `0xA5 0xA5` * `Length`: `0x0006` (6 字节) * `Cmd ID`: `0x02` (Get Version) * `Data`: 无 * `CRC`: `0x51` 响应帧:AckVersion_t_Fun * 原始数据: ```text 0xA5 0xA5 0x00 0x46 0x82 0x53 0x54 0x4D 0x33 0x32 0x46 0x31 0x30 0x33 0x5F 0x42 0x4F 0x4F 0x54 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x31 0x2E 0x30 0x2E 0x30 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0xC5 ``` * 解析: * `Header`: `0xA5 0xA5` * `Length`: `0x0046` (70 字节) * `Cmd ID`: `0x82` (Ack Version) * `Data`: * ASCII 字符串部分: `STM32F103_BOOT` (偏移 5-16) * 填充零: (偏移 17-62) * 版本号: `1.0.0` (ASCII: `0x31 0x2E 0x30 0x2E 0x30`, 偏移 63-67) * 尾部填充: `0x00...` * `CRC`: `0xC5` (最后一个字节)

4.3 程序烧录设置 (Set Program)

请求帧:SetProgram_t_Fun * 原始数据: `0xA5 0xA5 0x10 0x06 0x04` * 异常分析: * 用户备注提到 `p->protocolcommon.length: 0x1006`。 * 若长度字段为 `0x1006` (4102 字节),则后续应紧跟大量数据载荷。 * 当前仅展示了帧头部分,完整帧应包含后续的数据块和最后的 CRC。 * `Cmd ID`: `0x04` (Set Program) 响应帧:AckProgram_t_Fun * 原始数据: `0xA5 0xA5 0x00 0x07 0x84 0x00 0xD5` * 解析: * `Header`: `0xA5 0xA5` * `Length`: `0x0007` (7 字节) * `Cmd ID`: `0x84` (Ack Program) * `Data`: `0x00` (状态码) * `CRC`: `0xD5`

4.4 状态查询 (Get Status)

请求帧:GetStatus_t_Fun * 原始数据: `0xA5 0xA5 0x00 0x06 0x03 0x53` * 解析: * `Header`: `0xA5 0xA5` * `Length`: `0x0006` (6 字节) * `Cmd ID`: `0x03` (Get Status) * `Data`: 无 * `CRC`: `0x53` 响应帧:AckStatus_t_Fun * 原始数据: `0xA5 0xA5 0x00 0x07 0x83 0x00 0xD4` * 解析: * `Header`: `0xA5 0xA5` * `Length`: `0x0007` (7 字节) * `Cmd ID`: `0x83` (Ack Status) * `Data`: `0x00` (状态码) * `CRC`: `0xD4`

4.5 擦除 Flash (Set Erase)

5. 代码展示

#ifndef __CMD_CONFIG_H__ #define __CMD_CONFIG_H__ #include <stdint.h> #include "stm32f10x.h" #include "core_cm3.h" #include "platform_config.h" #define DBG_LEVEL 1 #define BOOT 1 #define M_NAME_VERSION_BUF 16 #ifdef BOOT #define BOOT_NAME "STM32F103_BOOT" #define BOOT_VERSION "Ver_1.00.00" #else #define APP_NAME "STM32F103_APP" #define APP_VERSION "Ver_1.00.00" #endif #if defined (STM32F10X_HD) || defined (STM32F10X_HD_VL) || \ defined (STM32F10X_CL) || defined (STM32F10X_XL) #define FLASH_PAGE_SIZE ((uint16_t)0x800) /* 2KB for High Density */ #else #define FLASH_PAGE_SIZE ((uint16_t)0x400) /* 1KB for Medium/Low Density */ #endif #define M_BootBaseAddress FLASH_BASE #define M_AppBaseAddress 0x8004000 #define M_AppConfigBaseAddress (0x8010000-FLASH_PAGE_SIZE) // APP config address /*boot---app---config*/ #endif
// 定义命令类型别名 CmdType typedef enum { CMD_SET_RESET = 0x01, // CMD_ACK_RESET = 0x81, // CMD_GET_VERSION = 0x02, // CMD_ACK_VERSION = 0x82, // CMD_GET_STATUS = 0x03, // CMD_ACK_STATUS = 0x83, // CMD_SET_PROGRAM = 0x04, // CMD_ACK_PROGRAM = 0x84, // CMD_SET_ERASE = 0x05, // CMD_ACK_ERASE = 0x85, // CMD_SET_PROGRAM_END = 0x06, // CMD_ACK_PROGRAM_END = 0x86, // CMD_GET_DIAG = 0x7F, //diagnosis CMD_ACK_DIAG = 0xFF, // diagnosis } CmdType;
/*- Coding With UTF-8 -*/ #include <stdint.h> #include <stdio.h> #include <string.h> #include "mv_cmd.h" #ifndef __CMD_FUN_H__ #define __CMD_FUN_H__ uint8_t SetReset_t_Fun(void *data); uint8_t AckReset_t_Fun(void *ret); uint8_t GetVersion_t_Fun(void *data); uint8_t AckVersion_t_Fun(void *ret); uint8_t GetStatus_t_Fun(void *data); uint8_t AckStatus_t_Fun(void *ret); uint8_t SetProgram_t_Fun(void *data); uint8_t AckProgram_t_Fun(void *ret); uint8_t SetErase_t_Fun(void *data); uint8_t AckErase_t_Fun(void *ret); uint8_t SetProgramEnd_t_Fun(void *data); uint8_t AckProgramEnd_t_Fun(void *ret); uint8_t GetDiag_t_Fun(void *data); uint8_t AckDiag_t_Fun(void *ret); extern P_AppConfig_t *pgAppConfig; #endif

6.源码位置

https://gitee.com/maxwillmaxwill/boot

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/9/30 6:56:31

道本科技携手DeepSeek:以AI重塑合同全生命周期管理

在国央企加速推进数智法务转型的背景下&#xff0c;合同管理作为企业经营的核心环节&#xff0c;正面临着效率与风险的双重考验。海量合同文本的处理、复杂条款的审查、版本一致性的核验以及履约风险的动态监控&#xff0c;传统人工模式已难以满足现代企业合规与效率并重的要求…

作者头像 李华