Files
HC32F460BootLoader/source/User/Inc/main.h
T
YuanHongbin 48ed25015d feat(boot): 升级改造为A/B分区(新固件先下B区整包校验后搬运A区)
分区: Boot 32KB | A区0x8000(29扇区232KB,运行) | B区0x42000(29扇区232KB,暂存) | 参数区0x7C000不变
流程: 仅擦B区下载→CRC32(B)通过→逐扇区搬运B→A→CRC32(A)通过→擦B区→置APP_BOOT_UPGRADE_FLAG复位
防变砖: 下载超时/CRC失败/AppSize非法均恢复APP_START_FLAG复位回老App; 断电续传靠重启后B区CRC判定
其他: GetCrc32/AppWriteFlash/EraseFlash基址参数化, FlashWrite尾字节0xFF补齐, 0x82增加状态守卫
协议与boot_para_t结构不变, 主机升级工具无需修改
2026-09-23 11:16:47 +08:00

79 lines
1.8 KiB
C

#ifndef __MAIN__H
#define __MAIN__H
#include "bsp.h"
#define CRC16_BASE 0xA001
#define APP_START_FLAG 0x55AA5A5A
#define APP_UPDATE_FLAG 0xA5A5AA55
#define APP_BOOT_UPGRADE_FLAG 0x5A5A55A5 //升级完成标记:Boot升级成功后置位,App启动时据此擦除外部参数分区并恢复APP_START_FLAG(与App侧bsp.h定义保持一致)
typedef enum {
UPDATE_CMD_NULL,
UPDATE_CMD_SLAVE_RES = 0x01, //从机应答命令(ACK)
UPDATE_CMD_SLAVE_REQ_DATA = 0x02, //从机请求数据命令
UPDATE_CMD_MASTER_REQ = 0x81, //主机升级请求
UPDATE_CMD_MASTRE_RES_DATA = 0x82, //主机下发数据
}UpdateCmd_m;
//帧头结构体
typedef struct {
uint8_t Header;
uint8_t DevMac[6];
uint8_t Cmd;
uint8_t PayloadLen;
}__attribute__ ((packed))FrameHeader_t, *FrameH;
//主机下发升级请求载荷结构体
typedef struct {
uint16_t PackageNum;
uint32_t AppSize;
uint32_t AppCrc32;
}__attribute__ ((packed))UpDataRequset_t, *UDReq;
//从机请求下发数据结构体
typedef struct {
uint16_t PackageIndex;
uint16_t PackageNum;
}__attribute__ ((packed))GetDataRequest_t, *GDReq;
//主机应答下发数据结构体
typedef struct {
uint16_t PackageIndex;
uint16_t PackageNum;
uint8_t DataLen;
}__attribute__ ((packed))DownResponse_t, *DownRes;
typedef enum {
BL_IDLE,
BL_ERASE_FLASH,
BL_GET_DATA,
BL_WAIT_REV,
BL_GET_DATA_TIMEOUT,
BL_START_APP,
BL_COPY_TO_A, //B区镜像搬运到A区阶段
BL_RESET
}BootStatus_m;
typedef struct {
BootPara_t Para;
BootStatus_m Status;
uint32_t AppPackageCnt;
uint32_t AppPackageIdx;
uint32_t RevErrCnt;
uint32_t CopyRetryCnt; //搬运重试计数
uint32_t FeedDogDlyCnt;
uint32_t BootLoader1mSDlyCnt;
bool RxFlag;
uint32_t UartRevTimeOutCnt;
uint8_t RxBuff[260];
uint16_t RxLen;
uint16_t UpDateFlag;
}BootLoader_t;
#endif