外观
野火 GD32H759 + fireDAP:在 macOS 上编译、烧录并停到 main
烧录工具说成功,板子就一定跑对了吗?这次用一个跑马灯例程,把“编译出来”“写进 Flash”“正在运行”“能停在源码上”分开验证。
设备是野火 GD32H759 和 fireDAP,主机是 Apple Silicon Mac。以下版本与结果来自 2026-09-11 的实测,不依赖官方 IDE。
先让工具认出芯片
fireDAP 经 USB 接 Mac,经 SWD 接开发板。它的 CMSIS-DAP v2 bulk 端点负责调试,CDC 端点另提供虚拟串口 /dev/cu.usbmodem*,两者不是同一条通路。
| 项目 | 本次配置 / 读数 |
|---|---|
| 探针 | fireDAP,USB VID:PID 1FB9:5601 |
| 芯片 | GD32H759,Cortex-M7 r1p2,600MHz |
| SWD 身份 | DPIDR 0x0bd12477 |
| pyOCD | 0.45.1,目标 gd32h759ig,SWD 1MHz |
| Flash 算法 | GigaDevice.GD32H7xx_DFP.1.5.0.pack |
| 编译器 | xpack arm-none-eabi-gcc 15.2.1 |
| 存储 | Flash 0x08000000 / 3840K;RAM 0x24000000 / 512K |
当时 pyOCD 的公共 pack 索引找不到 GD32H7,需要从兆易 AddOn 包中取出 DFP,再用 --pack 指定。能认出 Cortex-M7,只证明调试链路通了;有匹配的 Flash 算法,才能继续烧录。
编译完成,不等于程序已经上板
工程采用 GCC/CMake 模板。本次构建约 9 秒,生成 ELF、hex、bin,Flash 占用 2772B。ELF 保留符号,后面调试时用它。
模板有一处容易漏看:编译用 -mcpu=cortex-m7,链接却写成 cortex-m3。先统一为 M7,再谈板上问题。
工具链下载也曾卡住:原始源两次超时,GitHub 下载约 294MB 的包时只到约 48KB/s。后来把已下载的包预置在自己的服务器,方便其他机器复用。这是缓存方案,不保证任何网络下都快;下载后仍要核对官方 SHA256。
写进去了,还要看它有没有在动
pyOCD 本次擦除 1 个 sector、写入 1 个 page,速率约 25–37 kB/s。随后读回 0x08000000 的向量表:初始 SP 为 0x24080000,Reset 向量位于 0x08000xxx,与产物一致。
这证明了写入与读回,但没有证明跑马灯逻辑正确。为此,复位运行后每隔约 0.7 秒暂停一次,读取 GPIOC 的 OCTL(0x58020814),再恢复执行。
| 采样次序 | GPIOC OCTL |
|---|---|
| 1 | 0x800 |
| 2 | 0x200 |
| 3 | 0x1000 |
| 4 | 0x400 |
四次采样看到了四个 LED 输出状态,说明程序在推进。它们是间隔采样,不是每次切灯的完整轨迹;暂停读寄存器也会扰动时序,不能拿这张表证明精确周期。
最后停在 main,而不是停在“已连接”
pyOCD gdbserver 与 GDB 通过 extended-remote :3333 连接。加载同一份带符号 ELF 后,首次暂停能看到 delay_1ms(count=500),位置是 systick.c:68。再复位,才命中 main.c:60 的断点(本次地址 0x08000494)。
gdb
file build-gcc/gd32H7_gcc.elf
target extended-remote :3333
break main
monitor reset halt
continue
bt
info registers如果程序已经进入 while(1),只下 break main 再 continue,不会倒回启动入口。看起来“卡住”,未必是连接失败。
附录:本次遇到的故障与资料
| 现象 | 本次处理 |
|---|---|
DebugPortSetup No ACK | 同一链路 OpenOCD 可通;pyOCD 改用 -O frequency=1000000 后通过。不能据此断言所有 No ACK 都与接线无关 |
Unable to open device | 先停止占用探针的 gdbserver,再烧录 |
| 找不到 GD32H7 | 显式指定 DFP pack,不只依赖在线索引 |
| GCC 下载受阻 | 缓存已校验的发行包;曾尝试 zig cc,因裁源文件、改链接脚本及 libc/gdb 配套问题放弃 |
本文记录使用 pyOCD 0.45.1;连通性排查另用 OpenOCD 0.12 借 stm32h7x.cfg 验证。地址、源码行号、耗时均属于这份例程和这次环境,不是所有 GD32H7 工程的固定值。