Files
STM32F4-Base/.dsh/skills/stlink-flash/SKILL.md
T
wandering1 5009a844a9
CI / L0 静态门禁 (pre-commit) (push) Has been cancelled
CI / L0.5 主机侧单测 (MSVC) (push) Has been cancelled
收敛 reset.bat 到 stlink-flash skill 并删除该批处理
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。
2026-10-10 16:41:46 +08:00

4.0 KiB
Raw Blame History

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-build skill(先 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——闭环脚本已保证"回读排在采集之后"。