generated from hulk/gd32e23x_template_cmake_vscode
9.0 KiB
9.0 KiB
AGENTS.md — CeramixNano EDDY(ldc1612_cmake_vscode)项目约定与进度
项目概述
CeramixNano EDDY 电涡流传感器单板固件(工程目录名沿用 ldc1612_cmake_vscode):
LDC1612(电涡流/电感数字转换器)+ TMP112(板载温度),RS485 串口命令协议
(D5 03 LEN [cmd] CRC,板卡类型 0x03),支持温度补偿与标定。
- 协议文档:
CommunicationProtocol.md;寄存器速查:LDC1612_REG_LIST.md - 命名/版本规则(2026-10-24 起):产物名
CeramixNano-EDDY_*,板卡码 26 (M999 应答v26.主.次.修订,与 MB 的 25 同源规则);版本维护在cmake/project_config.cmake(编译时生成 version.h,Inc/version.h说法已过时)
工具链与构建
- 语言/环境:C99,GD32E23x 标准库(
SDK/),MCU GD32E230F8(64K Flash/8K RAM) - 编译器:xpack-arm-none-eabi-gcc 15.2.1(
GD32_GCC_BIN环境变量解析) - 构建:CMake + Ninja,preset
Debug/Release,输出Build/<preset>/Application/及Build/<preset>/CeramixNano-EDDY_<版本>_<variant>_<日期>.bin/.hex等 (variant:dev 线APP,golden 线golden) - 烧录/调试(.vscode/tasks.json、launch.json):
- OpenOCD:
GD32_OPENOCD_BIN指向定制构建(含 gd32e23x flash 驱动,CMSIS-DAP 后端) Flash MCU (DAPLink)任务 +.vscode/openocd_daplink_gd32e23x.cfg: 适配 DAPLink 探针(无 connect_assert_srst;该选项在此 DAPLink 上会导致 examination 失败,但 SRST 线是接通的,见下文排障)- J-Link 任务需 SEGGER 探针 + PATH 中 JLink.exe(当前接的是 DAPLink,不适用)
- OpenOCD:
- 调试器探针历史问题(2026-10-02 已解决):DAPLink 的 CMSIS-DAP v1 接口曾被 Zadig
装上 libwdi WinUSB 驱动(oem244.inf),导致 OpenOCD 枚举不到探针;删除该驱动包后
恢复 HID。若复发:管理员运行
pnputil /delete-driver <oemNN.inf> /uninstall。 - 串口验证:RS485 转 USB(FTDI,COM15),115200-8N1,需同时置位 RTS+DTR (转换器方向控制),否则命令发不出去;DAPLink 虚拟串口为 COM8。
- 本地测试工具(git 不跟踪,在
Toolchain/eddy_test/):eddy_cmd.py(D5 帧命令行)、soc_ota.py(PC 模拟 SOC 完整 OTA/Ymodem,支持--abort-after/--no-ca中止模式)、swd.py(OpenOCD 封装:probe/image/boot/erasepage/read/dump)、verify_pack.py、verify_dump.py(独立 CRC 复算与读回比对)。
硬件/板级约定(Inc/board_config.h)
- MCU:GD32E230(自动探测 Flash 容量,64KB → USART1 作 RS485)
- RS485:SP3487(无自动方向),USART1 PA2(TX)/PA3(RX),DE=PA1(USART 硬件 DE,AF1)
- I2C0:PF0(SDA)/PF1(SCL),硬件 IIC 100kHz(
SOFTWARE_IIC可切换软模拟,默认关闭) - LED:PB1
- 传感器:LDC1612 @0x2B(40MHz 外部时钟),TMP112 @0x49(ADD0=GND)
- 调试宏(均默认关闭):DEBUG_VERBOSE / COM_DEBUG / LDC_DEBUG / EDDY_DRIVE_CURRENT_DETECTION
双固件布局(2026-10-24 移植完成,与 CeramixNano-MB 完全相同的 Flash 分配)
0x08000000 ┌─────────────────┐
│ Bootloader │ 8K 页 0~7 复用 MB 板 BL bin(V0.1.0,4,044B,MD5 f7b447cf…)
0x08002000 ├─────────────────┤
│ FW_A 运行槽 │ 36K 页 8~43 OTA/Ymodem 接收区;锚点 A 记录@0x0800AFFC
0x0800B000 ├─────────────────┤
│ FW_B 出厂保底槽│ 19K 页 44~62 golden 线构建;B 记录@0x0800FBF8
0x0800FC00 ├─────────────────┤
│ 末页标志页 │ 1K 页 63 legacy 0xEEEE@0x0800FFFC
0x08010000 └─────────────────┘
- BL 复用:直接使用
gd32e230_bootloader仓库bootloader_CeramixNano_MB分支 V0.1.0 bin(RS485 引脚/波特率/DE 方案与 EDDY 完全一致;唯一差异 LED 引脚 MB=PA14 / EDDY=PB1——BL 的 LED 仅 Ymodem 收包闪烁,纯装饰,EDDY 板不亮无碍)。 - A 线 = dev/main:链接 0x08002000 / LENGTH 36K(LD 上限防溢出 B 槽), VTOR 0x2000;版本从 V1.0.3 起(首个双固件 A 版本,码 26)。
- B 线 = release/golden:链接 0x0800B000 / LENGTH 0x4BF8(19K−8B,B 记录由打包
工具写入,链接区不含尾 8B——与 MB 的 .fw_tail 方案等价),VTOR 0xB000;
版本冻结 V1.0.2(保底判定值 = M999 返回
v26.1.0.2⇔ 在跑 FW_B,该版本号 永不再用于 OTA 升级包)。此分支改动不得合回 dev/main。 - 打包:
hulk-mcu-firmwareskill / merge tool profileCeramixNano_EDDY_Dual_FW(布局与CeramixNano_MB_Dual_FW逐字节相同),产出_UPDATE/_FULL/_FACTORY + MD5。 - 升级链路:上位机(原 SOC 职责)—RS485—> BL(Ymodem);APP 用
M9999软复位进 升级模式(SWRSTF=1 ⇒ BL 直留升级模式)。握手:BL 发ok→0x30→ BLok→0x31→ 预擦 A+末页 →'C'周期 → Ymodem(文件头 ACK 后 ACK+'C' 连发, 发送器须一次等齐)→ EOT → ACK×2 → 跳新固件。 - 完全体方案文档:
E:\Hulk-Coding\capsule_mb_camke_vscode\doc\双固件方案_完全体说明.md。
开发进度
已完成
- LDC1612 驱动(初始化/单通道配置/原始值读取/状态检查)
- TMP112 驱动(初始化/温度读取/阈值/单次转换)
- RS485 命令体系:M1/M2(周期上报开关)、M3(涡流原始值)、M4(温度×10000)、 M5(温度补偿涡流值)、M6(标定数据:涡流+温度)、M999(版本)、M9999(复位)
- v1.0.1:涡流传感器温度标定方法与标定命令(M6)
- 2026-10-02:IIC 驱动改进导入(总线恢复重试/超时辅助/read_raw/scan AERR 处理); 硬件全命令实测通过;DAPLink 烧录问题解决;发布 V1.0.2(Gitea Release + tag)
- 2026-10-24:双固件(出厂救援)方案移植完成并全链路实测通过(详见下节)
- BL 复用 MB V0.1.0 bin(未改动 BL 代码,仅文档说明)
- dev:LD 54K→36K、命名 CeramixNano-EDDY、板卡码 26、V1.0.3; golden:V1.0.2 冻结命名 + variant=golden
- 两线 CMake 补齐
--gap-fill=0xFF与LD LINK_DEPENDS - fw_pack 新增
CeramixNano_EDDY_Dual_FWprofile(55 项回归过,skill 缓存已同步) - 产物(
Build/test/dualfw_2026-10-24/):UPDATE(12 页,trailer 0x5C09000C)、 FULL(A=V1.0.3/B=V1.0.2,19 项校验过)、FACTORY(12 项校验过)+ MD5 清单; 独立 python XMODEM 复算全部命中 - 硬件实测矩阵(SWD 探针 PC 采样 + 485 命令双重手段,全部 PASS): FACTORY→跳B(v26.1.0.2) / FULL→记录路径跳A(v26.1.0.3) / PC 模拟 SOC 完整 OTA 44s 成功+读回整片逐字节与包一致(B 区在真实 OTA 中毫发无损)/ 擦锚点页→legacy 跳A / 锚点在位毁A体→CRC 拦截直落B(防降级)/ 再毁B体→拒跳坏固件停留 BL(PC=0x080001B6) / OTA 第4包 CA 中止→落B / 非整页裸 bin 包→头部预检 CA×2 拒收→落B / M3/M4/M6 功能全通
计划 / TODO
- dev → main 合并待发布节奏(V1.0.3 为首个双固件 A 版本,main 仍是 54K 单槽布局)
- M5 温度补偿系数目前为 0(TEMP_COMP_COEFF_*),待标定后填入实际温漂系数
- 上位机/SOC 侧需预存保底判定值
v26.1.0.2(跑 B ⇒ 升级未生效重推) - (可选)模板侧 SEGGER RTT / CFG_ENABLE 宏体系同步
教训(避免复发)
- SWRSTF 残留:M9999/调试器软复位置位的 SWRSTF 不随 NRST/SRST 清除(仅 POR
或 RSTFC 清),此后任何复位 BL 都直进升级模式、不跳 APP——表现为"设备沉默,
M999 无响应,但 0x30 能回 ok"。排障/测试时须 SWD
mww 0x40021024 0x01000000清标志后再放跑(swd.py boot已内置)。 - BL 收到 0x30 后 SWD 必死:复用的 MB BL 在 0x30 应答后调用 gpio_init 把
PA14(EDDY 板=SWCLK)切为 LED 输出。因此:探针类 SWD 操作前不要发 0x30;
OTA/升级会话结束后 SWD 失联属预期,恢复 =
M9999复位(PA14 回默认)后再连。 若 APP 也没在跑(BL 卡收包),用 connect_assert_srst 变体 cfg (Toolchain/eddy_test/daplink_srst.cfg)脉冲 SRST 复位恢复——SRST 线已验证接通, 但该 DAPLink 下 examination 必失败属正常,复位本身生效。 - Ymodem 文件头 ACK 后是 ACK+'C' 连发:发送器若分两次等会永远等不到第二个 'C' (首次 OTA 调试即栽在此,BL 无超时会卡死;随后发 5×CA 可解)。
- OpenOCD
program/dump_image的文件路径必须转正斜杠,否则 Tcl 吃掉\l\t。 - legacy 路径(锚点擦除态+flag 在)没有 CRC 安全网:实测毁 A 体后仍会跳进坏 A 导致 HardFault(xPSR=0x41000003)——这正是 v5 记录机制存在的意义,量产镜像必须 带锚点(FULL/OTA 正常路径均带)。