diff --git a/ARCHITECTURE.md b/ARCHITECTURE.md index 52ddef2..3ef6a53 100644 --- a/ARCHITECTURE.md +++ b/ARCHITECTURE.md @@ -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 范围内后: diff --git a/source/User/Inc/bsp.h b/source/User/Inc/bsp.h index 75671f9..fedfd8a 100644 --- a/source/User/Inc/bsp.h +++ b/source/User/Inc/bsp.h @@ -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) diff --git a/source/User/Inc/main.h b/source/User/Inc/main.h index a70ea61..0a05498 100644 --- a/source/User/Inc/main.h +++ b/source/User/Inc/main.h @@ -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 + diff --git a/source/User/Src/main.c b/source/User/Src/main.c index 2dc26ba..fe5e54f 100644 --- a/source/User/Src/main.c +++ b/source/User/Src/main.c @@ -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) {