# 出厂认证信息恢复 本文档用于解决因执行 `Full chip erase`、`Mass erase` 或“全片擦除”等操作,误删出厂认证信息,导致原厂固件无法正常运行的问题;自定义固件不依赖该认证信息,不受影响。 开发板有两颗 STM32F407,本文档按 PCB 丝印记为 `STM32(1)` 和 `STM32(2)`。单个 USB Type-C 通过板载 USB HUB 同时连接两颗 MCU,因此 COM 编号、名称和设备管理器中的 排列顺序均不能表示 MCU 编号。 本流程先只给丝印 `STM32(1)` 对应的 MCU 烧录 UID Reader,唯一返回 UID Reader 信息的 MCU 就是 `STM32(1)`;再给 `STM32(2)` 烧录,与第一次不同的新 UID 就是 `STM32(2)`。后续始终使用这两个已标记的 UID 进行恢复和复核。 > **重要:** 整个过程中禁止执行 `Full chip erase`、`Mass erase`、“全片擦除”或修改 > Option Bytes。 ## 下载 | 软件或文件 | 用途 | 下载 | | --- | --- | --- | | UID Reader V3 HEX | 读取硬件 UID,并检查 Sector 7 状态 | [下载 sanpo_v4_uid_reader.hex](https://gitcode.com/sanpo/robot/blob/main/products/spine/v4/f407/firmware/recovery/sanpo_v4_uid_reader.hex) | | UID Reader 校验值 | 校验 UID Reader BIN/HEX | [下载 SHA256SUMS.txt](https://gitcode.com/sanpo/robot/blob/main/products/spine/v4/f407/firmware/recovery/SHA256SUMS.txt) | | UartAssist | Windows 串口调试工具 | [下载 UartAssist.zip](https://gitcode.com/sanpo/robot/blob/main/products/spine/v4/f407/tools/UartAssist.zip) | | STM32CubeProgrammer | 使用 ST-LINK 烧录和校验固件 | [下载 STM32CubeProgrammer_win64.zip](https://gitcode.com/sanpo/robot/blob/main/products/spine/v4/f407/tools/STM32CubeProgrammer_win64.zip) | | Spine V4 V47 原厂固件 | 认证恢复并复核成功后烧录 | [下载 spine_v4_v47_release.bin](https://gitcode.com/sanpo/robot/blob/main/products/spine/v4/f407/firmware/spine_v4_v47_release.bin) | 客服返回的 `STM32_1__sector7.hex` 和 `STM32_2__sector7.hex` 是设备专属 认证文件,不能从公共仓库下载,也不能使用其他开发板的文件代替。 ## 一、准备工具 1. 下载并解压 `UartAssist.zip`,运行其中的 `UartAssist 5.0.2.exe`,无需安装。 2. 下载、解压并打开 STM32CubeProgrammer。 3. 下载 `sanpo_v4_uid_reader.hex`。 4. 准备 ST-LINK、USB 数据线,并确认 PCB 上 `STM32(1)`、`STM32(2)` 的丝印位置。 5. 每次只把 ST-LINK 接到当前要操作的 MCU,USB Type-C 保持连接。 ## 二、读取并标记两颗 MCU 的硬件信息 ### 1. 先读取 STM32(1) 1. 按 PCB 丝印把 ST-LINK 接到 `STM32(1)` 的 SWD 接口,给开发板上电。 2. 在 STM32CubeProgrammer 右上角选择 `ST-LINK`: - Port:`SWD` - Frequency:保持默认;连接不稳定时可降低 - Reset mode:先用默认设置;连接失败时改为 `Under Reset` 3. 点击 `Connect`,确认日志显示芯片为 STM32F407。 4. 打开 `Erasing & Programming`,选择 `sanpo_v4_uid_reader.hex`。HEX 自带 `0x08000000` 地址,不需要手工填写地址。 5. 勾选 `Verify programming`,点击 `Start Programming`。成功后点击 `Disconnect`, 让开发板重新上电或复位。 6. 等待 USB HUB 完成枚举。此时可能只出现一个 COM 口,也可能因另一颗 MCU 原有固件 仍能运行而出现两个;在 UartAssist 中依次检查当前出现的所有 COM 口: - 波特率:`115200` - 数据位:`8` - 停止位:`1` - 校验位:`None/无` - 流控:`None/无` - 发送和接收:文本/ASCII 模式,不使用 HEX - 换行方式:`CRLF` ![串口工具设置](assist.png) 7. 分别发送 `AT+HWINFO`,不要输入字符形式的 `\r\n`。此时只有烧入 UID Reader 的 `STM32(1)` 会返回以下格式的信息: ```text SANPO_V4_HWINFO,V=3,UID=XXXXXXXX-XXXXXXXX-XXXXXXXX,SECUID=FFFFFFFF-FFFFFFFF-FFFFFFFF,DEVID=413,REVID=XXXX,FLASHKB=512,SECTOR7=BLANK ``` 8. 完整复制该行,明确标记为 `STM32(1)`。不要保存或依赖当前 COM 编号,因为重新插拔 或复位后编号和顺序可能改变。 如果没有端口返回 `SANPO_V4_HWINFO,V=3`,或出现两个不同的 V3 回复,不要继续;应检查 烧录目标和日志后联系客户服务。 ### 2. 再读取 STM32(2) 1. 把 ST-LINK 改接到 PCB 丝印 `STM32(2)` 对应的 SWD 接口。 2. 按与 STM32(1) 相同的方法烧录并校验 `sanpo_v4_uid_reader.hex`,然后重新上电或复位。 3. 使用 UartAssist 依次打开 USB HUB 枚举出的所有 COM 口并发送 `AT+HWINFO`。 4. 此时应取得两行不同的 `SANPO_V4_HWINFO,V=3`: - `UID` 与第一次保存值相同的一行是 `STM32(1)`; - 新出现且与第一次不同的 `UID` 是 `STM32(2)`。 5. 完整复制新的一行并明确标记为 `STM32(2)`。 如果没有得到两个不同的 UID,不要猜测 MCU 与 COM 的对应关系,应重新检查第二次烧录和 所有 COM 口。 ### 3. 发送给客服 发送两行完整原文,并保留下列标签: ```text STM32(1): SANPO_V4_HWINFO,V=3,UID=........-........-........,SECUID=........-........-........,DEVID=413,REVID=....,FLASHKB=512,SECTOR7=.... STM32(2): SANPO_V4_HWINFO,V=3,UID=........-........-........,SECUID=........-........-........,DEVID=413,REVID=....,FLASHKB=512,SECTOR7=.... ``` ## 三、确认客服返回的恢复包 恢复目录应包含: - `STM32_1__sector7.hex`:只用于 PCB 丝印 `STM32(1)` 对应的 MCU - `STM32_2__sector7.hex`:只用于 PCB 丝印 `STM32(2)` 对应的 MCU - `spine_v4_official.bin` - `manifest.json` - `SHA256SUMS.txt` - 客户恢复操作说明 两个 Sector 7 文件名同时包含 MCU 位置标签和该 MCU 的硬件 UID。烧录前必须核对文件名 中的 UID 与第二节保存的对应 UID 完全一致;不能交换两份文件。 UID Reader 报告字段含义: - `UID`:当前 MCU 的实际硬件 UID。 - `SECUID`:Sector 7 中记录的 UID;空白时通常为全 `F`。 - `BLANK`:Sector 7 认证块为空。 - `INVALID`:Sector 7 格式、长度、结束标记或 CRC 错误。 - `UID_MISMATCH`:`SECUID` 与当前芯片实际 `UID` 不同,说明专属 HEX 烧错了 MCU。 - `UID_MATCH`:`SECUID` 与实际 `UID` 相同,且格式和 CRC 正确。 ## 四、恢复并复核 STM32(1) 1. 按 PCB 丝印把 ST-LINK 接到 `STM32(1)` 的 SWD 接口。 2. 在 STM32CubeProgrammer 中连接目标,打开 `Erasing & Programming`,选择 `STM32_1__sector7.hex`。HEX 自带 `0x08070000` 地址,不要修改地址。 3. 勾选 `Verify programming`,点击 `Start Programming`。成功后断开连接并让开发板 重新上电或复位;此时 UID Reader 仍在运行。 4. 用 UartAssist 依次查询当前枚举出的所有 COM 口。根据第二节保存的硬件 UID 找到 `STM32(1)` 的回复,不根据 COM 编号判断。 5. 必须同时满足以下三项: - `UID` 与之前标记的 `STM32(1)` UID 完全相同; - `SECUID` 与 `UID` 完全相同; - `SECTOR7=UID_MATCH`。 6. 满足后才能重新连接 STM32CubeProgrammer,选择恢复包中的 `spine_v4_official.bin`,手工填写下载地址 `0x08000000`,保持 `Verify programming` 勾选并开始烧录。 如出现 `UID_MISMATCH`、`INVALID` 或 UID 不符,禁止继续烧正式固件。保存 UID Reader 回复和 STM32CubeProgrammer 日志并联系客户服务;不要执行全片擦除。 ## 五、恢复并复核 STM32(2) 1. 按 PCB 丝印把 ST-LINK 改接到 `STM32(2)` 的 SWD 接口。 2. 选择 `STM32_2__sector7.hex`,按与 STM32(1) 相同的方法烧录并校验。 3. 在正式固件覆盖 UID Reader 前,再次查询当前枚举出的所有 COM 口。根据已保存的硬件 UID 找到 `STM32(2)` 的回复,并确认 `UID=SECUID` 且 `SECTOR7=UID_MATCH`。 4. 确认无误后,才把恢复包中的 `spine_v4_official.bin` 写入 `0x08000000`。 ## 六、最终确认 1. 两颗 MCU 全部完成后,让开发板完全断电 10 秒再上电。 2. 使用 UartAssist 分别打开 USB HUB 枚举出的两个 COM 口,以文本模式、CRLF 发送 `AT+VER`,确认两个端口都返回正式固件版本。 3. 按实际用途检查 CAN、RS485、SPI 和电机通信。 `AT+VER` 只用于确认正式固件最终运行,不能单独证明 Sector 7 文件烧到了正确 MCU。 对应关系必须以正式固件烧录前 UID Reader 返回的 `UID=SECUID` 和 `SECTOR7=UID_MATCH` 为准。 出现下载失败、状态异常或正式固件无响应时,应停止操作,保存两颗 MCU 已标记的完整 `SANPO_V4_HWINFO` 原文和 STM32CubeProgrammer 日志并联系客户服务。