5009a844a9
stlink_flash.py 新增 hard 子命令(-c SWD RM=Hrst -HardRst PULSE=100), RM= 被 CLI 拒绝时自动降级为系统复位并打印 RESET_NOTE;至此 reset.bat 的 全部子命令(复位/hard/halt/run/list/flash/cmp)均已由 skill 覆盖。 删除 MDK-ARM/reset.bat(git rm)。@build/@download 两条旧批处理入口至此 全部收敛到 .dsh/skills/ 下的 skill,一个能力一个实现。 同步更新引用:AGENTS.md、README、MDK-ARM/README、7 篇 docs、4 个 skill (stlink-flash/serial-boot-test/new-machine-setup 及 config.example.json)。 真机验证:hard 子命令 RM= 被拒 → RESET_NOTE → 回退系统复位 → STLINK_RC=0。
4.0 KiB
4.0 KiB
name, description, whenToUse
| name | description | whenToUse |
|---|---|---|
| stlink-flash | ST-LINK 命令行烧录/复位/回读校验(自带独立脚本 stlink_flash.py,纯标准库,拷到任何 ST-Link+STM32 项目即用):-P 烧录+复位运行 / -CmpFile 全片回读比对 / 只复位。封装"烧后必须 -Rst -Run + 回读校验"的铁律与 -CmpFile 复位目标等实测陷阱。 | 需要向 STM32 目标烧录 .hex/.bin、只复位重启目标、校验芯片内容与刚构建镜像是否一致、或排查"反复重下载芯片仍是旧镜像"类烧录假成功时。 |
stlink-flash — ST-LINK 烧录/复位/回读(独立可运行 skill)
执行体 = 本 skill 自带脚本 .dsh/skills/stlink-flash/scripts/stlink_flash.py
(纯标准库;拷整个 skill 目录到别的 ST-Link 项目即可用,不依赖仓库脚本)。
# cwd = 项目根目录
& $PY ".dsh\skills\stlink-flash\scripts\stlink_flash.py" list
& $PY ".dsh\skills\stlink-flash\scripts\stlink_flash.py" flash [hex] # 烧录 + -Rst -Run
& $PY ".dsh\skills\stlink-flash\scripts\stlink_flash.py" cmp [hex] # 回读比对(会复位目标)
& $PY ".dsh\skills\stlink-flash\scripts\stlink_flash.py" reset # 只复位运行
& $PY ".dsh\skills\stlink-flash\scripts\stlink_flash.py" hard # nRST 100ms 脉冲(CLI 拒 RM= 时自动降级为复位)
镜像缺省取项目档案 hex;ST-LINK_CLI 解析:--cli > 档案 stlink_cli >
$DSH_STLINK_CLI > $DTU_STLINK_CLI > PATH(显式设了但无效 = 立即报错,不回退)。
退出码:0=OK / 1=探针或目标错误 / 2=CLI 未找到 / 3=用法。
成功判据内置:flash = rc0 + Programming Complete;cmp = 行首 No difference found
(输出原样透传,serial-boot-test 的 readback_ok 默认值直接可用)。
本仓库
@download = 本 skill(2026-10-10 起为仓库文档口径)。原 MDK-ARM\reset.bat
(flash/cmp/halt/run/list 子命令)已并入本 skill 的
flash/cmp/reset/hard/halt/run/list 并于 2026-10-10 删除;@build/@download
两条旧批处理入口至此全部收敛到 skill(一个能力一个实现)。
环境变量 DTU_STLINK_CLI(未设回退 PATH;设了但无效 = 报错 exit 2)。
铁律与陷阱(实测教训)
- 烧录必须带
-Rst -Run,不可省略:裸-P会报Programming Complete,但目标核 处于死循环/异常状态时写入并不落地(芯片内容不变)——"反复重下载、芯片一直是旧镜像、 二分法失效"的根因。上层若做自动闭环,固件里加编译期身份戳(fw build: __DATE__ __TIME__)才能把这种假成功揪出来(serial-boot-test 的fw_marker机制)。 - 烧录后必须回读校验:
-CmpFile全片逐字节比对,No difference found才算真写入; 不一致 = 本次运行作废。 -CmpFile连接时会复位目标:板子当场重打一遍开机日志——在自动闭环里必须排在 串口日志采集之后,否则开机日志被截断、启动锚点计数误判成"中途复位"。- 只重启不烧录用
reset子命令(-c SWD -Rst -Run);nRST 未接线的台架(3 线 SWD) 这是唯一复位手段——hard(RM=Hrst -HardRst PULSE=100)在部分 CLI 版本(v3.5.0 实测) 被拒,本 skill 会打印RESET_NOTE并自动降级为这条系统复位(仍按降级结果给 rc)。 - 探针在位先
list;Programming Complete但行为像旧固件 → 先怀疑缺-Rst -Run, 再怀疑 hex 没重编(对比 hex 时间戳)。 - 完整复位语义/故障排查(本仓库):
docs/测试说明/ST-LINK_CLI_复位使用说明.md。
与其它 skill 的衔接
- 编译 =
keil-buildskill(先 0 错 0 警再烧)。 serial-boot-test档案里flash_cmd= 本 skill 入口(如".venv\\Scripts\\python.exe .dsh\\skills\\stlink-flash\\scripts\\stlink_flash.py flash")、readback_cmd="... stlink_flash.py cmp {hex}"、readback_ok=no difference found——闭环脚本已保证"回读排在采集之后"。