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:
2026-09-03 19:00:41 +08:00
parent 77be326a42
commit df27be161b
4 changed files with 39 additions and 11 deletions
+29 -7
View File
@@ -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~CH45470.1MHz~492.6MHz
> #define $18083 // 服务器端口
> #define GATEWAY_LORA_FREQ CH0 // Lora 中心频率(CH0~CH45470.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 范围内后: