ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

嵌入式通用bootloader(一)

嵌入式通用bootloader(一) 通用嵌入式boolloader,方便适配到不同平台欢迎交流学习和合作。https://gitee.com/maxwillmaxwill/boot个人微信buycoffee20261. 设备ROAM 分布分区名称起始地址结束地址空间大小核心功能说明M_BootBaseAddress0x080000000x08003FFF16KB芯片上电启动入口存放Bootloader引导代码负责固件校验、升级逻辑和APP跳转M_AppBaseAddress0x080040000x0800EFFF44KB存放用户业务APP固件需在初始化时重映射中断向量表避免与Bootloader中断冲突M_AppConfigBaseAddress0x0800F0000x0800FFFF4KB独立配置扇区存储升级标志、设备参数、校验信息等非易失数据不占用APP代码空间注意事项每个分区的首地址按FLASH_PAGE_SIZE 对齐。2. 报文格式2.1 报文包偏移字段长度说明0Header Low1B帧头低字节 (PROTOCOL_HEADER 0xFF)1Header High1B帧头高字节 (PROTOCOL_HEADER 8)2Length High1B帧总长度高字节3Length Low1B帧总长度低字节4Cmd ID1B命令标识5 ~ N-2Data变长数据载荷可选N-1CRC1B校验和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;命令的bit71表示 上位机--设备,bit70表示 上位机-设备 .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: 0xD24.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: 0xD54.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: 0xD44.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; #endif6.源码位置https://gitee.com/maxwillmaxwill/boot
返回列表