ST-LINK_CLI 文档:清除过时内容,增补 09/20 上板记录与烧写铁律
This commit is contained in:
@@ -3,6 +3,7 @@
|
||||
> 依据:本机 ST-LINK Utility 4.5.0.0 自带 `ST-LINK_CLI.exe`(CLI 版本 v3.5.0.0,`-h` 全文已实测核对)+ ST 官方文档语义。
|
||||
> 探针路径:`C:\Program Files (x86)\STMicroelectronics\STM32 ST-LINK Utility\ST-LINK Utility\ST-LINK_CLI.exe`
|
||||
> 2026-09-19 已上板实测(ST-LINK/V2,FW V2J37S7,SN `0B250D12A218303030303032`;STM32F407ZGTx 目标,SWD)。
|
||||
> 2026-09-20 复测(V0.1 板):烧写静默失败根因闭环、完整启动闭环(详见 §10)。
|
||||
> ⚠️ **本机接线:3 根线(SWDIO / SWCLK / GND),nRST 未接** → 能力边界见 §0,实测记录见 §9。
|
||||
> 文中标注 ⓞ 的为"官方帮助/文档说法"与"本机实测"不一致处的更正。
|
||||
|
||||
@@ -10,7 +11,7 @@
|
||||
|
||||
## 0. 本机接线与能力边界(先读)
|
||||
|
||||
当前 V2 板 ↔ ST-LINK/V2 只接了 **3 根线**:
|
||||
当前板(V0.1;09/19 上板实测时为 V2 板,接线相同)↔ ST-LINK/V2 只接了 **3 根线**:
|
||||
|
||||
| 线 | 目标端 | 探针端 | 状态 |
|
||||
|---|---|---|---|
|
||||
@@ -25,7 +26,7 @@
|
||||
|---|---|---|
|
||||
| 软件系统复位(`-Rst`,SYSRESETREQ) | ✅ | **本机"重启板子"的唯一方式** |
|
||||
| 停核/运行/单步/断点(`-Halt`/`-Run`/`-Step`/`-SetBP`) | ✅ | 调试用 |
|
||||
| 内存/Flash 读写、擦除、校验(`-r*`/`-w*`/`-P`/`-V`/`-ME`/`-SE`/`-Cksum`) | ✅ | |
|
||||
| 内存/Flash 读写、擦除、校验(`-r*`/`-w*`/`-P`/`-V`/`-ME`/`-SE`/`-CmpFile`) | ✅ | |
|
||||
| 不扰连接 / 低功耗唤醒 / 读电压 / 枚举探针(`HOTPLUG`/`LPM`/`-TVolt`/`-List`) | ✅ | |
|
||||
| nRST 引脚操作(`-HardRst`、`RM=Hrst`) | ❌ | **双重障碍**:① nRST 未接线(无信号可驱动)② v3.5.0.0 CLI 拒识 `RM=`(ⓞ,见 §2③) |
|
||||
| 复位态连接(`UR`) | ❌ | 需要 nRST 接线才能"按住复位连接" |
|
||||
@@ -107,6 +108,7 @@ ST-LINK_CLI -c SWD -P "MDK-ARM\STM32F407-Demo\STM32F407-Demo.hex" -Rst -Run
|
||||
- ⓞ **`.hex` 直接支持已实测**:1MB Intel HEX 编程耗时 **6.5s**,`Programming Complete`(远快于 UV4/CMSIS-DAP 路径);`.bin` 同理(`fromelf --bin` 可转,ARMCC 自带 `C:\Keil_v5\ARM\ARMCC\bin\fromelf.exe`);`.axf` 直读未测,无需。
|
||||
- 加 `-V` 编程后校验、`-Q` 静默。
|
||||
- 与 `download.bat`(`UV4 -f` 走 CMSIS-DAP)功能等价;脚本化场景用 CLI 更轻,两者并存。
|
||||
- ⓞ **静默失败模式(2026-09-20 实测,代价最大的坑)**:省略结尾 `-Rst -Run` 的裸 `-c SWD -P <文件>` 仍报 `Memory programmed in 1s 906ms / Programming Complete`,但芯片 flash **不变**(回读向量表 = 旧镜像)——目标核处于死循环/异常状态时,"Normal 连接、不复位"的会话写入不落地;同文件改用完整 `-P <文件> -Rst -Run` 即正常落地(6.5s / 1MB)。**铁律:任何编程命令必须以 `-Rst -Run` 收尾;任何烧录之后必须 `-CmpFile` 全片回读校验**(详见 §10)。
|
||||
|
||||
### ⑥ 不扰目标连接(HOTPLUG,运行中板子的只读检查)✅ 本机可用
|
||||
|
||||
@@ -149,7 +151,7 @@ ST-LINK_CLI -c SWD HOTPLUG -Dump 20000000 1000000 dump.bin :: 转储 SRAM
|
||||
| `-r8/-r16/-r32 <地址> <数量>` | 读内存(地址、数量均为**十六进制**) |
|
||||
| `-w8/-w32/-w64 <地址> <数据>` | 写内存 |
|
||||
| `-Dump <地址> <大小> <文件>` | 内存转储到文件 |
|
||||
| `-Cksum <文件\|地址+大小>` | 校验和(对比 Flash 与文件) |
|
||||
| `-CmpFile <文件> [地址]` | 全片 Flash 与文件逐字节比对(2026-09-20 实测:`No difference found` = 真写入;v3.5.0.0 无 `-Cksum` 命令) |
|
||||
| `-P <文件> [地址] [ske] [skpv]` | 编程(ske=跳擦除 skpv=跳校验) |
|
||||
| `-V [after_programming]` | 校验 |
|
||||
| `-ME` / `-SE <扇区>` | 全片擦除 / 扇区擦除(⚠️ RDP≠0 时 `-ME` 会被拒) |
|
||||
@@ -178,7 +180,7 @@ Get-Content tools\serial_tool\state\serial.log -Tail 100
|
||||
2. **复位刚发生的几秒内 `wait-idle` 可能报 `daemon unresponsive after auto-start: timed out`**——daemon 正在排空开机日志突发,数据其实已落盘;
|
||||
3. **日志校验直接读文件最可靠**:`tools/serial_tool/state/serial.log` 用 Read/Grep/Select-String 直接查(实测 `log --grep` 子命令对确定存在的标记返回 0 命中,语义存疑,勿作为判定依据)。
|
||||
|
||||
**B. 完整烧写 + 运行**:`MDK-ARM\reset.bat flash [xxx.hex]`(= `-c SWD -P <hex> -Rst -Run`;实测 1MB 约 7s 完成)。正式流程仍以 `download.bat`(`UV4 -f`)为准,CLI 路径作为脚本化/快速路径。
|
||||
**B. 完整烧写 + 运行**:`MDK-ARM\reset.bat flash [xxx.hex]`(= `-c SWD -P <hex> -Rst -Run`;09/19 实测 1MB ≈ 6.5s,09/20 复测 6.47s + 全片 `-CmpFile` 逐字节一致)。正式流程仍以 `download.bat`(`UV4 -f`)为准,CLI 路径作为脚本化/快速路径。
|
||||
|
||||
**C. 救援**(板子起不来 / 疑似 Flash 问题)——本机 3 线接线的可行子集:
|
||||
|
||||
@@ -203,7 +205,7 @@ ST-LINK_CLI -c SWD -P "MDK-ARM\STM32F407-Demo\STM32F407-Demo.hex" -Rst -Run
|
||||
| `reset.bat halt` | `-c SWD -Rst -Halt` | ✅ 复位停核(一次性会话,读状态须同命令行附加;断开后核自动恢复运行) |
|
||||
| `reset.bat run` | `-c SWD -Run` | ✅ 恢复被停核的目标 |
|
||||
| `reset.bat list` | `-List` | ✅ 枚举探针 |
|
||||
| `reset.bat flash [F]` | `-c SWD -P F -Rst -Run`(F 缺省 = 最新构建 `MDK-ARM\STM32F407-Demo\STM32F407-Demo.hex`) | ✅ 烧写 + 复位 + 运行(1MB ≈ 7s) |
|
||||
| `reset.bat flash [F]` | `-c SWD -P F -Rst -Run`(F 缺省 = 最新构建 `MDK-ARM\STM32F407-Demo\STM32F407-Demo.hex`) | ✅ 烧写 + 复位 + 运行(1MB ≈ 6.5s;2026-09-20 复测验证,见 §10) |
|
||||
|
||||
退出码:`0`=成功;`1`=探针/目标错误;`2`=用法或工具缺失。
|
||||
注意:bat 内 `STLINK` 变量**不带引号**、调用处再加引号(`set VAR="带空格路径"` 会把引号存进变量,导致 `if not exist` 与执行都失败——2026-09-19 实测踩坑并已修复);bat 文件必须 **CRLF** 行尾(LF 会破坏 `:label` 解析)。
|
||||
@@ -217,6 +219,7 @@ ST-LINK_CLI -c SWD -P "MDK-ARM\STM32F407-Demo\STM32F407-Demo.hex" -Rst -Run
|
||||
| 连接失败 | 目标供电;SWDIO/SWCLK 接线(本机 3 线,勿依赖 nRST 辅助);芯片休眠 → 加 `LPM`;看门狗反复复位 → 提高连接速度(本机无 `UR` 可用);RDP 被锁 → 只能读有限信息 |
|
||||
| 复位后程序没跑 | 读复位向量确认 Flash 有效:`-R32 0x08000000 1`(应指向 0x08xxxxxx,`0xFFFFFFFF`=空片);查 BOOT0 状态;看串口是否有输出 |
|
||||
| 复位后卡死(串口日志中断在半路) | ⓞ 2026-09-19 实测案例:`-c SWD HOTPLUG -SCore -CoreReg` 读 PC/寄存器定位卡点(案例:V2 引脚固件卡在 0x08000FA0 启动循环,见 §9)——**先定位再下结论**,勿直接怀疑探针 |
|
||||
| 烧录报成功但芯片行为不变 | ⓞ **先怀疑静默写入失败**(2026-09-20 实测):命令缺 `-Rst -Run`(裸 `-P` 在目标核死循环/异常时不落地)或选项字节异常(RDP 字节非法,见 §10.4)。处置:`-CmpFile` 全片比对/回读向量表首字 → 用 `reset.bat flash` 重烧 → 再 `-CmpFile` 复核;勿直接怀疑探针/接线 |
|
||||
| `daemon unresponsive after auto-start`(serial_tool) | ⓞ 复位后几秒内 daemon 忙于排空日志突发;稍等后直接读 `state/serial.log` 文件验证,勿反复重试 |
|
||||
| `port not found: COMx (available: COMy)`(serial_tool) | ⓞ 端口重新枚举(板子重插常见):改 `.opencode/serial_config.json` → **kill 旧 daemon 进程** → 重新 `open`(daemon 启动时缓存配置,不重启不生效) |
|
||||
| `log --grep` 查不到明明存在的标记 | ⓞ 该子命令实测不可靠(0 命中);改用直接读/`Select-String` 查 `state/serial.log` |
|
||||
@@ -254,7 +257,7 @@ ST-LINK_CLI -c SWD -P "MDK-ARM\STM32F407-Demo\STM32F407-Demo.hex" -Rst -Run
|
||||
| 8 | 13:45 | `-c SWD RM=Hrst -HardRst PULSE=100`(4 种语法排列) | ❌ v3.5.0.0 全部拒 `RM=`(`Unknown debug protocol or option`)→ CLI 层无 nRST 能力(且本机 nRST 未接线) |
|
||||
| 9 | 13:4x | `reset.bat list / (默认)/ hard / halt / run` | ✅ 全分支 exit=0;`hard` 分支按设计回退软件复位(RESET_NOTE);`halt` 断开后核自动恢复运行 |
|
||||
| 10 | 13:59 | `reset.bat flash`(= `-P <hex> -Rst -Run`) | ✅ `.hex` 直接支持:**1MB 编程 6.5s**,`Programming Complete` → `MCU Reset` → `Application started`,exit=0 |
|
||||
| 11 | 13:59 | 烧录后启动观察 | ⚠️ **V2 引脚固件启动异常**:日志到 `[APP] RS485 init: OK` 后中断(无 GD5F/TPAFE/存储/UI 后续日志,无二次重启);核状态回读:`Core is Running`,**PC=0x08000FA0**(启动区死循环,LR=0x08000FA5,SP 正常推进)→ 疑似 v2-on-ui 构建的启动阶段问题,**排查中**(待办:反汇编该地址 + 对比 V1 引脚构建行为) |
|
||||
| 11 | 13:59 | 烧录后启动观察 | ⚠️ **V2 引脚固件启动异常**:日志到 `[APP] RS485 init: OK` 后中断(无 GD5F/TPAFE/存储/UI 后续日志,无二次重启);核状态回读:`Core is Running`,**PC=0x08000FA0**(启动区死循环,LR=0x08000FA5,SP 正常推进)→ 根因 2026-09-20 闭环:芯片上是合并前旧向量表镜像(DMA2_Stream3 中断落空槽 → `B .` 死循环,PC=0x08000FA0 即该死循环),且此后所有"重下载"均静默失败(芯片从未更新)→ 详见 §10 |
|
||||
|
||||
**结论**:
|
||||
|
||||
@@ -262,4 +265,37 @@ ST-LINK_CLI -c SWD -P "MDK-ARM\STM32F407-Demo\STM32F407-Demo.hex" -Rst -Run
|
||||
2. **本机复位能力 = 软件系统复位**:nRST 未接线 + v3.5.0 CLI 不支持 `RM=`,nRST 引脚级操作不可用(`reset.bat hard` 自动回退,不影响脚本闭环);需要时补 nRST 线 + 升级工具链。
|
||||
3. 停核 = `-Rst -Halt`(停点不保证是复位向量,实测 0x08004664);一次性连接语义——断开即恢复运行。
|
||||
4. **烧录路径打通**:`-P <hex>` 实测可用(1MB ≈ 6.5s,比 UV4 快得多),`reset.bat flash` 可作为快速烧录通道。
|
||||
5. ⚠️ **发现新问题**:v2-on-ui(V2 引脚)固件在本板上启动卡死(PC=0x08000FA0),旧固件正常——与 ST-LINK 无关,属固件/引脚配置问题,另行排查(见 `docs/问题记录/` 后续条目)。
|
||||
5. ✅ **问题已闭环(2026-09-20)**:09/19 启动卡死(PC=0x08000FA0)根因 = 芯片一直是合并前旧向量表镜像(09/19 之后所有下载均静默失败:裸 `-P` 不带 `-Rst -Run` 不落地)+ 内核启动前 `osMessageQueueNew` 代码缺陷;修复已提交(v2-on-ui `82411cf`),V0.1 板完整启动已验证(63 行日志 + 全片 `-CmpFile` 一致,见 §10)。
|
||||
|
||||
## 10. 2026-09-20 复测记录(V0.1 板:静默失败闭环 + 铁律)
|
||||
|
||||
### 10.1 静默失败模式(ⓞ 新实测)
|
||||
|
||||
- 裸 `-c SWD -P <文件>`(**不带 `-Rst -Run`**):报 `Memory programmed in 1s 906ms / Programming Complete`,但芯片 flash **不变**(回读向量表首字 = 旧镜像 SP 0x2001E998)。目标核在 flash `B .` 死循环中旋转时,"Normal 连接、不复位"会话的写入不落地。
|
||||
- 同文件加 `-Rst -Run`(即 `reset.bat flash`):正常落地(6.47s / 1MB,`Programming Complete → MCU Reset → Application started`,exit=0),全片 `-CmpFile` 回读逐字节一致。
|
||||
- **结论(铁律)**:任何编程命令必须以 `-Rst -Run` 收尾;**任何烧录之后必须 `-CmpFile` 全片回读校验**(`-c SWD -CmpFile <文件> 0x08000000` → `No difference found`);`Programming Complete` 单独不构成成功证据。
|
||||
|
||||
### 10.2 上板实测记录
|
||||
|
||||
| # | 时间 | 操作 | 结果 |
|
||||
|---|---|---|---|
|
||||
| 1 | ~00:10 | 裸 `-c SWD -P <bin> -NoPrompt`(不复位) | ❌ 报 `Programming Complete` 但芯片内容不变(向量表 = 旧镜像)→ **静默失败确认** |
|
||||
| 2 | 00:24 | `reset.bat flash`(= `-P <hex> -Rst -Run`,245,704 B / 1MB) | ✅ 6.47s:`Programming Complete` → `MCU Reset` → `Application started`,exit=0 |
|
||||
| 3 | 00:27 | 软件复位(`-c SWD -Rst -Run`)+ 串口采集 | ✅ 完整 63 行开机日志:`App init OK` / `Network Init` / `net init: OK` / `PHY: 100M FULL` / UI port/menu init OK / standby ready / net sink started,0 HardFault/FAIL/ERROR |
|
||||
| 4 | 00:28 | `-c SWD -CmpFile <bin> 0x08000000` 全片比对 | ✅ `No difference found`(245,704 B 逐字节一致,@4MHz SWD 约 1 分钟) |
|
||||
| 5 | 00:29 | `-c SWD HOTPLUG -SCore` / `-TVolt` | ✅ `Core is Running`;VDD 3.1V(PC 口供电偏低,建议 5V) |
|
||||
|
||||
> 09/20 开机日志含两条**非致命** ERR(与 ST-LINK 无关,固件/板级跟进项):`[ADC] Init wait BUSY timeout`(启动继续)/ `[SYSLOG] write /log/*.log fail (7)`(NAND 卷遗留旧 /log 文件不兼容,串口镜像正常)。
|
||||
|
||||
### 10.3 根因闭环(09/19 13:59 启动卡死 + "二分法失效")
|
||||
|
||||
- PC=0x08000FA0(启动区 `B .` 死循环)= 芯片上是**合并前(UI 时代)旧向量表镜像**:旧表把 DMA2_Stream2/3 处理函数值放在 v78/v79(S6/S7 槽,回读 0x9F1/0x9FD 为挪位实证),真实 DMA2_Stream3 槽(v75)无有效处理函数 → 开机第 3 行后 gd5f 第一笔 SPI1_TX DMA(DMA2_Stream3)完成中断 → 空槽 → 死循环,确定性死亡。
|
||||
- **09/19 之后所有"重下载"(CLI/Keil 多次)均为静默失败**(芯片从未更新:向量表首字回读始终是旧值)→ 代码改动看似无效、二分法全程失效。
|
||||
- 代码层缺陷(一并修复):`syslog_mcu_init` 在内核启动前调用 `osMessageQueueNew`(CMSIS 队列 API 内核启动前不可用)→ 改为 `syslog_drain` 内惰性创建(STORAGE_READY 之后,defaultTask 上下文)(提交 `82411cf`)。
|
||||
- 新镜像(仓库现行 CubeMX 生成启动文件,该文件全程未人工改动)已逐槽核验:4 条活跃 DMA 流(SPI1 RX/TX → DMA2_Stream0/3,SPI2 RX/TX → DMA1_Stream3/4)+ EXTI9_5/TIM7/UART4 均为真实处理函数;USART1 调试 DMA(DMA2_Stream2/7)为休眠配置(代码从不启动)→ **新镜像无向量表层死点**。
|
||||
|
||||
### 10.4 选项字节异常(芯片状态,2026-09-20 实测,待清理)
|
||||
|
||||
- `0x1FFF0800 = 0x7AA16001`:RDP 字节 = **0x01**(合法出厂值仅 0xAA/0xFF/0xCC)+ WRP 残留(0x60/0xA1,nWRP 位置位)。
|
||||
- 该状态**未阻碍** 09/20 的全片擦除 + 烧写(CLI/Keil 两次写入均成功),但为 09/19~09/20 烧录静默失败的头号嫌疑(疑似当时某次被中断的选项字节写入遗留)。
|
||||
- 清理建议:RDP→0xAA、WRP→0x00。本机未装 STM32CubeProgrammer(ST-LINK_CLI v3.5.0.0 亦无选项字节写命令)→ 用 Keil 烧录算法的选项字节对话框操作(或升级 ST-LINK Utility / 安装 CubeProgrammer)。
|
||||
|
||||
Reference in New Issue
Block a user