2 changed files with 26 additions and 6 deletions
+4 -2
View File
@@ -88,11 +88,13 @@ GD32E230 系列固件处理与烧录工具仓库。本文件为项目标杆文
- 参数拼接审计:`flash_gui --pack -o` 加目录护栏(拒绝 .bin 路径,对齐根工具), - 参数拼接审计:`flash_gui --pack -o` 加目录护栏(拒绝 .bin 路径,对齐根工具),
全链路冒烟(GUI 弹窗/CLI/命名拼接)通过;`bootloader_disasm*.txt` 为分析 全链路冒烟(GUI 弹窗/CLI/命名拼接)通过;`bootloader_disasm*.txt` 为分析
副产物留在工作区未入库。 副产物留在工作区未入库。
- 2026-10-22 **v2.6.0 发布**(tag `DAPLinkFlash-v2.6.0`):重建 onedir exe
(冻结新 fw_pack,`--pack` 默认 profile 显示 `CeramixNano_MB_Dual_FW`、
旧名拒绝、UPDATE/FULL/FACTORY 产物冻结态验证通过),组 zip 23.1 MB
(内置 OpenOCD 0.11 工具链 + cfgs),已传 Gitea Release。
### 计划 / TODO ### 计划 / TODO
- GUI v2.6.0 打包发布(build_exe → package_release → publish_gitea,需新 tag
`DAPLinkFlash-v2.6.0`;exe 已验证可打包 v2,zip 尚未组);
- (待用户物理排查)当前目标板对 SWD 完全无应答(`cannot read IDR`,复位下 - (待用户物理排查)当前目标板对 SWD 完全无应答(`cannot read IDR`,复位下
100k~4000k 全失败,同探针同工具链曾可连):需确认目标板供电、DAPLink RST → 100k~4000k 全失败,同探针同工具链曾可连):需确认目标板供电、DAPLink RST →
GD32 NRST 连线、必要时拔插 DAPLink USB / 目标板断电重上电;恢复后用 GD32 NRST 连线、必要时拔插 DAPLink USB / 目标板断电重上电;恢复后用
+22 -4
View File
@@ -10,7 +10,7 @@ fw_pack — GD32E230 双固件打包公共库 (CLI 与 FlashTool GUI 共用)
锚点擦除态 → A 向量非法 → 落 B 记录校验 → 跳出厂固件) 锚点擦除态 → A 向量非法 → 落 B 记录校验 → 跳出厂固件)
*.md5.txt 产物 MD5 清单 + 布局摘要 *.md5.txt 产物 MD5 清单 + 布局摘要
规则与 BL dev_fact 侧 (v5.1) 逐字一致: 规则与双固件 bootloader 侧逐字一致:
- CRC-16/XMODEM (poly 0x1021, init 0x0000, 不反转, 无 xorout), - CRC-16/XMODEM (poly 0x1021, init 0x0000, 不反转, 无 xorout),
自检向量 b"123456789" -> 0x31C3; 自检向量 b"123456789" -> 0x31C3;
- A 包: 补 0xFF 至整 N 页; body 恰整页或 余量 < 记录长 R -> 向后扩 1 页; - A 包: 补 0xFF 至整 N 页; body 恰整页或 余量 < 记录长 R -> 向后扩 1 页;
@@ -38,7 +38,7 @@ __all__ = [
'pack_all', 'suggest_full_name', 'suggest_factory_name', 'pack_all', 'suggest_full_name', 'suggest_factory_name',
] ]
TOOL_VERSION = '2.1' TOOL_VERSION = '2.2' # 2.2: 新增内置 profile CeramixNano_EDDY_Dual_FW
# GD32E230 家族 SRAM: F8 最大 8K, SP 必须落在其中 (F4/F6 的 4K 也在范围内) # GD32E230 家族 SRAM: F8 最大 8K, SP 必须落在其中 (F4/F6 的 4K 也在范围内)
SRAM_LO, SRAM_HI = 0x20000000, 0x20002000 SRAM_LO, SRAM_HI = 0x20000000, 0x20002000
@@ -197,7 +197,7 @@ class SlotSpec:
# ═══════════════════════════════════════════════════════════ # ═══════════════════════════════════════════════════════════
BUILTIN_PROFILES = { BUILTIN_PROFILES = {
# CeramixNano-MB v5.1 双固件 BL 的布局 (BL dev_fact@512bf7a) # CeramixNano-MB 双固件 bootloader 的布局
'CeramixNano_MB_Dual_FW': { 'CeramixNano_MB_Dual_FW': {
'profile': 'CeramixNano_MB_Dual_FW', 'profile': 'CeramixNano_MB_Dual_FW',
'chip': 'GD32E230F8', 'chip': 'GD32E230F8',
@@ -214,6 +214,24 @@ BUILTIN_PROFILES = {
'flag': {'page': 'last', 'addr': '0x0800FFFC', 'value': '0xEEEE'}, 'flag': {'page': 'last', 'addr': '0x0800FFFC', 'value': '0xEEEE'},
'crc': 'xmodem', 'crc': 'xmodem',
}, },
# CeramixNano EDDY (LDC1612) 双固件布局——Flash 分配与 MB 完全相同;
# BL 用专属分支 bootloader_CeramixNano_EDDY 的 bin(LED=PB1,与 MB 分支并列、独立编号)
'CeramixNano_EDDY_Dual_FW': {
'profile': 'CeramixNano_EDDY_Dual_FW',
'chip': 'GD32E230F8',
'flash_base': '0x08000000',
'flash_size': '64K',
'page_size': 1024,
'bl': {'addr': '0x08000000', 'size': '8K'},
'slot_a': {'addr': '0x08002000', 'size': '36K',
'anchor': 'slot_end-4',
'record': '{pages16@+0, crc16@+2}'},
'slot_b': {'addr': '0x0800B000', 'size': '19K', 'fixed_slot': True,
'record': '{magic16@+0=0xC0DE, pages16@+2, crc16@+4}',
'record_addr': 'slot_end-8'},
'flag': {'page': 'last', 'addr': '0x0800FFFC', 'value': '0xEEEE'},
'crc': 'xmodem',
},
# 无保底槽的单槽布局 (旧 BL 升级过渡 / 无 B 槽工程) # 无保底槽的单槽布局 (旧 BL 升级过渡 / 无 B 槽工程)
'f8_single_slot': { 'f8_single_slot': {
'profile': 'f8_single_slot', 'profile': 'f8_single_slot',
@@ -555,7 +573,7 @@ def build_full(profile, bl_data, a_pack, b_pack=None):
def build_factory(profile, bl_data, b_pack): def build_factory(profile, bl_data, b_pack):
"""工厂烧录镜像: BL + B 满槽(含记录) + flag, **无 A 包、无锚点**。 """工厂烧录镜像: BL + B 满槽(含记录) + flag, **无 A 包、无锚点**。
上电判定链(v5.1 BL): A 锚点为擦除态(0xFFFF...) → legacy flag + A 向量校验 上电判定链(双固件 BL): A 锚点为擦除态(0xFFFF...) → legacy flag + A 向量校验
(A 槽全 0xFF → 向量非法) → 落 B 记录 {magic|pages|crc} 校验 → 跳出厂固件; (A 槽全 0xFF → 向量非法) → 落 B 记录 {magic|pages|crc} 校验 → 跳出厂固件;
后续 OTA 写入 A 槽后即切运行固件。 后续 OTA 写入 A 槽后即切运行固件。
""" """