# 固件首次联调记录入口 本文件对应通用 8 分区监测候选。当前 **NOT_BUILT / FABRICATION_HOLD**,未连接调试器或串口、未烧录。制造前仍须闭合 `dfm-review-requests.csv`、MOS 间距/绝缘和叠板工艺。这里的数字检查不解除这些条件。 ## 已完成的预检 `verification/firmware-preflight/audit.json` 将当前 PCB、网络模型、70 个继承固件文件与本轮隔离编译绑定。编译使用 GCC 16.2.0,开启 `-Wall -Wextra -Werror`。新 BIN 与原 BIN 逐字节一致: ```text firmware/board/build/LWC8-A02-v02.bin 9492 bytes SHA256 65c20ed4414e2f5f46e2dd7663878f8221b4908263ff7aab49a4173058e8616f Flash origin 0x08000000 ``` Flash 容量为 128 KiB,静态 RAM 为 1784 字节,另有 2048 字节栈预留。`arm-none-eabi-size` 的 bss 汇总包含栈预留,不能把该汇总当成静态全局变量用量。`main` 静态栈帧为 296 字节,但这不是完整调用链、库函数和中断叠加后的栈上界;首次运行仍需测量栈水位。 已核对 34 个 GPIO 的当前原生焊盘/模型网络、J3 五针及向量表的初始 SP、Reset、HardFault、SysTick、USART1 项。`mcu-pin-map.csv` 的目标板测试栏均为 NOT_TESTED。源文本见证与人工接口审查不构成所有代码路径的形式化证明。[STM32G071 数据手册 DS12232 Rev5](https://www.st.com/resource/en/datasheet/stm32g071cb.pdf) 的表 6、12–14用于核对 VREF 校准与复用功能;本轮未归档该 PDF 本地副本。 ## 首次 SWD 与启动 先按 `physical-bringup-plan.md` 做无电检查和限流供电。J3:1 = +3V3 参考,2 = GND,3 = SWDIO,4 = SWCLK,5 = NRST;用实际板上 pin1 标识核对插头方向。+3V3 是调试参考,避免调试器供电与运行电源并联。 记录目标板序号、PCB 哈希、调试器型号、目标身份、实际编程器版本及命令/日志。确认 STM32G071CBT6 后,使用已配置的编程器写入上述候选,再从 0x08000000 读回 **9492 字节**,逐字节比较或核对 SHA256。完整 Flash 读回包含额外填充值时,应明确提取上述范围;目标运行、空余 Flash 和掉电行为另行记录。未提供具体编程器,故这里不附猜测的烧录命令。 源代码在输出模式建立前将报警、健康、蜂鸣命令置低;RS485 DE 默认低,AFE 三路 CS 默认高,P/N 驱动先低后开始互补扫描。这些只是代码与网络审查结果。实测上电、复位和掉电时的命令脚、继电器触点和 DE 波形,不能从软件推导触点一定无瞬时动作。看门狗设置基于内部 LSI,其实际超时须测量。 ## 空白 FRAM 的首次初始化 当前固件不自动格式化空白或无效 FRAM。由 `main.c` 和 `journal.c` 的实际分支确认,初始化需同时满足硬件/LED 可用、SERVICE 有效、RESET 持续至少 5 秒、八区有效干燥且各区干燥稳定至少 5 秒,以及 AFE 允许的后台时间窗口。普通复位在 NVM 有效时要求 RESET 至少 2 秒、全部启用区有效干燥稳定至少 5 秒且系统健康。 按实际线束和探测回路建立八区干燥条件,记录初始故障位及 LED;安装 SERVICE 后持续按 RESET,记录初始化完成、健康输出和 FRAM 读回证据。成功后松开 RESET、移除 SERVICE、重新上电确认,不用固定等待时长代替读回。若未成功,先排查供电、I²C、AFE 有效性与回路,保留故障现场。不要清空已有有效日志来模拟首次启动;应使用标识清楚的独立试验 FRAM/样机。 ## RS485 只读工具 `tools/bench_readonly.py` 仅发 FC04,默认地址 1,串口固定 **9600 8E1**。它要求显式串口路径,不扫描或自动打开设备;不发广播、静音、复位或配置写入。串口驱动必须保留 8E1,否则报错。当前仅验证了离线解析及本地 socket 收发,USB 转换器、系统串口驱动和实际总线尚未测试。选择支持自动收发方向的适配器;打开串口可能产生适配器自身的控制线行为,实际接线须先确认。 离线生成请求: ```sh python3 tools/bench_readonly.py request --slave 1 --block summary ``` 样机到位、隔离侧接线与偏置/终端配置确认后,将下面的路径替换为实际适配器,再运行。该命令本轮未执行: ```sh python3 tools/bench_readonly.py sample --port /dev/cu.REPLACE_WITH_ACTUAL_ADAPTER --slave 1 --output /tmp/LWC8-unit001-readback-001.json ``` 不指定 `--block` 时依次读 summary、states、raw、ap、bp、an、bn、continuity、candidates。可重复指定 `--block` 只读所需块。多块读取 **不是原子快照**,每块记录 UTC、耗时及原始收发帧;状态变化时不得将分时数据拼成一次同步采样。输出路径必须不存在,避免覆盖旧证据。CRC、地址、长度、模型或异常响应错误会保留原始帧并返回非零;本地回显不自动剥离,需解决适配器配置。 离线解析捕获帧: ```sh python3 tools/bench_readonly.py decode --slave 1 --block summary --hex REPLACE_WITH_CAPTURED_FRAME ``` | FC04 地址 | 当前定义 | |---|---| | 0…10 | AC 模式 0x0200;启用、现漏水、锁存、故障位图;输出/服务状态;事件计数高/低字;采集模型 1;测量/连续性无效位图 | | 0x10…0x17 | 已确认分区状态 | | 0x20…0x27 | 幅值/原始量 | | 0x30…0x37、0x40…0x47 | A 正相、B 正相 | | 0x50…0x57、0x60…0x67 | A 负相、B 负相 | | 0x70…0x77 | 连续性健康值 | | 0x80…0x87 | 候选分区状态 | 状态编号:DRY=0、LEAK=1、OPEN=2、SHORT=3、INVALID=4、DISABLED=5、INIT=6。状态字 bit0…5 分别为报警继电器、健康继电器、蜂鸣、静音、系统故障、SERVICE。寄存器间的空隙不合法,不应跨空隙读取。HOST PA0…7 ADC 是连续性/健康输入;电极湿水分类使用 AFE SPI ADC 的正负相数据,不能混用。 本轮由当前 C 控制器和 Modbus 源新编译生成 100 条帧,覆盖 11 种合成状态及 1 种非法地址异常。Python 消费者验证锁存/恢复、即时撤销健康、事件字序、CRC/地址/长度/保留位、分片、超时、回显和断开后的部分帧保留。结果在 `protocol-test-report.json`;这是软件协议证据,未测传感器、DE 时序或总线抗干扰。 ## 待执行记录 使用 `firmware-target-acceptance.csv` 保存原始证据路径、样机/配置及仪器设置。当前全部 NOT_TESTED。串口 OBSERVED/RESPONSE_DECODED 仅说明收到可解析数据,不验证固件身份,也不自动判定目标测试 PASS。保护验收原表 `acceptance.csv` 的六项状态和证据保持原样。