Files
gd32e230f8_firmware_merge_tool/FlashTool/README.md
T

8.7 KiB
Raw Blame History

DAPLink Flash — GD32 固件烧录 · 补齐 · 镜像拼接

GD32E230 系列的桌面烧录/固件处理工具:OpenOCD 烧录DAPLink / GD-Link / ST-Link / J-Link+ 补齐 PadY-Modem 页对齐)+ 拼接 Merge Bootloader + APP + 有效标志 → 整片镜像)。

  • 只想用工具:到 Gitea Releases 下载 DAPLinkFlash-vX.Y.Z-win64.zip,解压双击 DAPLinkFlash.exe Windows 10/11 x64,免安装、无需 Python内置 OpenOCD 工具链)。
  • 要改代码/重新打包:见 §5、§6。

界面与构建方式对齐 DLPilot 项目(CustomTkinter 深色双栏仪表盘 + PyInstaller onefile + Gitea Release 发布)。更新:2026-09-14

1. 功能总览

功能 说明
OpenOCD 烧录 检测设备 / 烧录固件 / 整片擦除 / 读取 Flash / 复位芯片 / 停止,OpenOCD 输出实时进日志区
固件格式 BIN / HEX / ELF——HEX/ELF 自动用文件内地址,仅 BIN 需填基地址(完整镜像 0x08000000,单独 APP 0x08002000
芯片型号 GD32E230F4 / F6 / F8 / C8,自动带出 Flash 大小与 target 配置
烧录器 DAPLink / CMSIS-DAP、GD-Link、ST-Link、J-Link、CMSIS-DAP(TCP)、Custom;支持适配器速度与探针序列号
补齐 Pad BIN 尾部补 0xFF 到 1K/2K/4K 页边界;bootloader 的 Y-Modem 只按 1K 整包写 Flash,最后一包不满必须先补齐
拼接 Merge Bootloader + APP + 有效标志(0xEEEEEEEE @0x0800FFFC) → 整片 Flash 镜像,逻辑与 merge_bin.py 一致
内置工具链 发布包自带 OpenOCD(toolchain/openocd/)GUI 自动定位,免安装免配置
命令行模式 全部功能可脚本化调用(--flash / --pad / --merge ...,见 §4
外观 跟随系统深/浅色,顶栏可切换 Dark / Light / System

2. 下载与安装

  1. 打开 Releases 页面 取最新的 DAPLinkFlash-vX.Y.Z-win64.zip
  2. 解压到任意可写目录(配置 flash_gui_settings.json 写在 exe 旁边);
  3. 双击 DAPLinkFlash.exe。首次启动比脚本慢一两秒(onefile 解压),属正常现象。

包内包含:

DAPLinkFlash/
├── DAPLinkFlash.exe        主程序(单文件自包含)
├── toolchain/openocd/      内置 OpenOCDGUI 自动定位)
│   ├── bin/openocd.exe     + libftdi1.dll / libusb-1.0.dll
│   └── openocd/scripts/    interface / target 配置脚本
└── README.md               本说明

3. GUI 使用

主窗口为双栏仪表盘:

左列                                      右列
┌ 探针与工具链 [自动定位] ┐              ┌ 补齐 (Pad) — Y-Modem 对齐   ┐
├ 芯片与固件(型号/固件/基地址)┤        ├ 拼接 (Merge) — BL+APP+标志  ┤
└ 操作: 检测/烧录/擦除/读取/复位/停止 ┘   └ 运行日志 — OpenOCD 输出     ┘
  1. 选工具链:默认自动定位(内置 → 本机 D:/toolchain → PATH),左卡右上 "自动定位"可重新探测;也可手动浏览指定 openocd.exe 与 scripts 目录;
  2. 选芯片与烧录器:芯片型号下拉自动带出 Flash 大小和 target;烧录器下拉 自动带出 interface cfg;多探针时填序列号;
  3. 选固件:点"浏览"选 BIN/HEX/ELFBIN 确认基地址(完整镜像 0x08000000 单独 APP 0x08002000);
  4. **点"检测设备"**确认链路通 → 点"烧录固件";输出实时显示在右下日志区;
  5. 固件工具(右列):
    • 补齐:选输入 BIN 后输出名自动带出(*_pad.bin),对齐默认 1K,点"执行补齐"
    • 拼接:选 Bootloader 与 APP 后输出名自动带出(*_BL.bin),地址按典型布局 预填,点"执行拼接"。

典型布局:0x08000000 Bootloader 8KB | 0x08002000 APP | 0x0800FFFC 有效标志 0xEEEEEEEE | 0x08010000 Flash 结束 (64KB)。

配置(全部输入框的值)自动保存在 exe 旁的 flash_gui_settings.json,下次启动 自动恢复;旧版 config/flash_gui_<主机名>.json 在首次启动时自动迁移。

4. 命令行模式

exe 版无控制台,脚本化请用源码方式(或 build_exe.py --debug 打的带控制台变体):

python src/flash_gui.py                        启动 GUI
python src/flash_gui.py --seconds 5            GUI 5 秒自动关闭(冒烟测试)
python src/flash_gui.py --version              打印 OpenOCD 版本(验证工具链定位)
python src/flash_gui.py --detect               检测烧录器与目标芯片
python src/flash_gui.py --flash app.bin        烧录(BIN 默认基地址 0x08000000)
python src/flash_gui.py --flash app.bin --base 0x08002000 --no-reset
python src/flash_gui.py --erase                整片擦除
python src/flash_gui.py --read dump.bin        读取整片 Flash
python src/flash_gui.py --reset                复位运行
python src/flash_gui.py --pad app.bin          补齐到 1K → app_pad.bin
python src/flash_gui.py --merge bl.bin app.bin 拼接 → app_BL.bin
  --align N / --pad-byte 0xFF / -o OUT         pad 参数
  --app-addr / --flag-addr / --flash-size / --flag-value   merge 参数
  --speed 4000 / --serial SN / --interface cfg / --target cfg
  --openocd PATH / --scripts DIR               手动指定工具链(默认自动定位)

退出码:OpenOCD 操作非 0 即失败,可直接用于 CI/脚本串联。

5. 目录结构与从源码运行

FlashTool/
├── src/                        # 源代码(人工维护区)
│   ├── flash_gui.py            # 入口与命令行模式(argparse 分发)
│   ├── app_gui.py              # CustomTkinter 主界面(双栏仪表盘)
│   ├── openocd_runner.py       # 工具链定位 / OpenOCD 命令构建与子进程
│   ├── fw_image.py             # 补齐(pad)/拼接(merge) + 芯片参数表
│   ├── config.py               # 运行目录与 flash_gui_settings.json 配置
│   ├── build_exe.py            # PyInstaller 打包 → release/
│   ├── package_release.py      # 组装发布 zipexe + 内置 OpenOCD 工具链)
│   ├── publish_gitea.py        # 上传到 Gitea Release
│   └── logos/                  # 图标源(make_ico.py + png/ico
├── release/                    # 构建与发布产物(机器生成区, 不手改/不入库)
│   ├── DAPLinkFlash.exe        # 打包单文件版
│   ├── toolchain/openocd/      # package_release.py 复制的内置工具链
│   └── *.zip                   # 发布包(上传 Gitea Release
├── toolchain/openocd/          # (可选) vendor 进仓库的工具链, 不入库
├── start_flash_gui.bat         # 源码模式双击启动器
└── README.md                   # 本说明

从源码运行:python src/flash_gui.py 或双击 start_flash_gui.bat 需 Python ≥3.10 + customtkinterpy -m pip install customtkinter); OpenOCD 用本机安装(默认找 D:/toolchain/openocd)或先跑一次 package_release.py 把工具链放进 release/toolchain/

6. 构建与发布

cd src
python logos/make_ico.py        # (可选) 改图标后重新生成 png/ico, 需 Pillow
python build_exe.py             # 打包 → ../release/DAPLinkFlash.exe(约 19MB;
                                #   自动装 PyInstaller, CTk 主题数据自动收集)
python build_exe.py --debug     # 额外出一个带控制台的调试变体(命令行模式可见输出)
python package_release.py 0.1.0 # 组装 release/DAPLinkFlash-v0.1.0-win64.zip
                                #   含内置 OpenOCD 工具链(来源见脚本说明)
python publish_gitea.py DAPLinkFlash-v0.1.0-win64.zip --insecure
                                # 上传 Gitea Release(需环境变量 GITEA_TOKEN)

版本号默认从最近的 DAPLinkFlash-v* git tag 推断,无 tag 时手动指定。

7. 注意事项 / FAQ

  • "找不到 OpenOCD":点"自动定位";发布包用户确认解压后 toolchain/openocd/ 目录和 exe 在一起;
  • 烧录失败排查:①"检测设备"先验链路;② 探针序列号留空可排除序列号问题; ③ 速度过高可降到 1000 kHz;④ DAPLink 固件过旧换 GD-Link 固件试试;
  • exe 放只读目录flash_gui_settings.json 写在 exe 旁边,只读目录存不了配置;
  • 重新打包后图标没变Windows 图标缓存,ie4uinit -show 或改个名即可;
  • 残留进程:修改源码重新打包前先结束残留的 DAPLinkFlash 进程 build_exe.py 会自动 taskkill);
  • 配置互不影响:exe 与源码脚本各自按所在目录保存 flash_gui_settings.json