feat(upgrade): 升级完成置APP_BOOT_UPGRADE_FLAG标记,参数分区擦除改由App侧执行
- 升级成功(CRC32校验通过)后AppFlag置APP_BOOT_UPGRADE_FLAG(0x5A5A55A5),每次升级均置位 - 启动判断放行该标记: 升级完成后直接启动App,不再停留在BL_IDLE - 擦除动作由App初始化完成: 检测标记后擦除外部SPI Flash参数分区(扇区0~1,非全片擦除,历史日志保留),随后恢复APP_START_FLAG并加载默认参数 - 目的: 防止固件升级后参数结构体布局变化导致字段错位(曾引发注册表乱码/传感器无法注册) - main.h统一UTF-8编码,新增APP_BOOT_UPGRADE_FLAG定义(与App侧bsp.h保持一致) - bsp.h配置更新: 网关编号0x0003,服务器端口8083
This commit is contained in:
+29
-7
@@ -10,14 +10,14 @@
|
||||
> ```c
|
||||
> #define GATEWAY_VER_INFO GATEWAY_VER1_0 // 版本信息 → Mac[0](Bit7固定1)
|
||||
> #define GATEWAY_PRJ_NUM GATEWAY_PRJ_YAXIA // 项目编号 → Mac[1:3](枚举见 bsp.h:17-26)
|
||||
> #define GATEWAY_GW_NUM 0x0000 // 网关编号 → Mac[4:5](1~65535,按设备唯一分配)
|
||||
> #define $10x0003 // 网关编号 → Mac[4:5](1~65535,按设备唯一分配)
|
||||
> ```
|
||||
>
|
||||
> | 项 | 当前值 | 影响 |
|
||||
> | --- | --- | --- |
|
||||
> | GATEWAY_VER_INFO | GATEWAY_VER1_0 | 写入 MAC[0],标识网关软件版本 |
|
||||
> | GATEWAY_PRJ_NUM | GATEWAY_PRJ_YAXIA | 写入 MAC[1:3],标识所属项目(换项目必改) |
|
||||
> | GATEWAY_GW_NUM | 0x0000 | 写入 MAC[4:5],每台设备必须唯一(按网关编号分配) |
|
||||
> | GATEWAY_GW_NUM | 0x0003 | 写入 MAC[4:5],每台设备必须唯一(按网关编号分配) |
|
||||
>
|
||||
> ### ② CAT1 服务器 / Lora 配置(bsp.h:67-73)
|
||||
>
|
||||
@@ -26,15 +26,15 @@
|
||||
> #define GATEWAY_SVR_ADDR1 106 // 服务器 IP[1]
|
||||
> #define GATEWAY_SVR_ADDR2 103 // 服务器 IP[2]
|
||||
> #define GATEWAY_SVR_ADDR3 147 // 服务器 IP[3]
|
||||
> #define GATEWAY_SVR_PORT 8080 // 服务器端口
|
||||
> #define GATEWAY_LORA_FREQ CH3 // Lora 中心频率(CH0~CH45,470.1MHz~492.6MHz)
|
||||
> #define $18083 // 服务器端口
|
||||
> #define GATEWAY_LORA_FREQ CH0 // Lora 中心频率(CH0~CH45,470.1MHz~492.6MHz)
|
||||
> ```
|
||||
>
|
||||
> | 项 | 当前值 | 说明 |
|
||||
> | --- | --- | --- |
|
||||
> | 服务器 IP | 39.106.103.147 | CAT1 上传的默认服务器地址 |
|
||||
> | 服务器端口 | 8080 | CAT1 上传的默认端口 |
|
||||
> | GATEWAY_LORA_FREQ | CH3 | Lora 中心频率,按现场干扰/组网需要从 CH0~CH45 中选择 |
|
||||
> | 服务器端口 | 8083 | CAT1 上传的默认端口 |
|
||||
> | GATEWAY_LORA_FREQ | CH0 | Lora 中心频率,按现场干扰/组网需要从 CH0~CH45 中选择 |
|
||||
>
|
||||
> ### ③ 默认通道配置(bsp.h:76-79)
|
||||
>
|
||||
@@ -51,6 +51,9 @@
|
||||
> | GATEWAY_AUCH | CH_NULL | 辅助上传通道,-1 表示不使用 |
|
||||
> | GATEWAY_DUCH | CH_CAT1 | 调试/升级通道 |
|
||||
> | GATEWAY_CUCH_MASK | CUCH_LORA | 通讯单元通道掩码,可多通道按位或(CUCH_CH1/CUCH_CH2/CUCH_ETH/CUCH_LORA/CUCH_CAT1) |
|
||||
>
|
||||
> **编码约定**:所有源码文件统一使用 UTF-8 编码(无 BOM),注释使用中文;
|
||||
> 新增/修改代码时勿以 GB2312/ANSI 保存。
|
||||
|
||||
## 1. 项目概述
|
||||
|
||||
@@ -193,6 +196,7 @@ ReadBootPara() // 读参数区
|
||||
│ ├─ 同步 s_DevMac
|
||||
│ ├─ 旧参数区(0xFF)补默认值
|
||||
│ ├─ AppFlag==APP_START_FLAG -> BL_START_APP (直接跳APP)
|
||||
│ ├─ AppFlag==APP_BOOT_UPGRADE_FLAG -> BL_START_APP (升级完成,启动后由App擦参数分区)
|
||||
│ ├─ UpdateFlag==APP_UPDATE_FLAG -> BL_ERASE_FLASH (续升级)
|
||||
│ └─ 否则 -> BL_IDLE (等待升级指令)
|
||||
└─ while(1): FeedDogHandler() + BootLoaderLoopHandler()
|
||||
@@ -210,7 +214,7 @@ BL_WAIT_REV ── 500ms 超时 ──> BL_GET_DATA_TIMEOUT
|
||||
BL_GET_DATA_TIMEOUT ── 重试<3次 ──> BL_GET_DATA
|
||||
BL_GET_DATA_TIMEOUT ── 重试>=3次 ──> BL_IDLE (清除升级标志)
|
||||
└─ 全部包写完 -> CRC32 校验
|
||||
├─ 成功 -> 写 AppFlag + 复位 -> BL_RESET -> 启动 APP
|
||||
├─ 成功 -> 写 AppFlag=APP_BOOT_UPGRADE_FLAG + 复位 -> BL_RESET -> 启动 APP
|
||||
└─ 失败 -> 清标志 -> BL_IDLE
|
||||
```
|
||||
|
||||
@@ -257,7 +261,25 @@ BL_GET_DATA_TIMEOUT ── 重试>=3次 ──> BL_IDLE (清除升级标志)
|
||||
### 6.5 帧接收组帧 (main.c:291-329)
|
||||
|
||||
中断逐字节接收,按 0x7D 帧头、第 9 字节载荷长度、`sizeof(FrameHeader_t)+PayloadLen+2` 组帧完成判断,存入 `BL.RxBuff` 并置 `BL.RxFlag`。
|
||||
### 6.6 升级完成后的参数分区擦除(App 侧执行)
|
||||
|
||||
Boot 升级成功(CRC32 校验通过)后置 `AppFlag = APP_BOOT_UPGRADE_FLAG`(0x5A5A55A5,**每次升级均置位**)并复位;
|
||||
启动判断对该标记直接放行 `BL_START_APP`,擦除动作由 APP 侧完成:
|
||||
|
||||
```
|
||||
App GateWayInit():
|
||||
检测 AppFlag == APP_BOOT_UPGRADE_FLAG
|
||||
├─ 打印 "Upgrade done, erasing parameter partition..."
|
||||
├─ 擦除外部 SPI Flash 参数分区(扇区0~1,仅8KB,非全片擦除,历史日志保留)
|
||||
├─ AppFlag 恢复 APP_START_FLAG 并写回 Boot 参数区
|
||||
└─ 后续 ReadPara 读到空白数据 -> 自动加载 Boot 默认参数,传感器重新注册
|
||||
```
|
||||
|
||||
- 设计原因:升级后新固件的参数结构体布局可能变化,保留旧参数会导致字段错位
|
||||
(曾引发注册表乱码、传感器无法注册)。
|
||||
- 兜底机制:APP 侧参数 `SavFlag` 绑定 `PARA_LAYOUT_VER` 布局版本戳,
|
||||
布局变更时旧参数自动失效回退默认值。
|
||||
- 注意:每次升级后传感器注册表被清空,设备需重新注册。
|
||||
### 6.6 APP 跳转 (main.c:85-109)
|
||||
|
||||
校验栈顶在 SRAM 范围内后:
|
||||
|
||||
@@ -97,14 +97,14 @@ typedef enum {
|
||||
/*当前设备版本/项目选择*/
|
||||
#define GATEWAY_VER_INFO GATEWAY_VER1_0 //版本信息
|
||||
#define GATEWAY_PRJ_NUM GATEWAY_PRJ_YAXIA //项目编号
|
||||
#define GATEWAY_GW_NUM 0x0000 //网关编号(2字节, 1~65535)
|
||||
#define GATEWAY_GW_NUM 0x0003 //网关编号(2字节, 1~65535)
|
||||
|
||||
/*CAT1服务器/Lora配置 - 替代原MAC_ADDR_TYPE编译宏, 在Boot中直接配置*/
|
||||
#define GATEWAY_SVR_ADDR0 39 //服务器IP[0]
|
||||
#define GATEWAY_SVR_ADDR1 106 //服务器IP[1]
|
||||
#define GATEWAY_SVR_ADDR2 103 //服务器IP[2]
|
||||
#define GATEWAY_SVR_ADDR3 147 //服务器IP[3]
|
||||
#define GATEWAY_SVR_PORT 8080 //服务器端口
|
||||
#define GATEWAY_SVR_PORT 8083 //服务器端口
|
||||
|
||||
#define GATEWAY_LORA_FREQ CH0 //Lora中心频率(可配置为CH0~CH45)
|
||||
|
||||
|
||||
@@ -6,6 +6,7 @@
|
||||
|
||||
#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,
|
||||
@@ -72,3 +73,4 @@ typedef struct {
|
||||
uint16_t UpDateFlag;
|
||||
}BootLoader_t;
|
||||
#endif
|
||||
|
||||
|
||||
@@ -221,7 +221,9 @@ bool AnalyzeData(uint8_t *rData, uint16_t rLen)
|
||||
/*全部数据处理完成, 校验CRC32*/
|
||||
uint32_t crc32 = GetCrc32(BL.Para.AppSize);
|
||||
if(crc32 == BL.Para.Crc32Check) {
|
||||
BL.Para.AppFlag = APP_START_FLAG;
|
||||
/*置升级完成标记(每次升级均置位):Boot本身不擦除外部Flash,
|
||||
App启动时检测到此标记后擦除外部参数分区并恢复APP_START_FLAG*/
|
||||
BL.Para.AppFlag = APP_BOOT_UPGRADE_FLAG;
|
||||
BL.Para.UpdateFlag = 0;
|
||||
WriteBootPara(&BL.Para);
|
||||
BL.BootLoader1mSDlyCnt = 100;
|
||||
@@ -460,7 +462,9 @@ int32_t main(void)
|
||||
WriteBootPara(&BL.Para);
|
||||
}
|
||||
|
||||
if(BL.Para.AppFlag == APP_START_FLAG) {
|
||||
/*APP_BOOT_UPGRADE_FLAG也需直接启动App:升级完成后由App擦除外部参数分区,
|
||||
若此处不放行,设备升级完会停留在BL_IDLE等待升级命令而无法启动*/
|
||||
if(BL.Para.AppFlag == APP_START_FLAG || BL.Para.AppFlag == APP_BOOT_UPGRADE_FLAG) {
|
||||
BL.Status = BL_START_APP;
|
||||
}
|
||||
else if(BL.Para.UpdateFlag == APP_UPDATE_FLAG) {
|
||||
|
||||
Reference in New Issue
Block a user