Files
STM32F4-Base/.dsh/skills/stlink-flash/SKILL.md
T
wandering1 f754d59218 docs(测试说明): 按用途分六个子目录并同步全库引用
分层:流程与规范/ 单元测试/ 板级测试/ 专项验证/ 测试工具/ 测试数据/,
顶层只留新增的目录导航 README.md(归层判据 + 硬约束 + 本次处置记录)。

- 搬迁 28 个路径:测试数据三个目录 58 个文件为纯改名(R100,内容逐字节不变)
- 全库引用同步 124 个文件:AGENTS / docs 索引 / skills / 门禁注释 / scripts
- 门禁面:scripts/check_test_traceability.py 的 glob 改 rglob
  (分层后不递归扫描=追溯门禁直接瞎掉)
- scripts/rename_ref.py:收尾的 ℹ 提示在 GBK 代码页抛 UnicodeEncodeError,
  让进程以退出码 1 收场而改写其实已落盘(RC 与真实结果相反);改为把
  stdout/stderr reconfigure 成 UTF-8,与 check_doc_links.py 等同法
- docs/文档规范.md §1.1 补「子目录文件过多时再分一层」;§3.6 补 rename_ref
  搬整目录的两个实测坑:① 会改写目录内部文件的内容 ② 内部文件的 ../ 出链
  不补层级(本次 23 个被误改的证据文件已按 HEAD 原始字节逐字节还原)
- docs/README.md §6 改为与六个子目录一一对应,并补登原先漏登记的
  「启动日志原子性复验流程」一行
- .cubemx_survival_baseline.json:App/util/task_watchdog.c 的注释路径也随分层更新,
  该文件是存活审计的 watchdog-module 漂移锚点,按脚本自己的提示跑 --write 重建基线
  (实测重建后仅 watchdog-module 一条哈希变化)
- 铁律 4 例外(本次在任务树里改了单写者文件):AGENTS.md 与
  .pre-commit-config.yaml 只被 rename_ref 改写路径字面量(后者全在注释行),
  任务表块与钩子声明一字未动

验证:check_doc_links.py --sections-strict 覆盖全部 88 个改动 .md 全绿;
check_test_traceability.py 输出与主树逐行一致;196 个文本文件无 BOM、无新增
CR、无 U+FFFD、无行尾空白;陈旧引用面由主树 25 处降到 6 处(无新增断链)。
2026-10-30 07:16:07 +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——闭环脚本已保证"回读排在采集之后"。