10 Commits

Author SHA1 Message Date
wandering1 06baf7a531 Merge pull request 'docs(hw): ④ 段变比定死入通道映射——电压族 606.06:1、电流族 29.4118 A/V,eng 保持 0(#41)' (#92) from write-ratio-41-fba44d301c82 into master
Reviewed-on: #92
2026-11-06 19:41:56 +08:00
wandering1 8a24c7ac85 Merge branch 'master' into write-ratio-41-fba44d301c82 2026-11-06 19:41:42 +08:00
wandering1 2ed715f6d5 Merge pull request 'docs(故障录波): 第二幕尾步坏段/空态画面板级闭环入档(#68)' (#91) from remote-shoot-68-274d2d56da74 into master
Reviewed-on: #91
2026-11-06 19:40:06 +08:00
super_agent_bot 2e4c167bfb docs(hw): ④ 段变比定死入通道映射——电压族 606.06:1、电流族 29.4118 A/V,eng 保持 0
用户在 Issue #41 现场报子板参数:PT 2mA/2mA、输入侧 200 kΩ、输出侧 330 Ω;
CT 5A/2.5mA、输出侧负担 68 Ω。先复核算术后入库:

- 200000 ÷ 330 = 606.060606… V/V ✓;5 ÷ (2.5mA × 68Ω) = 5 ÷ 0.17 =
  29.41176470… A/V(= 匝比 2000 ÷ 68)✓,两数与报参口径一致,未发现算误。
- 电流族"变比"实为带单位的 A/V(I端子 ÷ UAINn),与 V/V 不可混写,文档分注。

改动全在 docs/硬件平台/ADC通道映射说明.md(#41 口径:本卡不动代码、
ROM、登记簿):

- §7.1 链路分段表 ④ 行由"仍待实测确认"改"定死(参数算定)",给出两族数值;
  引文与可评审结论 1/3/4 同步收口。
- 新增 §7.2 登记:算式与额定点(400 V→0.66 V、5 A→0.17 V)、②×③×④ 端到端
  标称系数表(92.48 / 488.28 mV/码、4.488 / 23.70 mA/码)、复核口径——铭牌
  参数非本板实测,数值确认归两点标定;`eng` 判定:④ 到手满足第一条件,
  电气 8 路 ADC_CAL_F_VALID 未置位,eng 保持 0,两点标定转为可开工。
- 移交两点标定卡的两道存储题:电压族端子域标称 k 越 int32 Q16 µV/码上限
  32767,且合法带基准读 ROM 出厂表(引脚域)——写入端子域系数前存储单位
  与出厂表须一并换血。

验证:check_doc_links.py --all 与 no-mojibake 实跑通过;docs-only,
/keil-build 不适用。
2026-11-06 19:10:21 +08:00
super_agent_bot c40fd24c1a docs(故障录波): 第二幕尾步坏段/空态画面板级闭环入档(#68)
同号翻位覆盖列内段 WAVE06 → 回放页显式「该段不可读」(零波形元素,
判据「绝不许画直线」过);全删段 → 「无录波段」空态 + 串口
open fail fr=4 互证。证据目录 wave_shot_20261106:三态 PNG 与原始
帧、坏样本与原件、PC 侧 wave_read REJECT 实录、串口摘录、sha256
清单。收工:板上九件原件逐件 sha 复验恢复、坏样本不留板(§7 二
选一取删除),UI 停 STANDBY。发现 F1(STOR 新文件不进钉表,需同
号顶当前段或手动录波触发重扫)与 F2(数据 CRC 判废串口静默、画
面自证)记 §10。同步销项:手册第二幕状态与现场记录表第 3 行、
设计说明 §10「回放页坏段/空态画面闭环记录」、任务规划 README
§2.0 独立行。本轮不改代码。关联 #68 #38。
2026-11-06 18:35:40 +08:00
wandering1 c2a946f993 Merge pull request 'docs(ui): Issue #53 台架轮复核销项——六页真机判据上板复核完成(RESTARTED 标不可验)' (#90) from bench-verify-ui-pages-f9c1662bf18b into master
Reviewed-on: #90
2026-11-06 09:37:18 +08:00
super_agent_bot 3da3936ffe chore(sync): 空合并提交触发 PR #90 可合并性复测(master@8772420 已在 e1476e1 中合入,内容零变化) 2026-11-06 08:41:40 +08:00
wandering1 e1476e12c1 Merge branch 'master' into bench-verify-ui-pages-f9c1662bf18b 2026-11-06 08:21:23 +08:00
wandering1 87724205c9 Merge pull request 'docs: #39 收尾——子项 A 收口审计 + 子项 B 台架重验证据写入模块文档' (#89) from queue-issue-39-d318f32c6528 into master
Reviewed-on: http://100.123.83.113:3001/wandering1/STM32F4-Base/pulls/89
2026-11-06 08:18:27 +08:00
super_agent_bot 416e92f109 docs(ui): Issue #53 台架轮复核销项——六页真机判据上板复核完成(RESTARTED 标不可验)
CI / 静态门禁 (pre-commit) (push) Failing after 3m10s
CI / 主机侧单测 (MSVC) (push) Failing after 44s
CI / 静态门禁 (pre-commit) (pull_request) Failing after 47s
CI / 主机侧单测 (MSVC) (pull_request) Failing after 44s
台架轮(2026-11-06,实机 192.168.31.100 生产固件,boot 187–193,
ST-LINK + RemoDispBus 7003 按键注入/抓帧 + FTP 取证,全程持 bench 锁):

- 判据1 真记录翻页与保持:oper 73 条 19 页 / yk 34 条 9 页 / start 2 条
  1 页实机翻页连续,页数与盘上条数交叉吻合;跨 188–193 六次重启
  (IWDG/NRST/系统复位,RAM 每次全清)YK/START/WDEV md5 逐字节不变,
  RUN/SOE/OPER/SELFTEST 纯追加、旧记录区零改写。
- 判据2 清除记录后对应页归零:oper 73→0、start 2→0、yk 34→0(页显
  「无记录」+ NAND 对应文件消失);告警行空类清除幂等;RUN/SOE/
  SELFTEST 清除前后逐字节一致(逐行独立清除证实);OPER 由后续写入
  自动重建且恰含三条清类留痕、清 oper 自身不留痕(留痕契约证实)。
- 判据3 上电一次 boot_count +1:187→193 六连号无跳变,电池域 SRAM
  保持+回写正常;本机无市电开关,以系统复位代理完整上电(覆盖
  SRAM 存储语义),真·拔电 POR 计数差额留人工一眼补验。
- 判据4 拔 RTC 电池落 RESTARTED:台架不可验(用户裁定 2026-11-05),
  销项不挂账;seq_state 四态判定归主机单测 test/host/boot_stats/ 覆盖。
- 判据5 IWDG 复位落「独立看门狗」:SWD 热插拔现场收窄看门狗窗口
  (PR=0/RLR=2,窗口 ≈0.37ms ≪ 100ms 喂狗节拍)触发真实计数器溢出
  → rst_cause=独立看门狗;咬后 wd_platform_start 自愈回 PR=4/RLR=1249。
  调试停机(DBGMCU_APB1_FZ 实读 0)与 NRST 硬脉冲两条不咬路径的
  归因已记台架台账(Issue #53 评论)。
- 判据6 主站接入一次 conn_up +1:75s 静默窗(前后帧逐字节相同)后
  单次 STARTDT 连接恰好 +1,发送帧数 +1、接收字节 +6B 交叉印证。

销项:六页文件头「台架待补」段改为「台架复核已完成」(模拟器口径
保留);模拟器差距清单 §2.3 开机账本行更新复核口径;登记簿 §7
「UI 六页真机判据」行删除(工单授权),交叉引用同步(任务规划
README、产品需求 FR-SOE-3)。清除动作是判据 2 本体,清前全量
NAND 记录已备份(PC 侧),留证于 Issue #53 台架轮评论。

门禁:check_doc_links --all 213 文档过;主机侧单测 48 runner
4257 断言全过;ARMCC 全量构建 0 Error 0 Warning
(Code=254820 RO=30896 RW=2072 ZI=150104);ui-golden 菜单 8 状态
+ 内容页 74 张黄金参考一致(本机按部署文档第 3 步补装 SDL2 SDK)。
附带:内存数字两文档随 .map 同步——RAM 台账受管区 3 行 +
RAM 使用分析快照 3 行(mem-budget / mem-numbers 门禁随本票
Drivers/BSP staged 触发的 HEAD 既有漂移修正:#73/#79 合入后未跑
--write;285,716 B 与体积凭证一致,全部 PASS/参考,无红线变动)。
体积凭证指纹陈旧同为 HEAD 既有(488f6fb 起),本票纯注释/文档
不动体积面,不越权刷新。
2026-11-06 03:49:18 +08:00
34 changed files with 480 additions and 45 deletions
+5 -3
View File
@@ -9,9 +9,11 @@
* 写入点 = App/task/protect_task.c 的 s_log_active_edge(); * 写入点 = App/task/protect_task.c 的 s_log_active_edge();
* "记录类型 = 日志 ID 本身"(一类记录一个文件,记录体内没有类型字段位, * "记录类型 = 日志 ID 本身"(一类记录一个文件,记录体内没有类型字段位,
* Lead 裁定 2026-10-26)——本页只读 accid.log 一个文件,不做跨文件混排。 * Lead 裁定 2026-10-26)——本页只读 accid.log 一个文件,不做跨文件混排。
* 台架待补(不在本批,已登记 docs/任务规划/登记簿.md):真 NAND 上真实记录的翻页读取、 * 台架复核已完成(2026-11-06,Issue #53 台架轮、实机 boot 188–193,证据贴 Issue #53 评论):
* 掉电后记录保持、清除记录后本页归零这三件事都要上板复核;模拟器侧该文件 * 本页真机实读为空态"无记录"且属实况(事故写入方在保护未标定闭锁内,台架期间
* 没有写入方,像素黄金只能验空态"无记录"。 * 零触发,NAND 无 accid.log);空类清除幂等经同页其余行实机复核,翻页与保持
* 逻辑经同构记录页(操作 / 遥控 / 启动)真记录复核。模拟器侧该文件仍无写入方,
* 像素黄金维持空态"无记录"口径。
* 适用平台:STM32F407ZGTx / PC 模拟器(两端共用) * 适用平台:STM32F407ZGTx / PC 模拟器(两端共用)
* 作者:DTU 项目组 * 作者:DTU 项目组
* 创建日期:2026-10-28 * 创建日期:2026-10-28
+5 -3
View File
@@ -9,9 +9,11 @@
* 写入点 = App/task/protect_task.c 的 s_log_active_edge(); * 写入点 = App/task/protect_task.c 的 s_log_active_edge();
* "记录类型 = 日志 ID 本身"(一类记录一个文件,记录体内没有类型字段位, * "记录类型 = 日志 ID 本身"(一类记录一个文件,记录体内没有类型字段位,
* Lead 裁定 2026-10-26)——本页只读 alarm.log 一个文件,不做跨文件混排。 * Lead 裁定 2026-10-26)——本页只读 alarm.log 一个文件,不做跨文件混排。
* 台架待补(不在本批,已登记 docs/任务规划/登记簿.md):真 NAND 上真实记录的翻页读取、 * 台架复核已完成(2026-11-06,Issue #53 台架轮、实机 boot 188–193,证据贴 Issue #53 评论):
* 掉电后记录保持、清除记录后本页归零这三件事都要上板复核;模拟器侧该文件 * 本页真机实读为空态"无记录"且属实况(告警写入方在保护未标定闭锁内,台架期间
* 没有写入方,像素黄金只能验空态"无记录"。 * 零触发,NAND 无 alarm.log);清除页本行两段式空类清除已实机复核幂等;翻页与
* 保持逻辑经同构记录页(操作 / 遥控 / 启动)真记录复核。模拟器侧该文件仍无
* 写入方,像素黄金维持空态"无记录"口径。
* 适用平台:STM32F407ZGTx / PC 模拟器(两端共用) * 适用平台:STM32F407ZGTx / PC 模拟器(两端共用)
* 作者:DTU 项目组 * 作者:DTU 项目组
* 创建日期:2026-10-28 * 创建日期:2026-10-28
+5 -3
View File
@@ -9,9 +9,11 @@
* 写入点 = App/task/default_task.c(定值保存)、App/protocol/iec104/iec104_pts.c(复归与整定写入)、App/task/iec104_serv.c 与 App/sync/time_sntp.c(对时)、App/log/sys_log_mcu.c(清除记录留痕,OPER 自身除外); * 写入点 = App/task/default_task.c(定值保存)、App/protocol/iec104/iec104_pts.c(复归与整定写入)、App/task/iec104_serv.c 与 App/sync/time_sntp.c(对时)、App/log/sys_log_mcu.c(清除记录留痕,OPER 自身除外);
* "记录类型 = 日志 ID 本身"(一类记录一个文件,记录体内没有类型字段位, * "记录类型 = 日志 ID 本身"(一类记录一个文件,记录体内没有类型字段位,
* Lead 裁定 2026-10-26)——本页只读 oper.log 一个文件,不做跨文件混排。 * Lead 裁定 2026-10-26)——本页只读 oper.log 一个文件,不做跨文件混排。
* 台架待补(不在本批,已登记 docs/任务规划/登记簿.md):真 NAND 上真实记录的翻页读取、 * 台架复核已完成(2026-11-06,Issue #53 台架轮、实机 boot 188–193,证据贴 Issue #53 评论):
* 掉电后记录保持、清除记录后本页归零这三件事都要上板复核;模拟器侧该文件 * 真 NAND 真实记录的翻页读取、复位(RAM 全清)后从 NAND 原样重读、清除记录后
* 没有写入方,像素黄金只能验空态"无记录"。 * 本页归零(73 条 → 无记录、OPER.LOG 从盘上消失)三件事均已上板复核;真·拔
* 市电本机不可控,保持性以 RAM 全清 + 全链重启代理(POR 计数差额人工一眼可补)。
* 模拟器侧该文件仍无写入方,像素黄金维持空态"无记录"口径。
* 适用平台:STM32F407ZGTx / PC 模拟器(两端共用) * 适用平台:STM32F407ZGTx / PC 模拟器(两端共用)
* 作者:DTU 项目组 * 作者:DTU 项目组
* 创建日期:2026-10-28 * 创建日期:2026-10-28
+7 -4
View File
@@ -17,10 +17,13 @@
* **不做跨开机累计**(用户裁定 2026-10-27) * **不做跨开机累计**(用户裁定 2026-10-27)
* 几何余量(2026-10-28 黄金目检):「自电池周期」5 字 x12px 从 x=101 起、右缘 161,**余量 0**—— * 几何余量(2026-10-28 黄金目检):「自电池周期」5 字 x12px 从 x=101 起、右缘 161,**余量 0**——
* 值列再加字或换字号必切边;要扩文案必须先减字或改标签列宽度,别直接加字。 * 值列再加字或换字号必切边;要扩文案必须先减字或改标签列宽度,别直接加字。
* 台架待补(不在本批,已登记 docs/任务规划/登记簿.md):真机上电一次看 boot_count +1、 * 台架复核已完成(2026-11-06,Issue #53 台架轮、实机 boot 187–193,证据贴 Issue #53 评论):
* 拔电换电池后 seq_state 落 RESTARTED、IWDG 复位后 rst_cause 落 IWDG、 * 上电一次 boot_count +1 真机复核——链条 187→193 六连击无跳号,SRAM 保持 +
* 主站连一次看 conn_up +1 —— 模拟器无 boot_stats(依赖 SD2506 I2C 与 RCC_CSR) * 写回正常(本机无市电开关,用 ST-LINK 系统复位代理完整上电,电池域存储语义
* 与 104 协议栈,黄金参考拍的是固定假数据 * 全覆盖);IWDG 复位后 rst_cause 落「独立看门狗」经 SWD 缩窗真溢出复核;
* 主站接入一次 conn_up +1 经静默窗 +1 精确归因复核;拔 RTC 电池落 RESTARTED
* 一项台架不可验(用户裁定 2026-11-05,销项不挂账)。模拟器无 boot_stats
* (依赖 SD2506 I2C 与 RCC_CSR)与 104 协议栈,黄金参考拍的是固定假数据
* 适用平台:STM32F407ZGTx / PC 模拟器(两端共用) * 适用平台:STM32F407ZGTx / PC 模拟器(两端共用)
* 作者:DTU 项目组 * 作者:DTU 项目组
* 创建日期:2026-10-28 * 创建日期:2026-10-28
+5 -3
View File
@@ -9,9 +9,11 @@
* 写入点 = App/task/protect_task.c 的 s_log_active_edge(); * 写入点 = App/task/protect_task.c 的 s_log_active_edge();
* "记录类型 = 日志 ID 本身"(一类记录一个文件,记录体内没有类型字段位, * "记录类型 = 日志 ID 本身"(一类记录一个文件,记录体内没有类型字段位,
* Lead 裁定 2026-10-26)——本页只读 start.log 一个文件,不做跨文件混排。 * Lead 裁定 2026-10-26)——本页只读 start.log 一个文件,不做跨文件混排。
* 台架待补(不在本批,已登记 docs/任务规划/登记簿.md):真 NAND 上真实记录的翻页读取、 * 台架复核已完成(2026-11-06,Issue #53 台架轮、实机 boot 188–193,证据贴 Issue #53 评论):
* 掉电后记录保持、清除记录后本页归零这三件事都要上板复核;模拟器侧该文件 * 真 NAND 真实记录的翻页读取、复位(RAM 全清)后从 NAND 原样重读、清除记录后
* 没有写入方,像素黄金只能验空态"无记录"。 * 本页归零(2 条 → 无记录、START.LOG 从盘上消失)三件事均已上板复核;真·拔
* 市电本机不可控,保持性以 RAM 全清 + 全链重启代理(POR 计数差额人工一眼可补)。
* 模拟器侧该文件仍无写入方,像素黄金维持空态"无记录"口径。
* 适用平台:STM32F407ZGTx / PC 模拟器(两端共用) * 适用平台:STM32F407ZGTx / PC 模拟器(两端共用)
* 作者:DTU 项目组 * 作者:DTU 项目组
* 创建日期:2026-10-28 * 创建日期:2026-10-28
+5 -3
View File
@@ -9,9 +9,11 @@
* 写入点 = App/protocol/iec104/iec104_pts.c 的遥控段; * 写入点 = App/protocol/iec104/iec104_pts.c 的遥控段;
* "记录类型 = 日志 ID 本身"(一类记录一个文件,记录体内没有类型字段位, * "记录类型 = 日志 ID 本身"(一类记录一个文件,记录体内没有类型字段位,
* Lead 裁定 2026-10-26)——本页只读 yk.log 一个文件,不做跨文件混排。 * Lead 裁定 2026-10-26)——本页只读 yk.log 一个文件,不做跨文件混排。
* 台架待补(不在本批,已登记 docs/任务规划/登记簿.md):真 NAND 上真实记录的翻页读取、 * 台架复核已完成(2026-11-06,Issue #53 台架轮、实机 boot 188–193,证据贴 Issue #53 评论):
* 掉电后记录保持、清除记录后本页归零这三件事都要上板复核;模拟器侧该文件 * 真 NAND 真实记录的翻页读取、复位(RAM 全清)后从 NAND 原样重读、清除记录后
* 没有写入方,像素黄金只能验空态"无记录"。 * 本页归零(34 条 → 无记录、YK.LOG 从盘上消失)三件事均已上板复核;真·拔
* 市电本机不可控,保持性以 RAM 全清 + 全链重启代理(POR 计数差额人工一眼可补)。
* 模拟器侧该文件仍无写入方,像素黄金维持空态"无记录"口径。
* 适用平台:STM32F407ZGTx / PC 模拟器(两端共用) * 适用平台:STM32F407ZGTx / PC 模拟器(两端共用)
* 作者:DTU 项目组 * 作者:DTU 项目组
* 创建日期:2026-10-28 * 创建日期:2026-10-28
@@ -613,7 +613,7 @@ flowchart LR
- 判据:动作路径零 NAND I/O(protectTask 静态链 872 B 改前后不变);104 时标 = 事件上送时刻, - 判据:动作路径零 NAND I/O(protectTask 静态链 872 B 改前后不变);104 时标 = 事件上送时刻,
与落盘记录(事件发生时刻)差 ≤ 一拍 + 排空延迟(≤50 ms)。 与落盘记录(事件发生时刻)差 ≤ 一拍 + 排空延迟(≤50 ms)。
**FR-SOE-3 记录体系(✅ 软件面已落地;真机判据待台架)** **FR-SOE-3 记录体系(✅ 软件面已落地;真机判据已台架复核 2026-11-06)**
- 现状:七类文本记录(运行 / 自检 / 事故 / 告警 / 启动 / 操作 / 遥控)+ 二进制 SOE 已落地, - 现状:七类文本记录(运行 / 自检 / 事故 / 告警 / 启动 / 操作 / 遥控)+ 二进制 SOE 已落地,
「记录类型 = 日志 ID 本身」(一类记录一个文件,记录体内无类型字段位);UI 六页已绑 「记录类型 = 日志 ID 本身」(一类记录一个文件,记录体内无类型字段位);UI 六页已绑
(记录 5 页 + 运行报告,2026-10-28)。运行报告的四个数取自 boot_stats(SD2506 用户 SRAM (记录 5 页 + 运行报告,2026-10-28)。运行报告的四个数取自 boot_stats(SD2506 用户 SRAM
@@ -621,8 +621,10 @@ flowchart LR
(口径 docs/UI设计/UI_数据供给设计说明.md §4.4)。 (口径 docs/UI设计/UI_数据供给设计说明.md §4.4)。
- 判据:五类记录各有写入点、可翻最近 20 条、空记录明确显示"无记录"、共用 reader——**软件面已满足** - 判据:五类记录各有写入点、可翻最近 20 条、空记录明确显示"无记录"、共用 reader——**软件面已满足**
(空态与四个范围标签由 74 张像素黄金钉住;模拟器侧这些文件没有写入方,只拍到空态)。 (空态与四个范围标签由 74 张像素黄金钉住;模拟器侧这些文件没有写入方,只拍到空态)。
真记录翻页、掉电后保持、清除记录后归零、boot_count 自增与四态判定**待台架复核** 真记录翻页、掉电后保持(复位代理口径)、清除记录后归零、boot_count 自增、rst_cause=IWDG、
(docs/任务规划/登记簿.md §7)。 conn_up +1 **已于 2026-11-06 Issue #53 台架轮实机复核通过**;四态判定中「拔 RTC 电池落
RESTARTED」经用户裁定(2026-11-05)台架不可验销项(证据与口径见 Issue #53 与
docs/测试说明/专项验证/模拟器差距清单.md §2.3)。
### 5.15 IEC 60870-5-104 上行(FR-IEC104)✅ ### 5.15 IEC 60870-5-104 上行(FR-IEC104)✅
+4 -3
View File
@@ -41,8 +41,9 @@
**UI 补齐执行清单已于 2026-10-28 清空**:记录 5 页(事故 / 操作 / 保护告警 / 保护启动 / 遥控)与 **UI 补齐执行清单已于 2026-10-28 清空**:记录 5 页(事故 / 操作 / 保护告警 / 保护启动 / 遥控)与
运行报告页同日落地并绑页,内容页黄金参考 53 → 60 张(runreport 分 2 页,第 2 页单独拍一张;判据 = simulator/tests/ref/ 入库 shot_*.bin 实数,张数 = 页面个数 + 分页多拍的那一张;**该集合 2026-10-29 已扩至 66 张**,多出的是录波回放页 6 态)。 运行报告页同日落地并绑页,内容页黄金参考 53 → 60 张(runreport 分 2 页,第 2 页单独拍一张;判据 = simulator/tests/ref/ 入库 shot_*.bin 实数,张数 = 页面个数 + 分页多拍的那一张;**该集合 2026-10-29 已扩至 66 张**,多出的是录波回放页 6 态)。
上板判据(真记录翻页、掉电保持、清除后归零、boot_count 自增、RESTARTED、rst_cause=IWDG、conn_up +1) 上板判据(真记录翻页、掉电保持、清除后归零、boot_count 自增、RESTARTED、rst_cause=IWDG、conn_up +1)
已登记登记簿 §7「UI 六页真机判据」,六页文件头各留「台架待补」段;模拟器差距见 **已于 2026-11-06 Issue #53 台架轮复核完成并销项**(除「拔 RTC 电池落 RESTARTED」经用户裁定 2026-11-05
docs/测试说明/专项验证/模拟器差距清单.md §2.3「开机账本 boot_stats」一行。 台架不可验,销项不挂账);六页文件头「台架待补」段已改「台架复核已完成」,登记簿 §7 对应行已删;
模拟器差距见 docs/测试说明/专项验证/模拟器差距清单.md §2.3「开机账本 boot_stats」一行。
**执行纪律:单道串行。** 菜单树与页面注册表是生成物,字库也是整文件生成物; **执行纪律:单道串行。** 菜单树与页面注册表是生成物,字库也是整文件生成物;
不要同时开多条 UI 页面分支。上板验证可累积成一批,但保存、重启、主站读回等判据不能删除。 不要同时开多条 UI 页面分支。上板验证可累积成一批,但保存、重启、主站读回等判据不能删除。
@@ -65,7 +66,7 @@ docs/测试说明/专项验证/模拟器差距清单.md §2.3「开机账本 boo
| **6** | 保护元件与采集增强 | 等待标准源或硬件改版 | 保护先解除未标定闭锁;三相同时刻类功能等 V0.2 硬件 | | **6** | 保护元件与采集增强 | 等待标准源或硬件改版 | 保护先解除未标定闭锁;三相同时刻类功能等 V0.2 硬件 |
| **7** | 验证窗口事项 | 逢条件顺带 | CI runner、PC peer、CH340、负向故障注入条件到位时执行 | | **7** | 验证窗口事项 | 逢条件顺带 | CI runner、PC peer、CH340、负向故障注入条件到位时执行 |
| **8** | 独立模块与暂缓项 | 当前不排 | 开入开出、104 文件传输单独立项(SNTP 已单独立项并于 2026-11-04 落地 #73,:8888 随 #78 退役);RS-485 与内存优化按各自重启条件 | | **8** | 独立模块与暂缓项 | 当前不排 | 开入开出、104 文件传输单独立项(SNTP 已单独立项并于 2026-11-04 落地 #73,:8888 随 #78 退役);RS-485 与内存优化按各自重启条件 |
| **独立** | **故障录波(1 kHz · 8 路原始码值 · 单通道回放)** | **代码面已交付;2026-10-31 远程半轮过六项、2026-11-02 回放页枚举缺陷已修复闭环,余注量对表与人到场项** | 用户裁定 2026-10-29 **录波先行**:数据面最小闭环 → 手动与保护启动触发 → 回放页。三块的**代码侧判据已收口**(主机单测 113 / 170 / 110 全 rc=0、双端编译 0 错误 0 警告、板端编码器与 PC 侧解码器字节级互验、手动录波与录波回放两叶已绑页、内容页黄金参考扩至 66 张);**2026-10-31 远程半轮已过六项**(真 FAT 落盘、触发→落盘全部落在 2 s 封存超时窗内、冷却恢复、轮转、PC 侧坏段拒收、冻结窗内 104 并发);同轮发现的缺陷「回放页段表枚举恒空」**已于 2026-11-02 远程修复并板级闭环**(根因 = 读侧 `wave_store_seg_path()` 返回值判错,顺带修键处理缺失效;回放页真段/切段/切道已实测,登记簿条目已销项,证据见设计说明 §10「回放页枚举恒空缺陷修复记录」);**没跑的是注量对表那半轮**(注 1 V / 50 Hz、与 `meas:` 行和 104 浮点遥测对表、回放页放坏段与空态画面)加 P 触发 / bench T 源,全部结果与清单见 `docs/子系统设计/故障录波设计说明.md` §10「板级远程半轮记录」。**板级判据、留痕名清单与执行顺序图的属主 = docs/子系统设计/故障录波设计说明.md §9 与 §10**(原卡片登记簿 2026-10-30 随销项并入后删除);**与 UI 道互斥**(菜单树与中文字库是整文件生成物,同刻只允许一条道写)——本波按此串行执行:UI 道在数据面与接线冻结之后才动生成物 | | **独立** | **故障录波(1 kHz · 8 路原始码值 · 单通道回放)** | **代码面已交付;2026-10-31 远程半轮过六项、2026-11-02 回放页枚举缺陷已修复闭环、2026-11-04 注量对表闭环(#40 §8 交流轮)、2026-11-06 第二幕尾步坏段/空态画面台架远程轮拍毕——回放页三态板级判据全部实证;余 P 触发(需标定解锁决定)、bench T 源与卷占用、`task_prof` 耗时峰值等到场/裁定项** | 用户裁定 2026-10-29 **录波先行**:数据面最小闭环 → 手动与保护启动触发 → 回放页。三块的**代码侧判据已收口**(主机单测 113 / 170 / 110 全 rc=0、双端编译 0 错误 0 警告、板端编码器与 PC 侧解码器字节级互验、手动录波与录波回放两叶已绑页、内容页黄金参考扩至 66 张);**2026-10-31 远程半轮已过六项**(真 FAT 落盘、触发→落盘全部落在 2 s 封存超时窗内、冷却恢复、轮转、PC 侧坏段拒收、冻结窗内 104 并发);同轮发现的缺陷「回放页段表枚举恒空」**已于 2026-11-02 远程修复并板级闭环**(根因 = 读侧 `wave_store_seg_path()` 返回值判错,顺带修键处理缺失效;回放页真段/切段/切道已实测,登记簿条目已销项,证据见设计说明 §10「回放页枚举恒空缺陷修复记录」);**注量对表半轮已于 2026-11-04 由 #40 §8 交流轮闭环**(幅值 / 相位 / 削顶三项实测,`meas:` 行与板上读数逐项核对,104 浮点遥测按用户裁定不作对照证据;`docs/测试说明/测试数据/boot_log_data/20261104_ac_*`);**回放页放坏段与空态画面已于 2026-11-06 台架远程轮拍毕闭环**(同号翻位覆盖→「该段不可读」零波形元素绝不平线;全删→「无录波段」+ 串口 `open fail fr=4` 互证;证据 `docs/测试说明/测试数据/wave_shot_20261106/`,记录见设计说明 §10「回放页坏段/空态画面闭环记录」);**没跑的只剩** P 触发对时刻(先要标定解锁决定)/ bench T 源与卷占用(需 bench 构建)/ `task_prof` 读路径耗时峰值,全部结果与清单见 `docs/子系统设计/故障录波设计说明.md` §10「板级远程半轮记录」。**板级判据、留痕名清单与执行顺序图的属主 = docs/子系统设计/故障录波设计说明.md §9 与 §10**(原卡片登记簿 2026-10-30 随销项并入后删除);**与 UI 道互斥**(菜单树与中文字库是整文件生成物,同刻只允许一条道写)——本波按此串行执行:UI 道在数据面与接线冻结之后才动生成物 |
### 2.1 关键依赖 ### 2.1 关键依赖
-1
View File
@@ -67,7 +67,6 @@
| **队列往返基线待重验** | 台架 + PC peer | 下次 Phase 13 窗口重锁基线 | 本文件 §1 | | **队列往返基线待重验** | 台架 + PC peer | 下次 Phase 13 窗口重锁基线 | 本文件 §1 |
| **网络负向场景台架验证** | 拔线、SPI 故障注入、远显压力条件 | PHY 拔线、芯片级 `net_init` 失败、短写压测 | 本文件 §1 | | **网络负向场景台架验证** | 拔线、SPI 故障注入、远显压力条件 | PHY 拔线、芯片级 `net_init` 失败、短写压测 | 本文件 §1 |
| **CI 远端闭环未验证** | runner 与第二台机器 | 验证远端两 job 闭环和不同工具路径 | 本文件 §4 | | **CI 远端闭环未验证** | runner 与第二台机器 | 验证远端两 job 闭环和不同工具路径 | 本文件 §4 |
| **UI 六页真机判据(记录 5 页 + 运行报告)** | 台架:NAND 里有真实事件记录、SD2506 电池域可控、104 主站可连 | 上板复核六件事:真记录翻页与掉电后保持、清除记录后对应页归零、上电一次看 `boot_count` +1、拔 RTC 电池后 `seq_state` 落 RESTARTED、IWDG 复位后 `rst_cause` 落 IWDG、主站连一次看 `conn_up` +1(模拟器侧这些记录文件无写入方、无 `boot_stats`、无 104 协议栈,黄金只拍得到空态「无记录」与固定假数据的显示口径) | 六个页面模块文件头「台架待补」段 + `../测试说明/专项验证/模拟器差距清单.md` §2.3 开机账本一行 |
| **SNTP 校时真机判据** | 台架:板与 PC SNTP 服务器(192.168.31.161 / .13)同网段可达 | `[sntp]` 使能 + 配服务器后上板复核:`[SNTP] step offset=` 步进日志、钟面与时间源一致(本地 UTC+8 口径)、`poll_min` 周期到点重对、拔线后指数退避与主备轮换、恢复后回到周期 | `../子系统设计/系统墙钟时间维护说明.md` §16 | | **SNTP 校时真机判据** | 台架:板与 PC SNTP 服务器(192.168.31.161 / .13)同网段可达 | `[sntp]` 使能 + 配服务器后上板复核:`[SNTP] step offset=` 步进日志、钟面与时间源一致(本地 UTC+8 口径)、`poll_min` 周期到点重对、拔线后指数退避与主备轮换、恢复后回到周期 | `../子系统设计/系统墙钟时间维护说明.md` §16 |
**送检顺序不可倒过来**:产品构建当前要求 UA/UN/IA 的标定 VALID 全部置位才走保护判据。 **送检顺序不可倒过来**:产品构建当前要求 UA/UN/IA 的标定 VALID 全部置位才走保护判据。
@@ -47,10 +47,10 @@ dhara 失败类 +84;RO 另 +208,全是该失败类名表)→ `ER_IROM1`
<!-- MEM_SNAPSHOT:BEGIN generated by scripts/check_mem_numbers.py --> <!-- MEM_SNAPSHOT:BEGIN generated by scripts/check_mem_numbers.py -->
| 区域 | 用量 | 容量 | 占比 | | 区域 | 用量 | 容量 | 占比 |
|---|---|---|---| |---|---|---|---|
| ER_IROM1 | 283,512 B (276.87 KB) | 1,048,576 B (1024 KB) | 27.0% | | ER_IROM1 | 285,716 B (279.02 KB) | 1,048,576 B (1024 KB) | 27.2% |
| RW_IRAM1 | 94,736 B (92.52 KB) | 131,072 B (128 KB) | 72.3% | | RW_IRAM1 | 94,752 B (92.53 KB) | 131,072 B (128 KB) | 72.3% |
| RW_CCM | 57,376 B (56.03 KB) | 65,280 B (64 KB) | 87.9% | | RW_CCM | 57,376 B (56.03 KB) | 65,280 B (64 KB) | 87.9% |
| **Flash (ROM 合计)** | **285,584 B (278.9 KB)** | 1,048,576 B (1024 KB) | **27.2%** | | **Flash (ROM 合计)** | **287,788 B (281.0 KB)** | 1,048,576 B (1024 KB) | **27.4%** |
<!-- MEM_SNAPSHOT:END --> <!-- MEM_SNAPSHOT:END -->
各区的容量与常量来源: 各区的容量与常量来源:
+3 -3
View File
@@ -15,15 +15,15 @@
<!-- MEM_BUDGET:BEGIN generated by scripts/ram_baseline.py --> <!-- MEM_BUDGET:BEGIN generated by scripts/ram_baseline.py -->
| 区域 | 用量 | 容量 | 占比 | 门禁(≤92%) | | 区域 | 用量 | 容量 | 占比 | 门禁(≤92%) |
|---|---|---|---|---| |---|---|---|---|---|
| ER_IROM1 (Flash) | 283,512 B | 1,048,576 B | 27.0% | 参考 | | ER_IROM1 (Flash) | 285,716 B | 1,048,576 B | 27.2% | 参考 |
| RW_CCM | 57,376 B | 65,280 B | 87.9% | PASS | | RW_CCM | 57,376 B | 65,280 B | 87.9% | PASS |
| UNINIT_CCM | 48 B | 256 B | 18.8% | 参考 | | UNINIT_CCM | 48 B | 256 B | 18.8% | 参考 |
| RW_IRAM1 | 94,736 B | 131,072 B | 72.3% | PASS | | RW_IRAM1 | 94,752 B | 131,072 B | 72.3% | PASS |
| 子系统(静态 RW+ZI;除 RTOS 堆在 CCM 外均在 SRAM1) | 现值 | 配额 | 状态 | | 子系统(静态 RW+ZI;除 RTOS 堆在 CCM 外均在 SRAM1) | 现值 | 配额 | 状态 |
|---|---|---|---| |---|---|---|---|
| 网络 | 13,958 B | 12 KB | ⚠ 超 1.6 KB | | 网络 | 13,958 B | 12 KB | ⚠ 超 1.6 KB |
| 存储 | 7,072 B | 12 KB | OK | | 存储 | 7,092 B | 12 KB | OK |
| UI | 36,475 B | 16 KB | ⚠ 超 19.6 KB | | UI | 36,475 B | 16 KB | ⚠ 超 19.6 KB |
| RTOS 堆 | 57,376 B | 56 KB | 堆=配额 | | RTOS 堆 | 57,376 B | 56 KB | 堆=配额 |
| 应用 | 26,433 B | 8 KB | ⚠ 超 17.8 KB | | 应用 | 26,433 B | 8 KB | ⚠ 超 17.8 KB |
@@ -324,7 +324,7 @@ flowchart TD
| 跨工具链分叉(实证,写进来是为了下一个模块别重踩) | 两份录波 .c 只 include 自身头(链上只有 stdint.h)时,ARMCC 报 22 条 identifier "NULL" is undefined;而主机 MSVC / gcc 会传递性把 stddef.h 拉进来,**主机单测完全照不出这个分叉** → 新增模块需要用 NULL 就自己 include stddef.h(与 `App/algo/sample_ring.c` 同口径,别塞公共头) | | 跨工具链分叉(实证,写进来是为了下一个模块别重踩) | 两份录波 .c 只 include 自身头(链上只有 stdint.h)时,ARMCC 报 22 条 identifier "NULL" is undefined;而主机 MSVC / gcc 会传递性把 stddef.h 拉进来,**主机单测完全照不出这个分叉** → 新增模块需要用 NULL 就自己 include stddef.h(与 `App/algo/sample_ring.c` 同口径,别塞公共头) |
| 板级 | 信号发生器注 1 V / 50 Hz → 手动一段 → FTP 拉回 → PC 脚本量出周波数、幅值、极性与注入一致;再把 PC 重算的基波有效值与板上 `meas:` 对表。**判据只量四样:周波数、幅值、极性、钉轨路数——不比绝对相位**(理由见 §4.2「段内点序」:触发瞬间在工频周期内任意落点,段字节里没有绝对时间参考;真要比相位必须让发生器给同步触发,本波不做)。**钉轨对表的合格判据 = 头位图 ⊇ 实测钉轨路数,且差异必须能由注入条件解释**——因为 `clip_mask` 是按来源派生的链路可信性标记(§6.2 偏移 24 行),不是本段实测值:只加直流或小幅注入时那五路本就不该钉轨,硬取等式会假红。**同段另起一条强观察项**:V0.1 下这五路若在做**交流注入**时反而没钉轨,先怀疑接线或该路根本没被驱动——这是告警面,不是失败面(等式仍作为默认尺子留在 PC 侧 `shape --strict` 里,因为它有这个信号价值;要放行差异用那条判据的解释权,不靠改尺子)。**§5.2 第四条的板级观察项(代码与单测面已有、板级未测)**:bench 连续自抓期间人为把卷占住 2 s 以上(例如同一段跑 FTP 大文件读),看串口 `wave:` 行的 `err` 是否加一、是否只出现**一条** `[ERR] … seg drop: ring abandoned` 留痕(不是每拍刷屏)、且段号不推进(下一段仍写同号文件) | | 板级 | 信号发生器注 1 V / 50 Hz → 手动一段 → FTP 拉回 → PC 脚本量出周波数、幅值、极性与注入一致;再把 PC 重算的基波有效值与板上 `meas:` 对表。**判据只量四样:周波数、幅值、极性、钉轨路数——不比绝对相位**(理由见 §4.2「段内点序」:触发瞬间在工频周期内任意落点,段字节里没有绝对时间参考;真要比相位必须让发生器给同步触发,本波不做)。**钉轨对表的合格判据 = 头位图 ⊇ 实测钉轨路数,且差异必须能由注入条件解释**——因为 `clip_mask` 是按来源派生的链路可信性标记(§6.2 偏移 24 行),不是本段实测值:只加直流或小幅注入时那五路本就不该钉轨,硬取等式会假红。**同段另起一条强观察项**:V0.1 下这五路若在做**交流注入**时反而没钉轨,先怀疑接线或该路根本没被驱动——这是告警面,不是失败面(等式仍作为默认尺子留在 PC 侧 `shape --strict` 里,因为它有这个信号价值;要放行差异用那条判据的解释权,不靠改尺子)。**§5.2 第四条的板级观察项(代码与单测面已有、板级未测)**:bench 连续自抓期间人为把卷占住 2 s 以上(例如同一段跑 FTP 大文件读),看串口 `wave:` 行的 `err` 是否加一、是否只出现**一条** `[ERR] … seg drop: ring abandoned` 留痕(不是每拍刷屏)、且段号不推进(下一段仍写同号文件) |
| 板级·触发来路(2026-10-30 并入原卡「手动触发与保护启动接线」板级段) | 真机面板按一次「手动录波」出一段;造一次过流,段号与该时刻 `/log/start.log` 事件对齐;冷却期内二次触发只加 `ovf` 不重录(**同时看 `armed` 与那一刻 start.log 的时刻,不要只盯 `ovf` 数字**——容差见 §9);冻结窗口内 104 上送与保护判据不受影响(这条是「丢录波样本不丢采集」的验收) | | 板级·触发来路(2026-10-30 并入原卡「手动触发与保护启动接线」板级段) | 真机面板按一次「手动录波」出一段;造一次过流,段号与该时刻 `/log/start.log` 事件对齐;冷却期内二次触发只加 `ovf` 不重录(**同时看 `armed` 与那一刻 start.log 的时刻,不要只盯 `ovf` 数字**——容差见 §9);冻结窗口内 104 上送与保护判据不受影响(这条是「丢录波样本不丢采集」的验收) |
| 板级·回放页(2026-10-30 并入原卡「现场单通道回放页」板级段) | 真机上放一段真波(不是模拟器合成节拍);远端看图能拍到该页做留证(只作留证,不是波形通路,§8.4);**空态与 CRC 失败态绝不允许画成一条直线**——用坏段在真机复现一次。**2026-10-31 远程半轮进展见下「板级远程半轮记录」小节**:PC 侧坏段拒收已过;回放页坏段/空态画面的测试面**已于 2026-11-02 枚举缺陷修复后打开**(真机已验证真段显示 + 切段切道,见下「回放页枚举恒空缺陷修复记录」小节),坏段/空态两画面本身仍是到场轮要拍的项 | | 板级·回放页(2026-10-30 并入原卡「现场单通道回放页」板级段) | 真机上放一段真波(不是模拟器合成节拍);远端看图能拍到该页做留证(只作留证,不是波形通路,§8.4);**空态与 CRC 失败态绝不允许画成一条直线**——用坏段在真机复现一次。**2026-10-31 远程半轮进展见下「板级远程半轮记录」小节**:PC 侧坏段拒收已过;回放页坏段/空态画面的测试面**已于 2026-11-02 枚举缺陷修复后打开**(真机已验证真段显示 + 切段切道,见下「回放页枚举恒空缺陷修复记录」小节),坏段/空态两画面本身**已于 2026-11-06 台架远程轮拍毕闭环——见下「回放页坏段/空态画面闭环记录」小节,本行判据全部板级实证完毕** |
| UI | `ui-verify` 五步;回放页入 `ui-golden` 黄金参考(**参考图一旦入库只能改代码对齐,禁止刷参考掩盖**);新叶走 `gen_menu.py` 重生成 + 字库链 | | UI | `ui-verify` 五步;回放页入 `ui-golden` 黄金参考(**参考图一旦入库只能改代码对齐,禁止刷参考掩盖**);新叶走 `gen_menu.py` 重生成 + 字库链 |
| 构建 | `/keil-build` 要求 0 错误 0 警告;新 .c 双端注册走 `new-source-file`(`MDK-ARM/STM32F407-Demo.uvprojx` 与 `simulator/CMakeLists.txt` 两处显式列表) | | 构建 | `/keil-build` 要求 0 错误 0 警告;新 .c 双端注册走 `new-source-file`(`MDK-ARM/STM32F407-Demo.uvprojx` 与 `simulator/CMakeLists.txt` 两处显式列表) |
| 台账 | R6 三处同步 + `scripts/ram_baseline.py --update` + `mem-numbers` 与 `mem-budget` 钩子 | | 台账 | R6 三处同步 + `scripts/ram_baseline.py --update` + `mem-numbers` 与 `mem-budget` 钩子 |
@@ -383,7 +383,8 @@ try 锁纪律)照常读出并显示 ⇒ try 锁读径正常;`manual_req` 作
**本半轮没跑的(人到场轮清单)**:注量对表(周波数 / 幅值 / 极性 / 钉轨路数)、`meas:` **本半轮没跑的(人到场轮清单)**:注量对表(周波数 / 幅值 / 极性 / 钉轨路数)、`meas:`
浮点数值对表、两个待台架核数值(封存超时窗 §4.2 兜底行与冷却时长 `App/algo/wave_ring.h`)、P 触发与 start.log 对齐(还得先解标定闭锁)、 浮点数值对表、两个待台架核数值(封存超时窗 §4.2 兜底行与冷却时长 `App/algo/wave_ring.h`)、P 触发与 start.log 对齐(还得先解标定闭锁)、
bench T 源与卷占用 2 s 的 `ring abandoned` 观察(需 bench 构建)、~~回放页坏段画面与空态画面 bench T 源与卷占用 2 s 的 `ring abandoned` 观察(需 bench 构建)、~~回放页坏段画面与空态画面
(等枚举缺陷修复后才有测试面)~~ **(2026-11-02 枚举缺陷修复后测试面已开,见下小节)**、 (等枚举缺陷修复后才有测试面)~~ **(2026-11-02 枚举缺陷修复后测试面已开,见下小节;2026-11-06
台架远程轮两画面已拍毕闭环,见「回放页坏段/空态画面闭环记录」小节)**、
`task_prof` 读路径耗时峰值。**执行动作侧**(到场的人做什么、 `task_prof` 读路径耗时峰值。**执行动作侧**(到场的人做什么、
说哪句话、会看到什么)→ `docs/测试说明/专项验证/故障录波板级到场轮执行手册.md`。 说哪句话、会看到什么)→ `docs/测试说明/专项验证/故障录波板级到场轮执行手册.md`。
@@ -440,6 +441,42 @@ bench 锁全程持有;三次烧录(埋点 / 诊断加强 / 根因修复)
(Before/After、切段、切道共四帧 + 串口实录,见该目录 README)。 (Before/After、切段、切道共四帧 + 串口实录,见该目录 README)。
**至此回放页「真段 / 坏段 / 空态」三态全部有了测试面**,第二幕尾步的坏段画面判据可跑。 **至此回放页「真段 / 坏段 / 空态」三态全部有了测试面**,第二幕尾步的坏段画面判据可跑。
### 回放页坏段/空态画面闭环记录(2026-11-06,台架远程轮,#68 第二幕尾步)
bench 锁全程持有(任务 `remote-shoot-68-274d2d56da74`,17:03:38 起、收工 `--bench-pass` 释放),
无人到场;固件 `Nov 6 2026 00:17:43 suite=NONE`(#53 台架轮复核构建,回放页读侧代码自 11-02
修复后零改动,本轮**不涉代码**)。执行手册 §4 步 7 原文流,三态画面 + 恢复态共四帧入档
`docs/测试说明/测试数据/wave_shot_20261106/`(README 含判据对照、串口锚点、复现口令与
sha256 全清单;7003 `LCDMEM` 原帧 4× 渲染,与上小节同法):
| 画面 | 实拍结果 | 判据 |
|---|---|---|
| 覆盖前 `UA SEG6 M` | 阶梯正弦 + 0 线 + 触发光标,Pk≈1423 mV | 对照基准(真段正常放波) |
| **坏段同号覆盖后** | **仅标题 + 「该段不可读」,零波形元素、零顶行底行字段** | **绝不许画直线 = 过**(画面逐比特 = `WP_ST_BAD` 显式文案路径) |
| **空态(`/WAVE` 全删后开页)** | **仅标题 + 「无录波段」**,同刻串口 `[ERR][UI_TASK] ui wave head idx=8 open fail fr=4` | 显式说「没有」= 过;再按 `r` 再探盘画面逐字节不变 |
| 九件原件恢复后 | 网格 + 波形区回归,帧与到场首帧逐字节相同 | 收工板况 = 到场板况 |
坏段制造 = `RETR WAVE06.BIN → byte[130]^=0x01 → STOR 同号覆盖`(页开着覆盖、`r` 走满一圈
再入该段触发读侧判废——`ui_task_wave_load_head()` 头 CRC+长度等式+数据区流式 CRC 全量验,
`App/task/ui_task.c`);PC 侧同件 `wave_read dump` 同判 `REJECT: data CRC16 mismatch:
stored 0xF991 calc 0xB111 …nothing drawn`(rc=1),画面与解码器两份独立实现互证。
收工处置走手册 §7 二选一的**「不留常设负样本」**分支:板上坏段与本环投放的 `WAVE09.BIN`
均已删除,`/WAVE` 恰为到场九件原件、逐件 RETR+sha256 复验一致;坏样本点名留档在证据目录
`samples/WAVE06_bitflip_reject.BIN`(原件 `samples/WAVE06_original.BIN` 一并留档,两件只差
第 131 字节一比特)。
两条现场发现(都记账不修码):**F1** 开机后 `STOR` 的新文件(坏版、有效版都试过)**不进
回放页段表**——表只在 `manual_req` 或「当前段消失」时重扫(11-02 v1.6 钉表纪律),页开关不
触发重扫;首攻 `WAVE09` 因此静默出局,改列内既有段同号覆盖一次即中(FTP 手工投放段要让回放
页看见需顶掉当前段或触发一次手动录波——纪律性事实,供后续轮引用)。**F2** 数据 CRC 判废在
串口**静默**、靠画面自证(留痕只给 `open fail fr=` 一类),与 11-02 修复记录的留痕设计一致。
另记台架环境事实:到场时板网链路已断(会议室网口),人插回网线后远程轮才得以执行——
`[ERR][I104] i104: bind port 2404 FAIL` 在该构建每次上电复现,属 #53 跟踪面,本轮不新开。
**至此第二幕(注量对表 + 坏段/空态画面)全幕闭环**:注量三项 2026-11-04 由 #40 §8 交流轮
跑完(幅值 / 相位 / 削顶,104 浮点遥测按用户裁定不作对照证据),尾步两画面 2026-11-06 拍毕;
手册第二幕状态与 `docs/任务规划/README.md` §2.0「独立」行已同步销项。
--- ---
## 11. 与 `docs/任务规划/数据可信.md` 的口径变更(三处) ## 11. 与 `docs/任务规划/数据可信.md` 的口径变更(三处)
@@ -1,7 +1,7 @@
# 故障录波板级到场轮执行手册(人要做的事,一步一行) # 故障录波板级到场轮执行手册(人要做的事,一步一行)
> **这份手册解决什么**:录波的判据里剩下的那半轮——需要**有人的手和信号发生器**的验证——把它拆成"你做什么、说哪句话、会看到什么"。 > **这份手册解决什么**:录波的判据里剩下的那半轮——需要**有人的手和信号发生器**的验证——把它拆成"你做什么、说哪句话、会看到什么"。
> **它不是判据属主**:判据、留痕名清单、执行顺序图全在 `docs/子系统设计/故障录波设计说明.md` §9 与 §10;本文只写**执行动作**。已完成部分(2026-10-31 远程半轮六项 PASS + 2026-11-02 缺陷「回放页段表枚举恒空」修复闭环)见 §10「板级远程半轮记录」与 §10「回放页枚举恒空缺陷修复记录」。 > **它不是判据属主**:判据、留痕名清单、执行顺序图全在 `docs/子系统设计/故障录波设计说明.md` §9 与 §10;本文只写**执行动作**。已完成部分(2026-10-31 远程半轮六项 PASS + 2026-11-02 缺陷「回放页段表枚举恒空」修复闭环 + 2026-11-04 第二幕注量对表闭环(#40 交流轮)+ 2026-11-06 坏段/空态两画面台架远程轮拍毕)见 §10「板级远程半轮记录」与 §10「回放页枚举恒空缺陷修复记录」「回放页坏段/空态画面闭环记录」。
> **一句话预算**:你到场约 1.5~2 小时;其中真正动手的只有**接三次线、按不超过六次键、拍两个决定**——其余全部由会话里的 agent 跑脚本。 > **一句话预算**:你到场约 1.5~2 小时;其中真正动手的只有**接三次线、按不超过六次键、拍两个决定**——其余全部由会话里的 agent 跑脚本。
--- ---
@@ -11,7 +11,7 @@
| 幕 | 名字 | 要你在场? | 你动手的部分 | agent 跑的部分 | 对应判据 | | 幕 | 名字 | 要你在场? | 你动手的部分 | agent 跑的部分 | 对应判据 |
|---|---|---|---|---|---| |---|---|---|---|---|---|
| 第一幕 | 枚举埋点与修复上板 | **已完成(2026-11-02,远程)** | 无 | 改码加埋点 → 构建 → 烧录回读 → 远程开回放页 → 读 FR 码定性 → 修复重烧 | `docs/子系统设计/故障录波设计说明.md` §10「回放页枚举恒空缺陷修复记录」 | | 第一幕 | 枚举埋点与修复上板 | **已完成(2026-11-02,远程)** | 无 | 改码加埋点 → 构建 → 烧录回读 → 远程开回放页 → 读 FR 码定性 → 修复重烧 | `docs/子系统设计/故障录波设计说明.md` §10「回放页枚举恒空缺陷修复记录」 |
| 第二幕 | 注量对表 | **要到场**(只有接线需要手) | 接 UA 发生器线 1 次、拔 1 次;面板按 2 次键(或让 agent 远程注键) | 记心跳基准 → FTP 拉段 → `wave_read` 量四样 → `meas:`/104 YC 对表 → 削顶注大一遍 → 坏段上板看回放页绝不平线 | `docs/子系统设计/故障录波设计说明.md` §10「板级」行 +「板级·回放页」行后半 | | 第二幕 | 注量对表 | **已闭环(2026-11-06)**——注量对表 2026-11-04 由 #40 交流轮跑完;坏段/空态画面 2026-11-06 台架远程轮拍毕,本幕现场无需重做 | ~~接 UA 发生器线 1 次、拔 1 次;面板按 2 次键(或让 agent 远程注键)~~ 已由远程轮与 #40 消化 | 记心跳基准 → FTP 拉段 → `wave_read` 量四样 → `meas:`/104 YC 对表 → 削顶注大一遍 → 坏段上板看回放页绝不平线 | `docs/子系统设计/故障录波设计说明.md` §10「板级」行 +「板级·回放页」行后半 +「回放页坏段/空态画面闭环记录」 |
| 第三幕 | P 触发对时刻 | **要到场**,还含**两个由你拍板的决定** | IA 两点标定各接一次线 + 过流加大到 UI 见数值过 2 A | 读码算 k/b → 写配置生效 → 验证解锁 → 触发后对 start.log 时刻/段号/src=P | `docs/子系统设计/故障录波设计说明.md` §10「板级·触发来路」行 | | 第三幕 | P 触发对时刻 | **要到场**,还含**两个由你拍板的决定** | IA 两点标定各接一次线 + 过流加大到 UI 见数值过 2 A | 读码算 k/b → 写配置生效 → 验证解锁 → 触发后对 start.log 时刻/段号/src=P | `docs/子系统设计/故障录波设计说明.md` §10「板级·触发来路」行 |
| 第四幕 | bench 自抓与卷占用 | **可远程**(烧录同上;占卷用 FTP 造) | 无 | 烧 bench 构建 → 造占卷 ≥2 s → 看 `err`+1、**一条** `ring abandoned`、同号重写 → 还原产品构建 | `docs/子系统设计/故障录波设计说明.md` §10 板级行的 `ring abandoned` 观察项 | | 第四幕 | bench 自抓与卷占用 | **可远程**(烧录同上;占卷用 FTP 造) | 无 | 烧 bench 构建 → 造占卷 ≥2 s → 看 `err`+1、**一条** `ring abandoned`、同号重写 → 还原产品构建 | `docs/子系统设计/故障录波设计说明.md` §10 板级行的 `ring abandoned` 观察项 |
@@ -80,7 +80,14 @@ flowchart LR
|---|---|---|---|---|---|---|---| |---|---|---|---|---|---|---|---|
| UA 1.000 V 50.000 Hz | 待填 | WAVE__ | __ Hz | __ V | 正/反 | __ 路 | 过/不过 | | UA 1.000 V 50.000 Hz | 待填 | WAVE__ | __ Hz | __ V | 正/反 | __ 路 | 过/不过 |
| 削顶注大 | 待填 | WAVE__ | __ Hz | __ V | 正/反 | __ 路 | 过/不过 | | 削顶注大 | 待填 | WAVE__ | __ Hz | __ V | 正/反 | __ 路 | 过/不过 |
| 坏段(回放页画面) | — | 同号覆盖 | — | — | — | — | 不平线=过 | | 坏段(回放页画面) | — | WAVE06 同号覆盖(`RETR→byte[130]^=0x01→STOR`) | — | — | — | — | **过**(2026-11-06 台架远程轮实测:「该段不可读」零波形元素,绝非直线) |
> 2026-11-06 收工状态(台架远程轮,bench 锁全程持有,无人到场):第 3 行坏段拒收画面与配套的
> 「无录波段」空态画面真机抓屏已入档 `docs/测试说明/测试数据/wave_shot_20261106/`(README 含
> 判据对照、串口锚点与复现口令);第 1、2 行的注量实测数值归 2026-11-04 #40 §8 交流轮
> (`docs/测试说明/测试数据/boot_log_data/20261104_ac_*`,实测结论见 `docs/硬件平台/ADC通道映射说明.md` §8.2),
> 104 浮点遥测按该轮用户裁定不作对照证据。**本幕至此全幕闭环**;坏段样本收工不留板
> (手册 §7 二选一取「删除」,样本点名留档见证据目录 `samples/` 与设计说明 §10 闭环记录小节)。
--- ---
@@ -67,7 +67,7 @@
| **CH395F 芯片** | 无(Winsock 代其 BSD API) | SPI 寄存器/命令/中断、PHY 协商、真实以太网帧 | 寄存器时序、命令回复、中断风暴、PHY 100M 全双工强制 | 板端 CH395F 套件(52 断言点)+ `/serial-boot-test` | | **CH395F 芯片** | 无(Winsock 代其 BSD API) | SPI 寄存器/命令/中断、PHY 协商、真实以太网帧 | 寄存器时序、命令回复、中断风暴、PHY 100M 全双工强制 | 板端 CH395F 套件(52 断言点)+ `/serial-boot-test` |
| **GD5F NAND** | 无 | SPI NAND:BBT 扫描、ECC、坏块管理、dhara FTL | 坏块/ECC/写入失败等路径完全不可测 | 板端 GD5F 套件(76 断言点)+ `/serial-boot-test` | | **GD5F NAND** | 无 | SPI NAND:BBT 扫描、ECC、坏块管理、dhara FTL | 坏块/ECC/写入失败等路径完全不可测 | 板端 GD5F 套件(76 断言点)+ `/serial-boot-test` |
| **SD2506 RTC** | 无 | I2C RTC:时间读写、闹钟、温度、电池电压 | 时间源相关(`sys_clock_init` 降级路径)在模拟器上不可触发 | 板端 RTC 套件(18 断言点)+ `sys_clock` 主机侧纯逻辑单测(已覆盖算术面) | | **SD2506 RTC** | 无 | I2C RTC:时间读写、闹钟、温度、电池电压 | 时间源相关(`sys_clock_init` 降级路径)在模拟器上不可触发 | 板端 RTC 套件(18 断言点)+ `sys_clock` 主机侧纯逻辑单测(已覆盖算术面) |
| **开机账本 boot_stats(上电次数 / 复位原因快照)** | **不编译** `App/util/boot_stats.c`(依赖 SD2506 用户 SRAM 与 `RCC_CSR`);UI「运行报告」页的四个数在模拟器上是 `simulator/main.c` 的**固定假数据**(`boot_count=7`、`seq_state=延续`、`rst_cause=上电复位`、104 四枚 3 / 128 / 0 / 4096、`uptime_s=0`) |`boot_stats_init()` 读 SRAM → 自增 → 写回 → 快照驻留;四个 104 观测计数由 iec104Task 真实累加(跨重连不清零、断电归零) | 「自增有没有真落 SRAM」「电池域掉电后是否落 RESTARTED」「写失败是否只少计不重复」「104 计数是否跨重连累计」四类事在模拟器上**结构上不可见**;黄金参考只拍得到显示口径(范围标签在不在屏上、值有没有串行、`boot_ready=0` 是否显 `--` 而不是 0) | 主机单测 `test/host/boot_stats/`(SRAM 状态机与四态判定)+ 真机 `/serial-boot-test`:上电一次看 `boot_count` +1、拔电池后落 RESTARTED、IWDG 复位后 `rst_cause=IWDG`、主站连一次看 `conn_up` +1 | | **开机账本 boot_stats(上电次数 / 复位原因快照)** | **不编译** `App/util/boot_stats.c`(依赖 SD2506 用户 SRAM 与 `RCC_CSR`);UI「运行报告」页的四个数在模拟器上是 `simulator/main.c` 的**固定假数据**(`boot_count=7`、`seq_state=延续`、`rst_cause=上电复位`、104 四枚 3 / 128 / 0 / 4096、`uptime_s=0`) |`boot_stats_init()` 读 SRAM → 自增 → 写回 → 快照驻留;四个 104 观测计数由 iec104Task 真实累加(跨重连不清零、断电归零) | 「自增有没有真落 SRAM」「电池域掉电后是否落 RESTARTED」「写失败是否只少计不重复」「104 计数是否跨重连累计」四类事在模拟器上**结构上不可见**;黄金参考只拍得到显示口径(范围标签在不在屏上、值有没有串行、`boot_ready=0` 是否显 `--` 而不是 0) | 主机单测 `test/host/boot_stats/`(SRAM 状态机与四态判定)+ 真机 `/serial-boot-test`:上电一次看 `boot_count` +1、IWDG 复位后 `rst_cause=IWDG`、主站连一次看 `conn_up` +1 —— **三件均已于 2026-11-06 Issue #53 台架轮实机复核通过**(boot 187→193 六连号无跳变、SRAM 保持+回写正常,真 IWDG 溢出经 SWD 缩窗触发,conn_up 静默窗精确 +1;「完整上电」用系统复位代理,本机无市电开关,POR 计数差额留人工一眼补验);「拔电池后落 RESTARTED」经用户裁定(2026-11-05)**台架不可验、销项不挂账**(电池域掉电需物理拔 RTC 电池,seq_state 四态判定由主机单测覆盖) |
| **TPAFE5160 ADC** | 无 | SPI ADC + BUSY EXTI 中断 | 中断驱动采集链路 | 待功能实现(上游 ADC 采集链路) | | **TPAFE5160 ADC** | 无 | SPI ADC + BUSY EXTI 中断 | 中断驱动采集链路 | 待功能实现(上游 ADC 采集链路) |
| **RS-485 半双工** | 无 | UART4 + DE 方向控制,DWT 微秒延时 | DE 收发切换时序(特有陷阱) | 待功能实现(上游 RS-485 采集链路) | | **RS-485 半双工** | 无 | UART4 + DE 方向控制,DWT 微秒延时 | DE 收发切换时序(特有陷阱) | 待功能实现(上游 RS-485 采集链路) |
| **启动段硬件初始化** | 只跑纯软件部分 | I2C/SPI 外设初始化、BBT 扫描耗时、FatFS 挂载 | 启动段死机(无看门狗保护窗口)**只能在真机复现** | 真机开机日志判读(`项目启动顺序管理.md` §6 已落地) | | **启动段硬件初始化** | 只跑纯软件部分 | I2C/SPI 外设初始化、BBT 扫描耗时、FatFS 挂载 | 启动段死机(无看门狗保护窗口)**只能在真机复现** | 真机开机日志判读(`项目启动顺序管理.md` §6 已落地) |
@@ -0,0 +1,74 @@
# 回放页坏段/空态画面闭环证据(2026-11-06,台架远程轮)
本目录是 `docs/子系统设计/故障录波设计说明.md` §10「回放页坏段/空态画面闭环记录」的图源留档,
执行 `docs/测试说明/专项验证/故障录波板级到场轮执行手册.md` 第二幕 §4 步 7 与其空态收尾:
**真机回放页上把「坏段拒收」与「无录波段」两种画面拍下来存证,判据 = 绝不许画成一条直线**。
台架远程操作、bench 锁全程持有(`remote-shoot-68-274d2d56da74`,17:03:38 起);固件身份
`Nov 6 2026 00:17:43 suite=NONE`(#53 台架轮复核构建,回放页代码自 2026-11-02 修复后未再改动);
所有画面帧由 `scripts/board_ui_nav.py` 的 7003 链路取 `LCDMEM` 原帧(160×160 1bpp 3200 B,
本目录 PNG 按 **4×** 放大渲染,与 wave_enum_20261102 同法),同一次上电、同一块板。
## 三态画面(判据对照)
| 文件 | 画面 | 说明 |
|---|---|---|
| `good_wave06_sec6_ua.png` | `UA SEG6 M` 阶梯正弦 + 0 线 + 触发光标,Pk≈1423 mV | **覆盖前**:WAVE06 原件在盘、回放页正常放波(对照基准) |
| `bad_segment_reject_wave06.png` | 仅「录波回放」标题 + 「该段不可读」 | **覆盖后同号翻位坏段的拒收态**:零波形元素、零顶行/底行字段——绝不许画直线,判据过 |
| `empty_state_no_segments.png` | 仅「录波回放」标题 + 「无录波段」 | **真·空态**:FTP 把 `/WAVE` 十件全删后开页;串口同刻 `[ERR][UI_TASK] ui wave head idx=8 open fail fr=4`(FR_NO_FILE=卷上真没有) |
| `empty_state_recheck.png` | 同上 | 空态下按 `r`(再探盘)画面逐字节不变(两 `_raw3200.bin` sha 相同) |
| `after_restore_page_normal.png` | 网格 + 0 线 + 光标恢复绘制 | 九件原件逐件 RETR+sha256 复验后重开页,正常态回归;页面回落到 RAM 记忆的 SEC5 段,故该帧与 `arrival_open_waveplay.png` **逐字节相同**——收工画面 = 到场画面,正是想要的巧合 |
| `arrival_open_waveplay.png` | `UA SEC5 M` 平线 + PK1744mV | 到场首帧(开页落数值最大段前身的 SEC5;平线是该段真实数据,非缺陷) |
各 PNG 附同屏 `_raw3200.bin` 原始帧,供逐比特复核。
## 坏段制造口径(手册 §4 步 7 原文流)
`RETR WAVE06.BIN → byte[130] ^= 0x01(数据区内翻一位)→ STOR 同号覆盖`。页开着覆盖、
`r` 走满一圈(周期 9)再入该段即触发读侧判废:`ui_task_wave_load_head()` 头 CRC+长度等式+
数据区流式 CRC 全量验(`App/task/ui_task.c`),任一不符即 `UI_WAVE_BAD` → 页面显式文案。
样本在 `samples/`:`WAVE06_original.BIN`(sha256 `9f88ee34…`,与覆盖后板上现行字节复验一致)
与 `WAVE06_bitflip_reject.BIN`(sha256 `a9e097bf…`),两件只差第 131 字节一比特。
PC 侧同件判据实录见 `pc_side_dump.txt`:`test/host/wave_read.py dump` 对坏件打印
`REJECT: … data CRC16 mismatch: stored 0xF991 calc 0xB111 over 5120 bytes at offset 128 --
segment rejected, nothing drawn`(rc=1),对原件双 CRC OK(rc=0)——板上画面与 PC 解码器
**同一判据、两份独立实现**互证。
## 串口与时间线
`serial_excerpt.txt` 为 serial-assistant 日志摘录(原样、剔除 `seg=0` 心跳行),关键锚点:
- 18:11:18 开页 → 18:11:38 `[FTP] UPLOAD '/WAVE/WAVE06.BIN' 5250 bytes OK`(坏版覆盖)→
18:11:39 RETR 复验 sha=坏 → **18:12:02 抓屏拒收态** → 18:12:01 `UPLOAD '/WAVE/WAVE06.BIN' OK`(原字节恢复);
- 18:14:42–47 `DELE WAVE00…09.BIN` ×10 → 18:14:55/58 三次 `open fail fr=4`(段表记忆 idx=8、
盘上已无文件 → FR_NO_FILE,正是留痕本意)→ **18:14:59 抓屏空态** →
18:15:04–13 `STOR` 九件恢复(每件后随 RETR 复验 sha256);
- 两窗之间全程 `wave:` 心跳 `err=0 ovf=0`,无一轮 [ERR] 越界(空态那次 fr=4 是留痕本意,见修复记录小节)。
自动化事件日志(含每步帧名/ink/位差判定):`shoot_phase2c.py` / `shoot_phase3b.py` 产物在会话
`ci-artifacts/shoot/phase2c.json`、`phase3b.json`(一次性产物,随会话留存不入台账;本目录即台账面)。
## 两条现场发现
- **F1(已知缓存纪律的实面)**:开机后 `STOR` 新文件(先攻用 `WAVE09.BIN`,坏版与有效版都试过)
**不进回放页段表**——表只在 `manual_req` 或「当前段消失」时重扫(`ui_task_wave_scan` 钉表纪律,
2026-11-02 v1.6),页开关不触发重扫。故本幕尾步按手册原文改用**列内既有段同号覆盖**,一次即中。
这不是缺陷(写侧轮转覆盖走 find-失败重扫路,天然收敛),但 FTP 手工投放段要让回放页看见,
需同号顶掉当前段或触发一次手动录波——记此免得后人重踩。
- **F2(拒收留痕口径确认)**:数据 CRC 判废在串口**静默**(留痕只给「表上有、开档失败」的
`open fail fr=` 一类,判废靠画面自证)——与 2026-11-02 修复记录的留痕设计一致,本轮实测无违和。
## 收工处置(手册 §7 二选一)
**不留常设负样本**:坏段样本已从板上删除(`WAVE09.BIN` 为本轮投放件、一并删除),`/WAVE` 恢复
到场时的九件原件且逐件 sha256 复验一致(清单见 `manifest_sha256.json` 与 §10 记录);`samples/`
两件即「删除」分支的点名留档。固件仍为在场构建、UI 停 STANDBY、bench 锁收工释放。
## 复现口令(台架同环境)
1. `& .venv\Scripts\python.exe scripts\board_ui_nav.py --where --i-hold-bench-lock`(身份互证)
2. FTP `admin` 登录 → `CWD /WAVE` → `RETR WAVE06.BIN` → 翻 `byte[130]` → `STOR WAVE06.BIN`(页开着覆盖)
3. `& .venv\Scripts\python.exe test\host\wave_read.py dump <坏件>`(应 REJECT rc=1)
4. 7003 开回放页(记录查询列第 10 行)→ `r` 走满一圈回踩该段 → `LCDMEM` 取帧(本目录坏段帧生成法)
5. `DELE` 全部段 → 关开页 → 取空态帧 → `STOR` 九件原件恢复(逐件 RETR+sha 复验)
Binary file not shown.

After

Width:  |  Height:  |  Size: 1.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 971 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 949 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 949 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.5 KiB

@@ -0,0 +1,20 @@
{
"README.md": "bbffa3ed7ea5c1fb25d7d63f1ea5b10c37e8fd8ff7bffefe71605e649c503ad8",
"after_restore_page_normal.png": "d0fd54629f7b597a24247ee4d5707d80528da87bf68d9016cbf0199ec6c43cb8",
"after_restore_page_normal_raw3200.bin": "4deecb9373f766e3263e4b890bd7882798b91374aec43b7fc6e96dba3f353704",
"arrival_open_waveplay.png": "d0fd54629f7b597a24247ee4d5707d80528da87bf68d9016cbf0199ec6c43cb8",
"arrival_open_waveplay_raw3200.bin": "4deecb9373f766e3263e4b890bd7882798b91374aec43b7fc6e96dba3f353704",
"bad_segment_reject_wave06.png": "a013fdf6dbab1068a7b72b8239ac573c70cea5e8de8df9214ddc5cf153586b83",
"bad_segment_reject_wave06_raw3200.bin": "17291a0068f2d4ab099f636888e809941ad9bba52cad942ff6341a8677b72889",
"empty_state_no_segments.png": "ecb6151668b0d5ef0578576dd449d9d9a7f41031fd7c9f035a98de7132853d1b",
"empty_state_no_segments_raw3200.bin": "a76c41cfd7f38cecf1092777371869a0a28a4c0ca09eb6963e17afc94d713f66",
"empty_state_recheck.png": "ecb6151668b0d5ef0578576dd449d9d9a7f41031fd7c9f035a98de7132853d1b",
"empty_state_recheck_raw3200.bin": "a76c41cfd7f38cecf1092777371869a0a28a4c0ca09eb6963e17afc94d713f66",
"good_wave06_sec6_ua.png": "db205b08fb77ac51350b802b3541dd310de1eb7ec9529d9867f64794c1aa7d6b",
"good_wave06_sec6_ua_raw3200.bin": "d6a3ac65e04d5e62007d1f13b84be38982f0b217a4e4730037a54c1864854261",
"pc_side_dump.txt": "44890852d5560073359f6e7adad03fb8c7e06e24605dfe5b1c18d4fbf8985ae6",
"serial_excerpt.txt": "f4cf0ba2eada42917abc6d2347b2e3bde041a1ff4034b48d751f5d4f6f5a66a3",
"samples/WAVE06_bitflip_reject.BIN": "a9e097bfaa0e3df8542c637c29f120d1dee347956cf0013478448861f13c40ae",
"samples/WAVE06_original.BIN": "9f88ee3490c40867299e624a2eb2323ec33bb9ca5957737d2018b9e60205a6cc",
"samples/WAVE09_seed_bitflip_reject.BIN": "b4016966c6feed92b8a7f42ce42c109dbb8a608b9531f9bad35595c22d3d6471"
}
@@ -0,0 +1,44 @@
### dump WAVE06_original.BIN(覆盖前原件,板上现行字节) → rc=0
```
FILE : WAVE06_original.BIN (5250 bytes)
magic : 57 52 01 ('WR' + version byte 1)
ver : 1
fs_hz : 1000
pts_per_cycle : 20
ch_count : 8
pts_per_ch : 320 (320 ms at 1000 Hz)
pre_pts : 160
trig_src : 1 (MANUAL)
trig_elm : 0
t0_ms : 1246139 (ms since power-on)
wall : 1793609165 (epoch s)
eng : 0 (pin-domain)
flags_seq : 0x00 VALID bits: (none)
clip_mask : 0x00E6 [UB UC IB IC IN]
frame_seq : 1245891
CRC16(hdr) : 0x0C3B OK covers [0,126), low byte first
CRC16(data) : 0xF991 OK covers 5120 bytes, low byte first
-- channel table (8 entries x 12 B) --
IDX SEM NAME SRC BITS AVAIL K_Q16 B_CODES LSB_uV FLAG
0 0 UA TPAFE5160 16 0x00 10000000 0 152.587891 .
1 1 UB STM32-ADC1 12 0x02 52800000 0 805.664062 CLIPPED
2 2 UC STM32-ADC1 12 0x02 52800000 0 805.664062 CLIPPED
3 3 UN TPAFE5160 16 0x00 10000000 0 152.587891 .
4 4 IA TPAFE5160 16 0x00 10000000 0 152.587891 .
5 5 IB STM32-ADC1 12 0x02 52800000 0 805.664062 CLIPPED
6 6 IC STM32-ADC1 12 0x02 52800000 0 805.664062 CLIPPED
7 7 IN STM32-ADC1 12 0x02 52800000 0 805.664062 CLIPPED
```
### dump WAVE06_bitflip_reject.BIN(byte[130]^=0x01 同号覆盖件) → rc=1
```
REJECT: WAVE06_bitflip_reject.BIN: data CRC16 mismatch: stored 0xF991 calc 0xB111 over 5120 bytes at offset 128 -- segment rejected, nothing drawn
```
### dump WAVE09_seed_bitflip_reject.BIN(第二幕首攻样本:20261104 真段种子翻位,未进枚举见 README 发现 F1) → rc=1
```
REJECT: WAVE09_seed_bitflip_reject.BIN: data CRC16 mismatch: stored 0xF8AA calc 0xB02A over 5120 bytes at offset 128 -- segment rejected, nothing drawn
```
@@ -0,0 +1,180 @@
串口实录摘录(serial-assistant 日志原样,剔除 seg=0 心跳行)——2026-11-06 第二幕尾步两窗:
窗一 17:52:3x–17:54:5x:WAVE09 新文件首攻(坏版 STOR + 关开页,见 README 发现 F1)
窗二 18:10:0x–18:16:0x:同号覆盖主链(18:11:38 坏版 STOR→18:12:01 原字节恢复)+ 全删空态(18:14:4x DELE×10 → 18:14:55 open fail fr=4 → 18:15:0x-14 STOR 恢复×9 RETR sha 验)
[RX] 2026-11-06T17:52:35.660+08:00 [2026-11-06 17:52:34] [FTP] connection received from 192.168.31.161:60945...
[RX] 2026-11-06T17:52:35.670+08:00 [2026-11-06 17:52:34] [FTP] CMD USER admin
[RX] 2026-11-06T17:52:35.670+08:00 [2026-11-06 17:52:34] [FTP] CMD PASS admin
[RX] 2026-11-06T17:52:35.670+08:00 [2026-11-06 17:52:34] [FTP] CMD CWD /WAVE
[RX] 2026-11-06T17:52:35.680+08:00 [2026-11-06 17:52:34] [FTP] CMD TYPE A
[RX] 2026-11-06T17:52:35.691+08:00 [2026-11-06 17:52:34] [FTP] CMD PASV
[RX] 2026-11-06T17:52:35.742+08:00 [2026-11-06 17:52:34] [FTP] CMD NLST
[RX] 2026-11-06T17:52:35.918+08:00 [2026-11-06 17:52:34] [FTP] CMD TYPE I
[RX] 2026-11-06T17:52:35.918+08:00 [2026-11-06 17:52:34] [FTP] CMD PASV
[RX] 2026-11-06T17:52:35.969+08:00 [2026-11-06 17:52:34] [FTP] CMD STOR WAVE09.BIN
[RX] 2026-11-06T17:52:36.052+08:00 [2026-11-06 17:52:34] [FTP] UPLOAD '/WAVE/WAVE09.BIN' 5250 bytes OK
[RX] 2026-11-06T17:52:36.661+08:00 [2026-11-06 17:52:35] [FTP] CMD TYPE A
[RX] 2026-11-06T17:52:36.661+08:00 [2026-11-06 17:52:35] [FTP] CMD PASV
[RX] 2026-11-06T17:52:36.724+08:00 [2026-11-06 17:52:35] [FTP] CMD NLST
[RX] 2026-11-06T17:52:36.910+08:00 [2026-11-06 17:52:35] [FTP] CMD TYPE I
[RX] 2026-11-06T17:52:36.910+08:00 [2026-11-06 17:52:35] [FTP] CMD PASV
[RX] 2026-11-06T17:52:36.962+08:00 [2026-11-06 17:52:35] [FTP] CMD RETR WAVE09.BIN
[RX] 2026-11-06T17:52:37.128+08:00 [2026-11-06 17:52:36] [FTP] DOWNLOAD '/WAVE/WAVE09.BIN' OK
[RX] 2026-11-06T17:52:37.128+08:00 [2026-11-06 17:52:36] [FTP] CMD QUIT
[RX] 2026-11-06T17:52:37.149+08:00 [2026-11-06 17:52:36] [FTP] waiting for connection...
[RX] 2026-11-06T17:52:39.623+08:00 [2026-11-06 17:52:38][UI_CONTENT_PAGE] page close: id=wave_play
[RX] 2026-11-06T17:52:43.461+08:00 [2026-11-06 17:52:42][UI_CONTENT_PAGE] page open: id=wave_play rows=0
[RX] 2026-11-06T18:10:04.225+08:00 [2026-11-06 18:10:03] [FTP] connection received from 192.168.31.161:54991...
[RX] 2026-11-06T18:10:04.225+08:00 [2026-11-06 18:10:03] [FTP] CMD USER admin
[RX] 2026-11-06T18:10:04.246+08:00 [2026-11-06 18:10:03] [FTP] CMD PASS admin
[RX] 2026-11-06T18:10:04.257+08:00 [2026-11-06 18:10:03] [FTP] CMD CWD /WAVE
[RX] 2026-11-06T18:10:04.278+08:00 [2026-11-06 18:10:03] [FTP] CMD TYPE I
[RX] 2026-11-06T18:10:04.289+08:00 [2026-11-06 18:10:03] [FTP] CMD PASV
[RX] 2026-11-06T18:10:04.424+08:00 [2026-11-06 18:10:03] [FTP] CMD STOR WAVE06.BIN
[RX] 2026-11-06T18:10:04.487+08:00 [2026-11-06 18:10:03] [FTP] UPLOAD '/WAVE/WAVE06.BIN' 5250 bytes OK
[RX] 2026-11-06T18:10:05.098+08:00 [2026-11-06 18:10:03] [FTP] CMD TYPE I
[RX] 2026-11-06T18:10:05.098+08:00 [2026-11-06 18:10:04] [FTP] CMD PASV
[RX] 2026-11-06T18:10:05.171+08:00 [2026-11-06 18:10:04] [FTP] CMD RETR WAVE06.BIN
[RX] 2026-11-06T18:10:05.346+08:00 [2026-11-06 18:10:04] [FTP] DOWNLOAD '/WAVE/WAVE06.BIN' OK
[RX] 2026-11-06T18:10:05.357+08:00 [2026-11-06 18:10:04] [FTP] CMD QUIT
[RX] 2026-11-06T18:10:05.367+08:00 [2026-11-06 18:10:04] [FTP] waiting for connection...
[RX] 2026-11-06T18:11:20.089+08:00 [2026-11-06 18:11:18][UI_CONTENT_PAGE] page open: id=wave_play rows=0
[RX] 2026-11-06T18:11:38.915+08:00 [2026-11-06 18:11:37] [FTP] connection received from 192.168.31.161:54867...
[RX] 2026-11-06T18:11:38.936+08:00 [2026-11-06 18:11:37] [FTP] CMD USER admin
[RX] 2026-11-06T18:11:38.946+08:00 [2026-11-06 18:11:37] [FTP] CMD PASS admin
[RX] 2026-11-06T18:11:38.967+08:00 [2026-11-06 18:11:37] [FTP] CMD CWD /WAVE
[RX] 2026-11-06T18:11:38.967+08:00 [2026-11-06 18:11:37] [FTP] CMD TYPE I
[RX] 2026-11-06T18:11:38.998+08:00 [2026-11-06 18:11:37] [FTP] CMD PASV
[RX] 2026-11-06T18:11:39.122+08:00 [2026-11-06 18:11:38] [FTP] CMD STOR WAVE06.BIN
[RX] 2026-11-06T18:11:39.216+08:00 [2026-11-06 18:11:38] [FTP] UPLOAD '/WAVE/WAVE06.BIN' 5250 bytes OK
[RX] 2026-11-06T18:11:39.837+08:00 [2026-11-06 18:11:38] [FTP] CMD TYPE I
[RX] 2026-11-06T18:11:39.837+08:00 [2026-11-06 18:11:38] [FTP] CMD PASV
[RX] 2026-11-06T18:11:39.879+08:00 [2026-11-06 18:11:38] [FTP] CMD RETR WAVE06.BIN
[RX] 2026-11-06T18:11:40.013+08:00 [2026-11-06 18:11:38] [FTP] DOWNLOAD '/WAVE/WAVE06.BIN' OK
[RX] 2026-11-06T18:11:40.013+08:00 [2026-11-06 18:11:38] [FTP] CMD QUIT
[RX] 2026-11-06T18:11:40.023+08:00 [2026-11-06 18:11:38] [FTP] waiting for connection...
[RX] 2026-11-06T18:12:02.780+08:00 [2026-11-06 18:12:01] [FTP] connection received from 192.168.31.161:53103...
[RX] 2026-11-06T18:12:02.802+08:00 [2026-11-06 18:12:01] [FTP] CMD USER admin
[RX] 2026-11-06T18:12:02.812+08:00 [2026-11-06 18:12:01] [FTP] CMD PASS admin
[RX] 2026-11-06T18:12:02.895+08:00 [2026-11-06 18:12:01] [FTP] CMD CWD /WAVE
[RX] 2026-11-06T18:12:02.895+08:00 [2026-11-06 18:12:01] [FTP] CMD TYPE I
[RX] 2026-11-06T18:12:02.895+08:00 [2026-11-06 18:12:01] [FTP] CMD PASV
[RX] 2026-11-06T18:12:02.957+08:00 [2026-11-06 18:12:01] [FTP] CMD STOR WAVE06.BIN
[RX] 2026-11-06T18:12:03.030+08:00 [2026-11-06 18:12:01] [FTP] UPLOAD '/WAVE/WAVE06.BIN' 5250 bytes OK
[RX] 2026-11-06T18:12:03.633+08:00 [2026-11-06 18:12:02] [FTP] CMD TYPE I
[RX] 2026-11-06T18:12:03.643+08:00 [2026-11-06 18:12:02] [FTP] CMD PASV
[RX] 2026-11-06T18:12:03.705+08:00 [2026-11-06 18:12:02] [FTP] CMD RETR WAVE06.BIN
[RX] 2026-11-06T18:12:03.839+08:00 [2026-11-06 18:12:02] [FTP] DOWNLOAD '/WAVE/WAVE06.BIN' OK
[RX] 2026-11-06T18:12:03.839+08:00 [2026-11-06 18:12:02] [FTP] CMD QUIT
[RX] 2026-11-06T18:12:03.860+08:00 [2026-11-06 18:12:02] [FTP] waiting for connection...
[RX] 2026-11-06T18:14:44.047+08:00 [2026-11-06 18:14:42] [FTP] connection received from 192.168.31.161:58594...
[RX] 2026-11-06T18:14:44.057+08:00 [2026-11-06 18:14:42] [FTP] CMD USER admin
[RX] 2026-11-06T18:14:44.057+08:00 [2026-11-06 18:14:42] [FTP] CMD PASS admin
[RX] 2026-11-06T18:14:44.067+08:00 [2026-11-06 18:14:42] [FTP] CMD CWD /WAVE
[RX] 2026-11-06T18:14:44.067+08:00 [2026-11-06 18:14:42] [FTP] CMD TYPE A
[RX] 2026-11-06T18:14:44.078+08:00 [2026-11-06 18:14:42] [FTP] CMD PASV
[RX] 2026-11-06T18:14:44.151+08:00 [2026-11-06 18:14:43] [FTP] CMD LIST
[RX] 2026-11-06T18:14:44.285+08:00 [2026-11-06 18:14:43] [FTP] CMD DELE WAVE00.BIN
[RX] 2026-11-06T18:14:44.627+08:00 [2026-11-06 18:14:43] [FTP] CMD DELE WAVE01.BIN
[RX] 2026-11-06T18:14:44.969+08:00 [2026-11-06 18:14:43] [FTP] CMD DELE WAVE02.BIN
[RX] 2026-11-06T18:14:45.312+08:00 [2026-11-06 18:14:44] [FTP] CMD DELE WAVE03.BIN
[RX] 2026-11-06T18:14:45.644+08:00 [2026-11-06 18:14:44] [FTP] CMD DELE WAVE04.BIN
[RX] 2026-11-06T18:14:45.997+08:00 [2026-11-06 18:14:44] [FTP] CMD DELE WAVE05.BIN
[RX] 2026-11-06T18:14:46.340+08:00 [2026-11-06 18:14:45] [FTP] CMD DELE WAVE06.BIN
[RX] 2026-11-06T18:14:46.672+08:00 [2026-11-06 18:14:45] [FTP] CMD DELE WAVE07.BIN
[RX] 2026-11-06T18:14:47.016+08:00 [2026-11-06 18:14:45] [FTP] CMD DELE WAVE08.BIN
[RX] 2026-11-06T18:14:47.358+08:00 [2026-11-06 18:14:46] [FTP] CMD DELE WAVE09.BIN
[RX] 2026-11-06T18:14:48.292+08:00 [2026-11-06 18:14:47] [FTP] CMD TYPE A
[RX] 2026-11-06T18:14:48.292+08:00 [2026-11-06 18:14:47] [FTP] CMD PASV
[RX] 2026-11-06T18:14:48.364+08:00 [2026-11-06 18:14:47] [FTP] CMD LIST
[RX] 2026-11-06T18:14:48.560+08:00 [2026-11-06 18:14:47] [FTP] CMD QUIT
[RX] 2026-11-06T18:14:48.602+08:00 [2026-11-06 18:14:47] [FTP] waiting for connection...
[RX] 2026-11-06T18:14:52.299+08:00 [2026-11-06 18:14:51][UI_CONTENT_PAGE] page close: id=wave_play
[RX] 2026-11-06T18:14:56.144+08:00 [2026-11-06 18:14:55][UI_CONTENT_PAGE] page open: id=wave_play rows=0
[RX] 2026-11-06T18:14:56.155+08:00 [2026-11-06 18:14:55][ERR][UI_TASK] ui wave head idx=8 open fail fr=4
[RX] 2026-11-06T18:14:59.703+08:00 [2026-11-06 18:14:58][ERR][UI_TASK] ui wave head idx=8 open fail fr=4
[RX] 2026-11-06T18:14:59.724+08:00 [2026-11-06 18:14:58][ERR][UI_TASK] ui wave head idx=8 open fail fr=4
[RX] 2026-11-06T18:15:02.069+08:00 [2026-11-06 18:15:00][UI_CONTENT_PAGE] page close: id=wave_play
[RX] 2026-11-06T18:15:05.361+08:00 [2026-11-06 18:15:04] [FTP] connection received from 192.168.31.161:60925...
[RX] 2026-11-06T18:15:05.372+08:00 [2026-11-06 18:15:04] [FTP] CMD USER admin
[RX] 2026-11-06T18:15:05.372+08:00 [2026-11-06 18:15:04] [FTP] CMD PASS admin
[RX] 2026-11-06T18:15:05.382+08:00 [2026-11-06 18:15:04] [FTP] CMD CWD /WAVE
[RX] 2026-11-06T18:15:05.382+08:00 [2026-11-06 18:15:04] [FTP] CMD TYPE I
[RX] 2026-11-06T18:15:05.393+08:00 [2026-11-06 18:15:04] [FTP] CMD PASV
[RX] 2026-11-06T18:15:05.466+08:00 [2026-11-06 18:15:04] [FTP] CMD STOR WAVE00.BIN
[RX] 2026-11-06T18:15:05.529+08:00 [2026-11-06 18:15:04] [FTP] UPLOAD '/WAVE/WAVE00.BIN' 5250 bytes OK
[RX] 2026-11-06T18:15:06.130+08:00 [2026-11-06 18:15:05] [FTP] CMD TYPE I
[RX] 2026-11-06T18:15:06.140+08:00 [2026-11-06 18:15:05] [FTP] CMD PASV
[RX] 2026-11-06T18:15:06.203+08:00 [2026-11-06 18:15:05] [FTP] CMD RETR WAVE00.BIN
[RX] 2026-11-06T18:15:06.367+08:00 [2026-11-06 18:15:05] [FTP] DOWNLOAD '/WAVE/WAVE00.BIN' OK
[RX] 2026-11-06T18:15:06.367+08:00 [2026-11-06 18:15:05] [FTP] CMD TYPE I
[RX] 2026-11-06T18:15:06.377+08:00 [2026-11-06 18:15:05] [FTP] CMD PASV
[RX] 2026-11-06T18:15:06.449+08:00 [2026-11-06 18:15:05] [FTP] CMD STOR WAVE01.BIN
[RX] 2026-11-06T18:15:06.522+08:00 [2026-11-06 18:15:05] [FTP] UPLOAD '/WAVE/WAVE01.BIN' 5250 bytes OK
[RX] 2026-11-06T18:15:07.135+08:00 [2026-11-06 18:15:06] [FTP] CMD TYPE I
[RX] 2026-11-06T18:15:07.135+08:00 [2026-11-06 18:15:06] [FTP] CMD PASV
[RX] 2026-11-06T18:15:07.197+08:00 [2026-11-06 18:15:06] [FTP] CMD RETR WAVE01.BIN
[RX] 2026-11-06T18:15:07.363+08:00 [2026-11-06 18:15:06] [FTP] DOWNLOAD '/WAVE/WAVE01.BIN' OK
[RX] 2026-11-06T18:15:07.363+08:00 [2026-11-06 18:15:06] [FTP] CMD TYPE I
[RX] 2026-11-06T18:15:07.373+08:00 [2026-11-06 18:15:06] [FTP] CMD PASV
[RX] 2026-11-06T18:15:07.445+08:00 [2026-11-06 18:15:06] [FTP] CMD STOR WAVE02.BIN
[RX] 2026-11-06T18:15:07.519+08:00 [2026-11-06 18:15:06] [FTP] UPLOAD '/WAVE/WAVE02.BIN' 5250 bytes OK
[RX] 2026-11-06T18:15:08.141+08:00 [2026-11-06 18:15:07] [FTP] CMD TYPE I
[RX] 2026-11-06T18:15:08.152+08:00 [2026-11-06 18:15:07] [FTP] CMD PASV
[RX] 2026-11-06T18:15:08.193+08:00 [2026-11-06 18:15:07] [FTP] CMD RETR WAVE02.BIN
[RX] 2026-11-06T18:15:08.370+08:00 [2026-11-06 18:15:07] [FTP] DOWNLOAD '/WAVE/WAVE02.BIN' OK
[RX] 2026-11-06T18:15:08.381+08:00 [2026-11-06 18:15:07] [FTP] CMD TYPE I
[RX] 2026-11-06T18:15:08.381+08:00 [2026-11-06 18:15:07] [FTP] CMD PASV
[RX] 2026-11-06T18:15:08.454+08:00 [2026-11-06 18:15:07] [FTP] CMD STOR WAVE03.BIN
[RX] 2026-11-06T18:15:08.538+08:00 [2026-11-06 18:15:07] [FTP] UPLOAD '/WAVE/WAVE03.BIN' 5250 bytes OK
[RX] 2026-11-06T18:15:09.139+08:00 [2026-11-06 18:15:08] [FTP] CMD TYPE I
[RX] 2026-11-06T18:15:09.150+08:00 [2026-11-06 18:15:08] [FTP] CMD PASV
[RX] 2026-11-06T18:15:09.191+08:00 [2026-11-06 18:15:08] [FTP] CMD RETR WAVE03.BIN
[RX] 2026-11-06T18:15:09.366+08:00 [2026-11-06 18:15:08] [FTP] DOWNLOAD '/WAVE/WAVE03.BIN' OK
[RX] 2026-11-06T18:15:09.366+08:00 [2026-11-06 18:15:08] [FTP] CMD TYPE I
[RX] 2026-11-06T18:15:09.377+08:00 [2026-11-06 18:15:08] [FTP] CMD PASV
[RX] 2026-11-06T18:15:09.461+08:00 [2026-11-06 18:15:08] [FTP] CMD STOR WAVE04.BIN
[RX] 2026-11-06T18:15:09.512+08:00 [2026-11-06 18:15:08] [FTP] UPLOAD '/WAVE/WAVE04.BIN' 5250 bytes OK
[RX] 2026-11-06T18:15:10.117+08:00 [2026-11-06 18:15:09] [FTP] CMD TYPE I
[RX] 2026-11-06T18:15:10.127+08:00 [2026-11-06 18:15:09] [FTP] CMD PASV
[RX] 2026-11-06T18:15:10.191+08:00 [2026-11-06 18:15:09] [FTP] CMD RETR WAVE04.BIN
[RX] 2026-11-06T18:15:10.367+08:00 [2026-11-06 18:15:09] [FTP] DOWNLOAD '/WAVE/WAVE04.BIN' OK
[RX] 2026-11-06T18:15:10.367+08:00 [2026-11-06 18:15:09] [FTP] CMD TYPE I
[RX] 2026-11-06T18:15:10.378+08:00 [2026-11-06 18:15:09] [FTP] CMD PASV
[RX] 2026-11-06T18:15:10.450+08:00 [2026-11-06 18:15:09] [FTP] CMD STOR WAVE05.BIN
[RX] 2026-11-06T18:15:10.513+08:00 [2026-11-06 18:15:09] [FTP] UPLOAD '/WAVE/WAVE05.BIN' 5250 bytes OK
[RX] 2026-11-06T18:15:11.117+08:00 [2026-11-06 18:15:10] [FTP] CMD TYPE I
[RX] 2026-11-06T18:15:11.127+08:00 [2026-11-06 18:15:10] [FTP] CMD PASV
[RX] 2026-11-06T18:15:11.190+08:00 [2026-11-06 18:15:10] [FTP] CMD RETR WAVE05.BIN
[RX] 2026-11-06T18:15:11.366+08:00 [2026-11-06 18:15:10] [FTP] DOWNLOAD '/WAVE/WAVE05.BIN' OK
[RX] 2026-11-06T18:15:11.366+08:00 [2026-11-06 18:15:10] [FTP] CMD TYPE I
[RX] 2026-11-06T18:15:11.377+08:00 [2026-11-06 18:15:10] [FTP] CMD PASV
[RX] 2026-11-06T18:15:11.555+08:00 [2026-11-06 18:15:10] [FTP] CMD STOR WAVE06.BIN
[RX] 2026-11-06T18:15:11.576+08:00 [2026-11-06 18:15:10] [FTP] UPLOAD '/WAVE/WAVE06.BIN' 5250 bytes OK
[RX] 2026-11-06T18:15:12.180+08:00 [2026-11-06 18:15:11] [FTP] CMD TYPE I
[RX] 2026-11-06T18:15:12.191+08:00 [2026-11-06 18:15:11] [FTP] CMD PASV
[RX] 2026-11-06T18:15:12.253+08:00 [2026-11-06 18:15:11] [FTP] CMD RETR WAVE06.BIN
[RX] 2026-11-06T18:15:12.398+08:00 [2026-11-06 18:15:11] [FTP] DOWNLOAD '/WAVE/WAVE06.BIN' OK
[RX] 2026-11-06T18:15:12.398+08:00 [2026-11-06 18:15:11] [FTP] CMD TYPE I
[RX] 2026-11-06T18:15:12.408+08:00 [2026-11-06 18:15:11] [FTP] CMD PASV
[RX] 2026-11-06T18:15:12.470+08:00 [2026-11-06 18:15:11] [FTP] CMD STOR WAVE07.BIN
[RX] 2026-11-06T18:15:12.554+08:00 [2026-11-06 18:15:11] [FTP] UPLOAD '/WAVE/WAVE07.BIN' 5250 bytes OK
[RX] 2026-11-06T18:15:13.156+08:00 [2026-11-06 18:15:12] [FTP] CMD TYPE I
[RX] 2026-11-06T18:15:13.156+08:00 [2026-11-06 18:15:12] [FTP] CMD PASV
[RX] 2026-11-06T18:15:13.207+08:00 [2026-11-06 18:15:12] [FTP] CMD RETR WAVE07.BIN
[RX] 2026-11-06T18:15:13.363+08:00 [2026-11-06 18:15:12] [FTP] DOWNLOAD '/WAVE/WAVE07.BIN' OK
[RX] 2026-11-06T18:15:13.363+08:00 [2026-11-06 18:15:12] [FTP] CMD TYPE I
[RX] 2026-11-06T18:15:13.374+08:00 [2026-11-06 18:15:12] [FTP] CMD PASV
[RX] 2026-11-06T18:15:13.447+08:00 [2026-11-06 18:15:12] [FTP] CMD STOR WAVE08.BIN
[RX] 2026-11-06T18:15:13.519+08:00 [2026-11-06 18:15:12] [FTP] UPLOAD '/WAVE/WAVE08.BIN' 5250 bytes OK
[RX] 2026-11-06T18:15:14.145+08:00 [2026-11-06 18:15:13] [FTP] CMD TYPE I
[RX] 2026-11-06T18:15:14.145+08:00 [2026-11-06 18:15:13] [FTP] CMD PASV
[RX] 2026-11-06T18:15:14.186+08:00 [2026-11-06 18:15:13] [FTP] CMD RETR WAVE08.BIN
[RX] 2026-11-06T18:15:14.363+08:00 [2026-11-06 18:15:13] [FTP] DOWNLOAD '/WAVE/WAVE08.BIN' OK
[RX] 2026-11-06T18:15:14.363+08:00 [2026-11-06 18:15:13] [FTP] CMD TYPE A
[RX] 2026-11-06T18:15:14.374+08:00 [2026-11-06 18:15:13] [FTP] CMD PASV
[RX] 2026-11-06T18:15:14.436+08:00 [2026-11-06 18:15:13] [FTP] CMD LIST
[RX] 2026-11-06T18:15:14.561+08:00 [2026-11-06 18:15:13] [FTP] CMD QUIT
[RX] 2026-11-06T18:15:14.571+08:00 [2026-11-06 18:15:13] [FTP] waiting for connection...
[RX] 2026-11-06T18:15:18.286+08:00 [2026-11-06 18:15:17][UI_CONTENT_PAGE] page open: id=wave_play rows=0
[RX] 2026-11-06T18:15:21.817+08:00 [2026-11-06 18:15:20][UI_CONTENT_PAGE] page close: id=wave_play
+65 -7
View File
@@ -142,7 +142,7 @@ STM32(U17)为 LQFP144 脚号。
> 出处:`docs/任务规划/数据可信.md` §2.1(量程口径冻结)。本节把 **语义端子(二次侧)→ 子板/端子板 → 网名 `AINn` → 主板电阻网络 → 板级网名 `ADCn` → 转换器引脚 → 码值 → 满量程** 的链路**逐段**定口径。 > 出处:`docs/任务规划/数据可信.md` §2.1(量程口径冻结)。本节把 **语义端子(二次侧)→ 子板/端子板 → 网名 `AINn` → 主板电阻网络 → 板级网名 `ADCn` → 转换器引脚 → 码值 → 满量程** 的链路**逐段**定口径。
> ③ 段(`AINn` ↔ 转换器引脚)已有台架实测数值——变比 **1:1**,斜率实测见 §8.1;④ 段(语义端子 ↔ `AINn` 的子板/ > ③ 段(`AINn` ↔ 转换器引脚)已有台架实测数值——变比 **1:1**,斜率实测见 §8.1;④ 段(语义端子 ↔ `AINn` 的子板/
> 端子板变比)仓库内没有任何数据,只给口径与判据。 > 端子板变比)已于 **2026-11-06 按用户现场报参算定**(#41,登记与复核边界见 §7.2;子板原理图仍不在仓库内)。
**芯片级口径(定死,与前端网络无关)**: **芯片级口径(定死,与前端网络无关)**:
@@ -171,19 +171,77 @@ STM32(U17)为 LQFP144 脚号。
| ① 语义 ↔ 网名 ↔ 板级网名 ↔ 转换器代码通道 | §2/§3/§4/§5 的 17 路映射表 | **定死**(本文件为唯一权威) | | ① 语义 ↔ 网名 ↔ 板级网名 ↔ 转换器代码通道 | §2/§3/§4/§5 的 17 路映射表 | **定死**(本文件为唯一权威) |
| ② 转换器引脚电压 ↔ 码值 | TPAFE `U_pin = code × 152.59 µV`(code 带符号);STM32 `U_pin = code × 805.66 µV` | **定死**(纯转换器事实,上表) | | ② 转换器引脚电压 ↔ 码值 | TPAFE `U_pin = code × 152.59 µV`(code 带符号);STM32 `U_pin = code × 805.66 µV` | **定死**(纯转换器事实,上表) |
| ③ `AINn`(串联电阻子板侧)↔ `ADCn`/转换器引脚 | **变比 = 1:1(2026-10-27 定死)**:`ADCn` 节点只有 {串阻.2, 滤波 C, 转换器引脚},无对地元件(拓扑图见上)。旧"读法 A(2:1 分压 → 305.18 / 1611.3 µV/码)"**作废**——它是把接在差分负端的 1k 误读成对地分压 | **定死**(网表级结论 + **2026-10-27 台架实测确认**,见 §8.1:端子侧注入斜率 6544.2 码/V,与引脚侧理论 6553.6 差 0.14 %,不存在 2:1 分压)。已知电压注入验证已闭环 | | ③ `AINn`(串联电阻子板侧)↔ `ADCn`/转换器引脚 | **变比 = 1:1(2026-10-27 定死)**:`ADCn` 节点只有 {串阻.2, 滤波 C, 转换器引脚},无对地元件(拓扑图见上)。旧"读法 A(2:1 分压 → 305.18 / 1611.3 µV/码)"**作废**——它是把接在差分负端的 1k 误读成对地分压 | **定死**(网表级结论 + **2026-10-27 台架实测确认**,见 §8.1:端子侧注入斜率 6544.2 码/V,与引脚侧理论 6553.6 差 0.14 %,不存在 2:1 分压)。已知电压注入验证已闭环 |
| ④ 语义端子(二次端子)↔ `AINn` | 子板/端子板变比:仓库内**无任何文档**(`docs/硬件平台/` 只有 `.tel` 网表与分析报告,无子板原理图;§8 步骤 4) | **缺口**——待「端子/子板变比确认」实测确认;拿不到变比则"端子二次值"不成立、`eng` 保持 0 | | ④ 语义端子(二次端子)↔ `AINn` | 子板/端子板变比:**电压族(UA/UB/UC/UN)= 606.06 : 1(V/V)**、**电流族(IA/IB/IC/IN)= 29.4118 A/V**;由用户现场报参(2026-11-06,#41)按式算定,算式与复核边界见 §7.2 | **定死**(参数算定,非本板双表同测;数值确认归两点标定)——"端子二次值"口径成立;但 `eng` 在电气 8 路 `ADC_CAL_F_VALID` 全置位(两点标定卡)前**保持 0** |
**可评审结论**: **可评审结论**:
1. **ROM 默认系数按 ② 引脚口径冻结**:TPAFE 通道 `k = 152.59 µV/码`、STM32 通道 `k = 805.66 µV/码`;标定折算的输出单位 = **ADC 引脚电压 V**(`eng = 0`)。该口径**不依赖** ③④ 两个未决项,自本节点死即成立——这就是 M4 承诺边界止于“引脚电压”的依据(`docs/任务规划/数据可信.md` §2.6)。 1. **ROM 默认系数按 ② 引脚口径冻结**:TPAFE 通道 `k = 152.59 µV/码`、STM32 通道 `k = 805.66 µV/码`;标定折算的输出单位 = **ADC 引脚电压 V**(`eng = 0`)。该口径与 ③④ 变比何时定死**无关**,冻结当日即成立且此后不因 ④ 到手而改动——这就是 M4 承诺边界止于“引脚电压”的依据(`docs/任务规划/数据可信.md` §2.6)。
2. `docs/任务规划/数据可信.md` §2.1 旧表的“板级系数(输入侧)305.18 / 1611.3 µV/码”**已随 ③ 段定死而删除**(2026-10-27):该值按 2:1 分压折算,而网表证明 `ADCn` 节点无对地元件。板级系数 = 引脚侧系数(152.59 / 805.66);305.18 / 1611.3 今后只允许出现在“±10 V 档 LSB”语境(芯片手册口径),不得再当本板系数。 2. `docs/任务规划/数据可信.md` §2.1 旧表的“板级系数(输入侧)305.18 / 1611.3 µV/码”**已随 ③ 段定死而删除**(2026-10-27):该值按 2:1 分压折算,而网表证明 `ADCn` 节点无对地元件。板级系数 = 引脚侧系数(152.59 / 805.66);305.18 / 1611.3 今后只允许出现在“±10 V 档 LSB”语境(芯片手册口径),不得再当本板系数。
3. **满量程必须写明参考点**:TPAFE 通道满量程 = ±5 V **@ 引脚**(跨度 10 V);③ 已定 1:1、④ 仍未知,故端子侧满量程只允许写“引脚侧数值 × ④ 比”,**严禁**把“码 × 152.59 µV”当端子二次值写进代码/文档(那是引脚电压)。 3. **满量程必须写明参考点**:TPAFE 通道满量程 = ±5 V **@ 引脚**(跨度 10 V);③④ 现均已定死(④ 值见 §7.2),端子侧换算已允许写“引脚侧数值 × ④ 比”;但两点标定置 `VALID` 之前,**严禁**把“码 × 152.59 µV”当端子二次值写进代码/文档(那是引脚电压),§7.2 的标称系数只是算定值、不是已验证二次值。
4. **已知电压注入验证已于 2026-10-27 闭环**(六项判据全 PASS,实测见 §8.1):③ 段 1:1 由台架直接证实, 4. **已知电压注入验证已于 2026-10-27 闭环**(六项判据全 PASS,实测见 §8.1):③ 段 1:1 由台架直接证实,
② 引脚侧 LSB 与实测斜率差 0.14 %,逐通道映射与极性均已验。**仍待实测的是 ④**(端子→引脚 ② 引脚侧 LSB 与实测斜率差 0.14 %,逐通道映射与极性均已验。**④ 变比已于 2026-11-06 按用户现场报参算定**
变比,即端子/子板变比确认)与两点标定;两者完成前 `eng` 保持 0、输出单位仍是 ADC 引脚电压。 (§7.2;子板原理图仍不在仓库内,本板双表同测未做)。**仍待实测的是两点标定**(给端子域系数、置 `VALID`,
`eng` 随之升 1);标定完成前 `eng` 保持 0、输出单位仍是 ADC 引脚电压。
实测斜率与 ② 理论值偏差 >2 % 时**先查前端**(分压/变比/焊接),不得用系数凑错斜率 实测斜率与 ② 理论值偏差 >2 % 时**先查前端**(分压/变比/焊接),不得用系数凑错斜率
(`docs/任务规划/数据可信.md` §8 风险表)。 (`docs/任务规划/数据可信.md` §8 风险表)。
### 7.2 ④ 段变比登记(2026-11-06 定死)
> **来源**:用户现场报的子板参数(2026-11-06,Issue #41),按 `docs/任务规划/数据可信.md` §7 #2 的路 ①「按图(参数)直接算」
> 算得;子板原理图仍不在仓库内,路 ②「万用表同时量端子与引脚」未做——数值上的理想化偏差与逐路差归两点标定
> (见本节末「复核口径」)。
**电压族 UA/UB/UC/UN——子板 PT:2 mA/2 mA,输入侧 200 kΩ,输出侧 330 Ω**:
- 变比 = U端子 ÷ UAINn = (2 mA × 200 kΩ) ÷ (2 mA × 330 Ω):电流比 1:1 电流相消,只剩两侧负担电阻之比 =
200000 ÷ 330 = **606.060606… ≈ 606.06 : 1**(V/V,无量纲);
- 额定点(按参数推读):端子 **≈400 V**(2 mA × 200 kΩ)→ `AINn` 侧 **0.66 V**(2 mA × 330 Ω)。
**电流族 IA/IB/IC/IN——子板 CT:5 A/2.5 mA,输出侧负担电阻 68 Ω**:
- ADC 读的是负担电阻两端电压,所以这个"变比"是**带单位的比**:I端子 ÷ UAINn = 5 A ÷ (2.5 mA × 68 Ω) =
5 ÷ 0.17 = **29.4118 A/V**(= 匝比 2000 ÷ 68);与 V/V 无量纲量不可混写,进系数表须分注单位;
- 额定点:端子 **5 A** → `AINn` 侧 **0.17 V**。
**算术复核**:200000 ÷ 330 = 606.060606… ✓(用户给值 606.0606060606061);5 ÷ 0.17 = 29.41176470… ✓
(用户给值 29.41176470588235,与 2000 ÷ 68 同源)。两数与报参口径一致,未发现算误。
**②×③×④ 端到端标称系数**(③ 已定 1:1)——只作两点标定的初值与量级核对用,**ROM 不动**(ROM 出厂表
仍按 ② 引脚口径,§7.1 可评审结论 1):
| 族 | 转换器 | 端子域系数(标称) | 额定点码数(RMS) | 占转换器跨度 |
|---|---|---|---|---|
| 电压 UA/UN | TPAFE | 152.59 µV/码 × 606.06 = **92.48 mV/码** | 0.66 V ≈ 4325 码 | 10 V 跨度的 6.6 % |
| 电压 UB/UC | STM32 | 805.66 µV/码 × 606.06 = **488.28 mV/码** | 0.66 V ≈ 819 码 | 3.3 V 跨度的 20 % |
| 电流 IA | TPAFE | 152.59 µV/码 × 29.4118 A/V = **4.488 mA/码** | 0.17 V ≈ 1114 码 | 10 V 跨度的 1.7 % |
| 电流 IB/IC/IN | STM32 | 805.66 µV/码 × 29.4118 A/V = **23.70 mA/码** | 0.17 V ≈ 211 码 | 3.3 V 跨度的 5.2 % |
补一句:额定点正弦峰值 = RMS × √2(电压族 ≈0.93 V、电流族 ≈0.24 V),两片转换器的量程都装得下;STM32
五路交流负半周削到 0 的问题仍是 §7「前端偏置」行的 V0.1 既有口径,不是本节新发现。变比口径只圈电气 8 路,
温度与备用路不进 ④ 换算。
**eng 判定(「端子/子板变比确认」卡(#41)的完成判据)**:
- `eng = 1`(出端子二次值)两条件:④ 变比到手——**已满足**(本节,电压/电流两族);电气 8 路
`ADC_CAL_F_VALID` 全置位——**未满足**(`App/app/ui_data_feed.c` 的 `feed_eng()` 门,「两点标定与精度验收」卡承担)。
- 判定:**`eng` 保持 0**,输出单位仍是 ADC 引脚电压,M4 承诺边界不变。本节改变的是:两点标定从
「开不了工」变成「可开工」——端子侧参照已定死,本节标称系数即其起点。
**复核口径(别把本节数值当本板实测)**:
- 参数是铭牌/板面值:不含理想变压器偏差(励磁电流、绕组阻抗、负担误差),不含负担电阻容差,也不含逐路差
(电压 4 路共用 606.06、电流 4 路共用 29.4118,逐路真值以标定实测为准)。
- 下游机器面核对跟着在:两点标定的逐路实测系数吸收 ④ 段实际偏差;`App/algo/adc_cal.c` 合法带哨兵
(k ∉ ROM×[0.5, 2.0] → 回退 ROM)是「④ 数量级错了」的兜底。
- **本节标称系数是给「两点标定与精度验收」卡的输入,且带着两道存储口径题**(本卡不替它定案):
k 按 µV/码 int32 Q16 存储、上限 32767 µV/码(`docs/任务规划/数据可信.md` §4.1 的"远够"论断做在引脚域
假设上)——电压族端子域标称已越上限(92.48 mV/码 ≈ 92479 µV/码,UB/UC 达 488.28 mV/码 ≈ 488278 µV/码),
电流族两档(4488 / 23696 µV 等效)尚在带内;且合法带基准读 ROM 出厂表(现为引脚域系数),端子域 k
会被 [0.5, 2.0] 哨兵顶回。标定写入端子域系数之前,存储单位(或每路标度因子)与出厂表基准须一并换血,
否则正确的标定值也会被拒。
- 端子级上额定电压仍是独立动作:变比已从"没到手"变"到手",但"先量端子对地通断"的前置与风险次序不变
(`docs/任务规划/数据可信.md` §8),本卡不动高压。
--- ---
## 8. 逐通道验证方法(上板自检口径) ## 8. 逐通道验证方法(上板自检口径)
@@ -191,7 +249,7 @@ STM32(U17)为 LQFP144 脚号。
1. **TPAFE 侧**:对目标 `AIN` 注入 1 V DC → 观察对应 `buf[i]` 变化(UA→`buf[6]`、UN→`buf[5]`、IA→`buf[2]`),同时 U3.14 `BUSY` 有脉冲;**语义与下标不符即映射错**。✅ **2026-10-27 已执行**(原 2026-10-23 挂账的"无执行记录"已消除;`docs/硬件平台/V0.0_网表详细分析报告.md` §5.1 第 6 条的同一验证随之关闭)。判据按已知电压注入验证的**不需要示波器**口径执行:① "`BUSY` 有脉冲"改用固件帧计数——注入前后 `tpafe5160_frame_seq()` 仍严格 1000 Hz 递增即等价;② 幅值判据改用万用表读注入点实际电压 + 同时读 `adc_input_raw()` 码值,三点线性拟合(R² ≥ 0.999)。 1. **TPAFE 侧**:对目标 `AIN` 注入 1 V DC → 观察对应 `buf[i]` 变化(UA→`buf[6]`、UN→`buf[5]`、IA→`buf[2]`),同时 U3.14 `BUSY` 有脉冲;**语义与下标不符即映射错**。✅ **2026-10-27 已执行**(原 2026-10-23 挂账的"无执行记录"已消除;`docs/硬件平台/V0.0_网表详细分析报告.md` §5.1 第 6 条的同一验证随之关闭)。判据按已知电压注入验证的**不需要示波器**口径执行:① "`BUSY` 有脉冲"改用固件帧计数——注入前后 `tpafe5160_frame_seq()` 仍严格 1000 Hz 递增即等价;② 幅值判据改用万用表读注入点实际电压 + 同时读 `adc_input_raw()` 码值,三点线性拟合(R² ≥ 0.999)。
2. **STM32 侧**:对目标引脚(如 PC4=UB)注入 0.5 V → 读 `ADC_CHANNEL_14` 应变化;若不变而相邻通道变化 → 通道宏写错(见 §5 警告)。✅ **2026-10-27 已执行**(原 2026-10-10 的"尚未执行"已消除;当时台架只验证了"9 通道全部转换成功 + 零超时 + 互异非饱和 + 跨次开机读数不同",台架无信号源);映射的**代码侧**一致性有两道保证:① `App/algo/adc_input.c` 的 `k_adc_map[]` 与 CubeMX 标签(`ADC17_UB`=PC4 等)逐条对齐;② 开机自检 `adc_input_init()` 校验每个 STM32 语义通道都落在 `k_stm32_rank_ch[]` 扫描序列内(挡"映射到不扫描的通道 → 恒读陈旧值")。 2. **STM32 侧**:对目标引脚(如 PC4=UB)注入 0.5 V → 读 `ADC_CHANNEL_14` 应变化;若不变而相邻通道变化 → 通道宏写错(见 §5 警告)。✅ **2026-10-27 已执行**(原 2026-10-10 的"尚未执行"已消除;当时台架只验证了"9 通道全部转换成功 + 零超时 + 互异非饱和 + 跨次开机读数不同",台架无信号源);映射的**代码侧**一致性有两道保证:① `App/algo/adc_input.c` 的 `k_adc_map[]` 与 CubeMX 标签(`ADC17_UB`=PC4 等)逐条对齐;② 开机自检 `adc_input_init()` 校验每个 STM32 语义通道都落在 `k_stm32_rank_ch[]` 扫描序列内(挡"映射到不扫描的通道 → 恒读陈旧值")。
3. **备用通道**:RESERVED 路不接入任何语义,UI 与上报里不得出现;若实测有读数漂移,只记录不消费。 3. **备用通道**:RESERVED 路不接入任何语义,UI 与上报里不得出现;若实测有读数漂移,只记录不消费。
4. **端子侧变比(2026-10-23 补,2026-10-27 收窄)**:上面 1/2 两条都只到 **ADC 引脚**。③ 段(`AINn` ↔ 转换器引脚)已由网表追线定死为 **1:1**(`ADCn` 节点无对地元件,拓扑图见 §7.1),**板内不再有未知比值**;剩下的未知量只有 ④ **子板/端子板变比**——它在仓库里没有任何文档给出(`docs/硬件平台/` 只有 `.tel` 网表与分析报告,无子板原理图)。故**不得**用"2:1 分压"换算出二次值;该变比由「端子/子板变比确认」实测确认。 4. **端子侧变比(2026-10-23 补,2026-10-27 收窄)**:上面 1/2 两条都只到 **ADC 引脚**。③ 段(`AINn` ↔ 转换器引脚)已由网表追线定死为 **1:1**(`ADCn` 节点无对地元件,拓扑图见 §7.1),**板内不再有未知比值**;剩下的未知量只有 ④ **子板/端子板变比**,已于 2026-11-06 按用户现场报参算定收口(电压族 606.06 : 1、电流族 29.4118 A/V,算式与复核边界见 §7.2;子板原理图仍不在仓库内,数值确认归两点标定)。故**不得**用"2:1 分压"换算出二次值;端子口径一律按 §7.1 分段表与 §7.2 登记写。
### 8.1 2026-10-27 实测记录(首次执行,六项判据全 PASS) ### 8.1 2026-10-27 实测记录(首次执行,六项判据全 PASS)