feat: 完善Mesh继电器OTA升级闭环
This commit is contained in:
@@ -1,6 +1,6 @@
|
||||
# STM8 Mesh 继电器 OTA、Flash 分区与业务协议设计
|
||||
|
||||
本文档记录当前已经确认的外部 W25Q64 存储规划、Bootloader 启动策略、主程序 OTA 职责以及业务命令规则。
|
||||
本文档记录当前已经确认的外部 W25Q80BV存储规划、Bootloader启动策略、主程序OTA职责以及业务命令规则。
|
||||
|
||||
## 1. 硬件资源与程序分区
|
||||
|
||||
@@ -17,23 +17,23 @@ STM8S003F3P6TR 内部程序 Flash 总容量为 8KiB,地址范围为 `0x8000~0x
|
||||
|
||||
应用程序必须按照 `0x8800` 重新链接,不能使用默认的 `0x8000` 起始地址。
|
||||
|
||||
### 1.2 W25Q64JVSIQ 外部 Flash
|
||||
### 1.2 W25Q80BV 外部 Flash
|
||||
|
||||
W25Q64 总容量为 8MiB。当前固定分区如下:
|
||||
W25Q80BV总容量为128KiB。当前固定分区如下:
|
||||
|
||||
| 地址范围 | 容量 | 用途 |
|
||||
|---|---:|---|
|
||||
| `0x000000~0x00FFFF` | 64KiB | 出厂固件镜像 |
|
||||
| `0x010000~0x010FFF` | 4KiB | 出厂固件元数据 |
|
||||
| `0x020000~0x02FFFF` | 64KiB | OTA升级固件镜像 |
|
||||
| `0x030000~0x030FFF` | 4KiB | OTA升级元数据 |
|
||||
| 其余空间 | 约8056KiB | 后续日志、运行记录、故障记录等 |
|
||||
| `0x000000~0x001FFF` | 8KiB | 出厂固件镜像 |
|
||||
| `0x002000~0x002FFF` | 4KiB | 出厂固件元数据 |
|
||||
| `0x003000~0x004FFF` | 8KiB | OTA升级固件镜像 |
|
||||
| `0x005000~0x005FFF` | 4KiB | OTA升级元数据 |
|
||||
| `0x006000~0x01FFFF` | 104KiB | 后续日志、运行记录、故障记录等 |
|
||||
|
||||
元数据区域均独占一个4KiB扇区,避免擦除元数据时影响固件镜像。
|
||||
|
||||
### 1.3 SPI连接
|
||||
|
||||
| STM8引脚 | W25Q64信号 |
|
||||
| STM8引脚 | W25Q80BV信号 |
|
||||
|---|---|
|
||||
| `PC5` | `SCK` |
|
||||
| `PC6` | `MOSI/DI` |
|
||||
@@ -76,19 +76,19 @@ JDY-28M 控制脚当前分配为:`PA2=PWRC`、`PD2=RESET`。`PA2` 不再作为
|
||||
|
||||
### 2.2 元数据绝对地址
|
||||
|
||||
OTA元数据区域起始地址为 `0x030000`,因此:
|
||||
OTA元数据区域起始地址为 `0x005000`,因此:
|
||||
|
||||
```text
|
||||
魔数: 0x030000~0x030003
|
||||
固件长度: 0x030004~0x030007
|
||||
固件版本: 0x030008~0x030009
|
||||
CRC16: 0x03000A~0x03000B
|
||||
有效标志: 0x03000E
|
||||
升级请求: 0x03000F
|
||||
升级结果: 0x030010
|
||||
魔数: 0x005000~0x005003
|
||||
固件长度: 0x005004~0x005007
|
||||
固件版本: 0x005008~0x005009
|
||||
CRC16: 0x00500A~0x00500B
|
||||
有效标志: 0x00500E
|
||||
升级请求: 0x00500F
|
||||
升级结果: 0x005010
|
||||
```
|
||||
|
||||
出厂元数据区域起始地址为 `0x010000`,字段偏移相同,因此出厂镜像升级结果地址为 `0x010010`。
|
||||
出厂元数据区域起始地址为 `0x002000`,字段偏移相同,因此出厂镜像升级结果地址为 `0x002010`。
|
||||
|
||||
### 2.3 魔数
|
||||
|
||||
@@ -128,7 +128,7 @@ Bootloader负责:
|
||||
- 读取OTA元数据;
|
||||
- 校验OTA固件CRC16/MODBUS;
|
||||
- 擦除STM8内部应用区;
|
||||
- 从W25Q64搬运固件到内部Flash;
|
||||
- 从W25Q80BV搬运固件到内部Flash;
|
||||
- 回读校验内部Flash;
|
||||
- 写入升级结果;
|
||||
- 清除升级请求;
|
||||
@@ -139,7 +139,7 @@ Bootloader负责:
|
||||
升级安全顺序必须是:
|
||||
|
||||
```text
|
||||
先完整校验W25Q64固件
|
||||
先完整校验W25Q80BV固件
|
||||
↓
|
||||
CRC正确
|
||||
↓
|
||||
@@ -165,7 +165,7 @@ CRC正确
|
||||
- 内部Flash写入后校验失败;
|
||||
- 应用程序损坏导致无法正常启动。
|
||||
|
||||
出厂镜像必须预先写入W25Q64,并且出厂元数据中的镜像有效标志和CRC16必须正确。
|
||||
出厂镜像必须预先写入W25Q80BV,并且出厂元数据中的镜像有效标志和CRC16必须正确。
|
||||
|
||||
## 4. PA3上电恢复按键
|
||||
|
||||
@@ -199,7 +199,7 @@ CRC正确
|
||||
- 通过JDY-28M接收OTA业务帧;
|
||||
- 校验业务帧CRC16/MODBUS;
|
||||
- 擦除OTA固件区域;
|
||||
- 将固件分包写入 `0x020000`;
|
||||
- 将固件分包写入 `0x003000`;
|
||||
- 计算完整固件CRC16/MODBUS;
|
||||
- 写入OTA元数据;
|
||||
- 设置有效标志和升级请求;
|
||||
@@ -288,7 +288,7 @@ OTA内部控制命令建议保留:
|
||||
0x03:内部Flash写入失败
|
||||
0x04:写入后校验失败
|
||||
0x05:固件长度非法
|
||||
0x06:W25Q64读取失败
|
||||
0x06:W25Q80BV读取失败
|
||||
```
|
||||
|
||||
主程序启动后读取升级结果,并使用:
|
||||
@@ -300,3 +300,29 @@ DATA = 升级结果码
|
||||
```
|
||||
|
||||
发送给主机。主机确认后,主程序清除结果字段。
|
||||
|
||||
### 8.3 主机侧最终确认流程
|
||||
|
||||
`CMD=0x8B`仅表示应用程序已经完成外部Flash固件的整包CRC16校验,并且
|
||||
已经成功写入OTA元数据。校验成功后,设备先发送`0x8B=00`,再主动触发
|
||||
MCU复位;Bootloader随后负责把OTA镜像搬运到内部Flash。
|
||||
|
||||
主机不能在收到`0x8B=00`后立即认为升级完成,而应继续等待设备重新启动并
|
||||
主动上报:
|
||||
|
||||
```text
|
||||
CMD = 0x0D
|
||||
LEN = 0x01
|
||||
DATA[0] = 0x01:Bootloader搬运并校验成功
|
||||
```
|
||||
|
||||
主机默认等待20秒。超时未收到`0x0D`,或者收到的结果码不是`0x01`,均应
|
||||
判定本次升级失败。收到结果后,主机向上报帧的设备短地址发送:
|
||||
|
||||
```text
|
||||
CMD = 0x8D
|
||||
LEN = 0x01
|
||||
DATA[0] = 原样返回设备上报的升级结果码
|
||||
```
|
||||
|
||||
设备收到`0x8D`后清除待上报结果记录。
|
||||
|
||||
Reference in New Issue
Block a user