GD32这几年在国产MCU里热度一直很高,指令集兼容STM32的F1/F2/F3/F4等系列,换过来基本不用大改代码,采购成本和供货稳定性又比进口芯片省心,所以越来越多项目直接拿它当主控。我做嵌入式开发这些年,从STM32切到GD32之后,发现很多朋友卡住的第一个点不是写代码,反而是烧录。Keil里编译完一按下载,要么提示找不到芯片,要么连接超时,要么芯片直接锁死,问题五花八门。与其一个一个回答,不如把GD32烧录这件事从头到尾讲透,从工具选型、驱动安装、接线方式,到固件下载、Keil集成、VSCode扩展,再到解锁和避坑,一篇全捋清楚。
这篇文章主要面向两类人:一是刚开始用GD32、照着STM32习惯折腾烧录结果频频翻车的新手;二是已经上板调试,遇到“芯片读保护”“连接失败”“驱动装不上”等实际问题,想快速找到解决办法的工程师。内容以GD-Link Utility这个官方工具为主,配套GD32官方固件库的资源获取方式,同时补充J-Link、OpenOCD、串口ISP等替代方案,方便你根据手头的调试器灵活选择。
1. 动手之前,先搞清楚烧录的底层逻辑
1.1 烧录的本质:把程序写进Flash,并且让芯片知道你写了什么
很多刚从51单片机转过来的朋友,对“烧录”的理解就是“把hex文件塞进芯片”,但到了ARM Cortex-M架构的GD32上,整个过程远不止复制文件这么简单。
GD32芯片内部的Flash区域不仅存你写的程序,还存着中断向量表、选项字节(Option Byte)、读保护等级等信息。烧录器通过SWD或JTAG接口连上芯片后,要做的是:
- 擦除指定扇区,保证Flash处于全0xFF状态;
- 把编译生成的hex或bin文件按地址逐段写入;
- 校验写入的数据是否与文件一致;
- 必要时配置选项字节,比如读保护等级、看门狗配置、BOOT启动方式等。
这就像往仓库里搬货,你得先知道每个货架(扇区)的编号和承重,然后按位置码放,最后还要盘点一遍。GD-Link Utility做的事情就是把这套流程封装成了图形化界面,让你点几下鼠标就能完成。
1.2 GD-Link Utility在GD32开发中的定位
GD-Link Utility是兆易创新官方提供的烧录软件,免费、不需要注册、界面简洁,专门配合GD-Link调试器或者板载GD-Link使用。它对应的地位相当于ST家的STM32CubeProgrammer,但体积更小,操作更直接。
实际工作中我用它主要干这几件事:
- 烧录hex/bin文件到GD32全系列芯片;
- 读取、修改、验证选项字节;
- 查看Flash内容,读取芯片信息;
- 解除芯片的读保护(解决“芯片锁死”问题);
- 擦除整片Flash,恢复到出厂干净状态。
对量产和研发来说,这几乎是一站式工具。特别要说的是,GD-Link Utility的芯片支持列表覆盖了GD32F1/F2/F3/F4/E1等主流系列,以及最新的GD32F5、GD32C1等型号,所以“全系列”这个词不是宣传话术,而是它真的能通吃。
2. 环境准备:驱动、软件、硬件一个都不能少
2.1 下载与安装GD-Link Utility软件
先说软件怎么来。GD32的官网地址是www.gd32mcu.com,进入“GD32 MCU”页面后,找“工具与软件”或者“开发工具”分类。GD-Link Utility的下载链接通常放在“GDLINK”“调试器”或“工具软件”栏目下。我第一次找的时候也绕了点弯路,因为页面上英文名有时候写的是“GD32 MCU ISP Programmer”或者“GD-Link Programmer”,注意认准“GD-Link Utility”这个全称。
下载下来是个exe安装包,直接双击安装,一路Next即可。装完后桌面会出现快捷图标,打开后界面主要有四个区域:
- 菜单栏和工具栏:文件加载、连接、烧录、擦除、选项字节等操作入口;
- 芯片信息区:显示当前连接的芯片型号、ID、Flash大小、读保护状态;
- 脚本/日志区:显示连接、擦除、写Flash的详细日志,排查问题主要看这里;
- Flash编程区:显示文件地址、目标地址、擦除方式等设置项。
安装过程中有个细节:它会自动安装GD-Link的USB驱动,但如果你电脑上之前装过其他调试器驱动,有概率会出现驱动冲突。安装完建议把调试器拔了重新插一次,让系统重新枚举设备。
2.2 GDLINK驱动装不上的解法
驱动是烧录环节里最容易出问题的点,没有之一。插上GD-Link后,打开设备管理器(Win+X,然后选“设备管理器”),正常情况会看到“GigaDevice”系列设备,比如:
- GigaDevice GD-Link ARM Debugger
- GigaDevice GD-Link CMSIS-DAP
如果看到黄色感叹号,说明驱动没装好。处理方法有几种:
- 用驱动精灵或360驱动大师扫描修复,这是最省事的,但注意别让它连其他硬件驱动也乱更新;
- 手动指定驱动路径:右键设备→更新驱动程序→浏览我的电脑→从GD-Link Utility安装目录里选驱动文件夹,一般在
C:\Program Files (x86)\GigaDevice\GD-Link Utility\Driver或类似路径下; - 如果系统提示“无法验证发布者”,按F8进入高级启动选项,禁用驱动程序强制签名后再装,这个在Win10/Win11上偶尔会遇到。
我自己的经验是,如果装完驱动怎么都不识别,先怀疑USB线。GD-Link调试器对线材要求不低,有些只能充电的线用不了,换根带数据传输的短线,大概率就好了。
2.3 硬件接线:SWD四根线看懂就够
GD-Link与目标板的连接,标准方案是SWD接口,只需要四根线:
| 信号 | 作用 | 接目标板位置 |
|---|---|---|
| SWDIO | 数据输入输出 | 芯片的SWDIO引脚(PA13) |
| SWCLK | 时钟信号 | 芯片的SWCLK引脚(PA14) |
| GND | 地线,必须同地 | 目标板GND |
| 3V3 | 供电 | 目标板VDD或者外部供电 |
有些调试器还引出了RST引脚,用来复位目标芯片,但SWD方式不是必须的。我个人习惯在SWDIO和SWCLK各串一个0欧电阻,平时烧录正常,万一程序把引脚复用成普通IO了,直接断开电阻还能救回来。
注意接线长度不要太长。SWD虽然抗干扰比JTAG强,但线长超过20cm就容易在高速模式下翻车。GD-Link上有个频率选择,如果遇到连接不稳定,先把速度降低,比如从10MHz降到1MHz,这是最土但最有效的解法。
3. 手把手烧录:GD-Link Utility完整操作流程
3.1 建立连接:芯片选择是第一步
打开GD-Link Utility后,首先在工具栏找到“Target”下拉框,选择你当前用的芯片型号。这个步骤很多人会忽略,但芯片型号选错,后面的连接和烧录大概率出错。
选择型号的要点:GD32F103系列和STM32F103系列引脚兼容,但GD-Link Utility识别芯片是靠芯片内部的Device ID来校验的。你选了GD32F103RCT6,工具会自动读取硬件上的ID Code,两边对不上就会报错。所以,别想着“我用的GD32,但里面拿STM32型号来选行不行”,工具不会认。
选好型号后,点“Connect”或者“Target→Connect”,正常情况下日志区会打印类似:
Connecting to target... Target device ID: 0x410 Device: GD32F103C8T6 Flash size: 64 KB Connection established.这时芯片信息区会显示具体的型号、Flash容量、读保护等级。如果连接失败,优先检查接线、供电、芯片是否进入低功耗模式,以及SWD引脚有没有被程序占用。
3.2 载入固件文件:hex和bin的处理方式
连接成功后,点击“File→Open”或工具栏上的文件夹图标,选择你的固件文件。
- hex文件:Intel hex格式,自带地址信息,工具会自动识别每条数据记录对应的Flash地址,你不需要手动设偏移;
- bin文件:裸二进制数据,没有地址信息,需要你手动填写“Download Address”,比如GD32F103的Flash起始地址是0x08000000。
这里有个坑要提醒:Keil默认编译输出的是axf文件,想要hex或bin,需要额外勾选配置。Keil里的操作是:
- 打开“Options for Target”;
- 切到“Output”选项卡;
- 勾选“Create HEX File”。
bin文件生成需要在“User”选项卡的After Build/Rebuild里加一条指令:
fromelf --bin --output="$(ProjectDir)\Objects\@L.bin" "#L"实操中我一般优先用hex文件,因为地址信息自带,少操心。
3.3 执行烧录与校验
载入文件后,确认Flash编程区域的配置:
- Erase Type:擦除方式,建议选“Full Chip”,省事且干净。缺点是全片擦除比较慢,如果只是小改动,也可以选“Sector Erase”只擦除涉及扇区;
- Program @:目标起始地址,用hex文件时自动填充,用bin时需要手动指定;
- Verify After Programming:强烈建议勾选。程序烧完工具会把Flash内容再读一遍和文件对比,确认没有写入异常。
点“Program”或“Download”按钮后,日志区会显示类似内容:
Erasing sectors... Programming at address 0x08000000... Programming done. Verifying... Verification OK.看到“Verify OK”或者“Download successful”才是真正烧录成功。烧完后一般还要断电重启板子,或者点“Reset Run”让芯片复位运行。
3.4 选项字节的读取、修改与坑
GD-Link Utility的“Option Bytes”功能,是实际项目里最容易踩坑的地方。
GP32和几乎所有Cortex-M MCU一样,选项字节里存着读保护等级(RDP)、硬件看门狗、BOOT模式等关键配置。默认情况下,出厂值一般是:
- RDP等级:0xAA(Level 0,无读保护);
- WDG_SW:硬件看门狗选择软件模式,方便调试;
- BOOT_MODE:从主Flash启动或从系统存储启动。
我遇到过不少朋友,在开发调试阶段,程序里不小心把读保护等级改成了Level 1(0xBB)或Level 2(0xCC),结果芯片直接连不上调试器,Keil报“RDDI-DAP Error”或者“Cannot access target”。这种症状就是大家常说的“芯片锁死”。
解除锁死的方法很简单:
- 打开GD-Link Utility,连接目标芯片;
- 点“Option Bytes”—“Read”读取当前配置;
- 把RDP等级改回Level 0(0xAA);
- 点“Apply”,工具会先擦除整片Flash再写入新的选项字节。
注意:解除读保护的过程会强制擦除整个Flash,不管你之前写了什么都会没掉。所以,片子“锁死”不等于变砖,只是Flash被保护了,数据也带不出来了。
4. 烧录失败、芯片异常?排查思路和解决方案
4.1 常见报错速查表
下面这张表是我整理的真实项目里最高频的报错和应对方法,建议收藏。
| 报错/现象 | 可能原因 | 快速解法 |
|---|---|---|
| No target connected | 接线错误/目标板没供电 | 检查SWD四线,确认3V3和GND连接 |
| Target ID mismatch | 芯片型号选错 | 在Target里重新选择正确的GD32型号 |
| Cannot connect to target | 芯片已启用读保护/引脚被复用 | 按住复位键同时点Connect,等方法见下文 |
| RDDI-DAP Error | Keil连接失败 | 降低SWD频率,检查驱动,关闭其它占用调试器的软件 |
| Programming failed at address | Flash写入异常/电压不稳 | 换短线,降低SWD速率,检查目标板供电电压 |
| Verify error at address... | 烧录途中突然掉电或线松 | 重新插接线,重新烧录 |
| No Flash Device found | 驱动异常/芯片进入DFU模式 | 重装驱动,看设备管理器是否识别 |
4.2 按住复位键点连接,80%的救砖场景能用这招
如果你遇到“芯片已被程序搞死”,比如你在代码里初始化了SWD引脚、把时钟配置错了导致芯片跑飞,或者不小心启用了读保护,常规的连接方式可能一直失败。
这时候有个老朋友级别的技巧:按住目标板上的复位键,然后在GD-Link Utility里点Connect,同时在释放复位键的瞬间观察连接日志。原理是:芯片复位的极短时间内,调试接口仍然可用,工具抓住这个窗口期建立连接,然后在该时间段内执行全片擦除,把故障程序清掉。
操作步骤:
- 按住目标板复位键不放;
- 在工具里点Connect;
- 出现“Connecting...”字样时,瞬间释放复位键;
- 如果运气好,连接成功并读取到芯片ID;
- 立刻执行擦除整片Flash。
这招在单片机救砖圈是通用的,GD32、STM32都适用。如果一次不成功,可以多试几次,或者用GD-Link Utility的“Under Reset”模式(部分版本支持),效果类似。
4.3 GD32芯片锁死与解锁的完整操作
解锁操作在上一节已经提过,但这里我想补充两个细节:
第一,Level 2读保护是“永久保护”,一旦设置成0xCC,芯片将无法再通过调试接口做任何操作,连擦除都不行。所以GD32官方文档明确写Level 2是不可逆的,相当于把芯片物理封死。研发阶段千万别碰这个选项,除非你要批量出货且彻底不需要调试了。
第二,有些客户反馈“我烧录的时候提示读保护,怎么都连不上”,有时候不是读保护等级的问题,而是固件里调用了库函数nvic_irq_enable之类,把调试接口给关了。这种属于代码层面问题,解锁思路同上,按住复位键抢连接窗口,擦除后重新烧一个干净程序即可。
4.4 DFU模式:GD32的另一条烧录通道
除了SWD调试器,GD32还支持DFU模式烧录。DFU全称Device Firmware Upgrade,本质是芯片出厂固化的Bootloader里提供的一套USB升级协议。很多GD32芯片自带USB模块,把BOOT0引脚拉高后上电,芯片就会进入系统存储区运行Bootloader,通过USB连接电脑,可以被识别为一个DFU设备。
DFU模式和SWD烧录的关系是互补的:
- SWD适合开发调试,连接稳定,速度快,能在线仿真;
- DFU适合量产或现场升级,不需要额外的调试器,一根USB线就能烧。
GD32进入DFU模式的操作一般是:
- 把BOOT0跳到1(或用跳线帽短接);
- 用USB线连接GD32开发板的USB口和电脑;
- 上电复位;
- 电脑设备管理器出现“GD32 DFU Device”。
然后借助官方工具或第三方工具(如DfuSeDemo、GD32 MCU DFU Tool)来加载固件。
在网上搜“GD32 DFU驱动”时经常看到有人问装不上。原因是Win10/Win11系统默认不自动加载GD32的DFU驱动,需要手动安装,驱动文件一般在官方工具包或SDK的Utilities目录下。同样注意,安装时可能需要禁用驱动签名。
5. 不止烧录:固件库下载与工程搭建指南
5.1 官方固件库的下载渠道与版本选择
烧录这件事本身不难,但“能烧录的程序”得先从固件库开始。GD32官方固件库的获取途径主要有两个:
- 官方网站:
www.gd32mcu.com,在“GD32 MCU”栏目下按芯片系列进入,找到“资料下载”或“技术文档”,部分系列会提供“固件库”压缩包; - GitHub:兆易创新官方维护了
GigaDevice组织,里面有各系列的固件库仓库。
以GD32F30x为例,固件库压缩包解压后的目录结构大致如下:
GD32F30x_Firmware_Library/ ├── Board // 板级驱动示例 ├── Examples // 外设例程,枚举很全 ├── Firmware │ ├── CMSIS // 内核相关头文件和启动文件 │ └── GD32F30x_standard_peripheral │ ├── inc // 标准外设头文件 │ └── source // 标准外设源文件 ├── Projects // 标准工程模板,含MDK/EWARM等 └── Utilities // 常用工具和调试辅助代码固件库分两种风格:标准外设库和HAL库。GD32官网对F1/F2/F3/F4等主流系列都提供标准外设库,它和STM32的StdPeriph风格类似,函数名稍有不同比如gpio_init()对应STM32的HAL_GPIO_Init()。GD32H7等新系列则开始推广HAL风格。如果你是ST老用户,转过来会感觉很亲切。
5.2 从固件库建立标准工程模板
很多新手一开始最迷茫的就是“库下载下来不会建工程”。我建议直接拿官方“Projects”里的现有模板改。
比如GD32F103系列,固件库的Projects/01_GPIO_Running_Led就是最常见的跑马灯例程。用Keil打开后,你会看到一致的工程结构:
- 启动文件:
startup_gd32f10x_hd.s(根据Flash容量选择ld、md、hd等); - CMSIS系统文件:
system_gd32f10x.c和system_gd32f10x.h; - 标准外设库源文件:
gd32f10x_gpio.c、gd32f10x_rcu.c、gd32f10x_usart.c等; - 主程序:
main.c和gd32f10x_it.c中断处理。
修改工程模板时有几个关键点:
- 芯片型号必须选择“GigaDevice”下的具体型号,Keil如果没识别到,需要先安装GD32的Device Pack;
- C/C++宏定义里要加对应型号的宏,比如
GD32F10X_HD或GD32F30X_HD,这决定了启动文件和代码里条件编译走哪一段; - 把标准外设库的include路径全部加进工程,漏掉就会报找不到头文件。
5.3 Keil、VSCode、Embedded Builder:工具链怎么组合
GD32开发最主流的IDE还是Keil MDK。跟STM32一样,GD32在Keil里需要安装Device Pack才能看到芯片型号。Pack安装方式:
- 打开Keil MDK的Pack Installer;
- 点右上角“齿轮”图标,从本地安装GD32的pack文件;
- pack文件可以从官网或GitHub下载,通常叫
GigaDevice.GD32F10x_DFP.xxx.pack。
装完pack后,新建工程里选Target,就能看到“GigaDevice”厂牌和对应的GD32芯片型号。选芯片后,启动文件、Flash算法都会自动匹配好,连烧录算法(FLM文件)都不用手动添加,这步很省心。
如果你不想用Keil,现在也有两个越来越流行的玩法:
- VSCode + EIDE插件:EIDE是VSCode里的一个嵌入式开发插件,支持GD32工程管理、编译、烧录。网上热词里提到的“vscode的eide插件开发gd32”,确实是一条很顺的路。EIDE的好处是免费、轻量、跨平台,用Keil的GCC或ARM Compiler都能翻编译。烧录时还可以调用外部工具链。
- GD32 Embedded Builder:兆易创新推出的免费IDE,基于Eclipse+GCC,内置了GD32的工程向导,选完芯片型号自动生成模板,省去手动搬运固件库的麻烦。但它对调试器支持度略逊于Keil,如果你主要用J-Link搭配,可能还是建议Keil或VSCode。
5.4 用J-Link、OpenOCD烧GD32:替代方案经验
有些朋友手头没有GD-Link,只有J-Link或者ST-Link。能不能用来烧GD32?能。
用J-Link烧GD32:
J-Link的Segger工具包本身就支持几乎所有Cortex-M内核芯片。打开J-Flash软件:
- 新建工程,芯片型号选择时选“Cortex-M3/M4”对应内核,或者手动填GD32型号;
- 设置SWD连接模式;
- 加载hex/bin文件,点Program。
有时候J-Flash的芯片库会提示GD32型号ID码不识别,这种情况直接选相同内核的通用Cortex-M3/M4选项即可。GD32F10x是Cortex-M3内核,GD32F30x/F4xx是Cortex-M4F,选对应的就行。
用OpenOCD烧GD32:
OpenOCD是一款开源调试工具,支持众多MCU和调试器。接线方式与GD-Link完全一致。命令行传入脚本,比如:
openocd -f interface/cmsis-dap.cfg -f target/stm32f1x.cfg -c "program output.hex verify reset exit"GD32F10x的内核和寄存器基本兼容STM32F10x,所以很多现成的STM32 target配置文件能直接跑。如果你用的调试器是CMSIS-DAP,那GDLINK本质上也是一个CMSIS-DAP设备,直接复用cmsis-dap.cfg接口脚本。
用ST-Link烧GD32:
ST-Link识别GD32需要一点技巧,因为ST-Link官方驱动对非ST芯片会校验IDCODE。常见做法是:
- 用STM32CubeProgrammer连接GD32,需要手动加“DEV_ID”到芯片列表或者用“Under Reset”模式;
- 或者用OpenOCD时,interface选stlink.cfg,target选stm32f1x.cfg,OpenOCD不做ID校验,能正常连接。
不过体验下来,稳定性不如GD-Link原生支持,建议有条件还是配一个GD-Link或J-Link。
6. 烧录之外的经验补充
最后聊几个开发过程中和烧录强相关的小经验。
关于烧录这件事本身,GD32系列在SWD接口的性能上表现不错,SWD最高能跑到几十MHz,但实际调试我并不会一直顶着上限用。原因很简单:接线质量、目标板布局、供电纹波都会影响稳定性。与其在高速模式下频繁掉线,不如稍微降低一点频率换安心。很多“烧录失败”问题,追根到底是低速就稳、高速就崩的接触问题。
我在实际项目里有一个习惯:给每个用到SWD的板子预留一组4P或10P的调试接口座,同时在板上加一个100nF的退耦电容靠近SWD接口供电脚。别看一个电容不起眼,它能消掉不少高频干扰,尤其是配合GD-Link这类入门级调试器,效果立竿见影。另外,如果老板给了量产要求,优先考虑用串口ISP或DFU烧录方案,这样产线不需要配调试器,一台PC加一根线就能搞定,成本低很多。
关于读保护,我的建议是:研发阶段一律保持Level 0,量产阶段再按需求打开。那些一上来就开读保护“防止固件被抄”的,往往是连自己调试都调不了,最后还得求别人帮忙解锁。工程上固件加密有很多办法,但前提是保证自己还能改代码、还能烧录,别给自己找麻烦。
关于固件库,很多人下载完之后习惯直接开看主函数,我反而是建议先读readme.txt和Release_Notes。兆易创新的固件库虽然好用,但不同系列之间的驱动命名和外设bit定义有一定差异。花十分钟熟悉一下文件名和模块划分,后面找寄存器定义、改外设配置时能省下一大把时间。如果项目对中断实时性要求高,推荐直接操作寄存器或者用CMSIS层接口,标准外设库在Flash和RAM资源紧张的场合可能显得有些冗余。
另外,烧录软件和Keil插件不是古董软件,该升级就升级。GD-Link Utility的版本更新会同步增加新型号的Device ID支持,老版本经常出现“无法识别新一代GD32芯片”的情况。如果你买的开发板芯片型号比较新,连不上时第一件事就是看看工具是不是太老。
这篇文章到这里已经把你从“连不上芯片”拉到了“能烧也能救”的程度。烧录这个环节看着基础,但它卡住的时候,确实会让一个下午都毫无产出。希望这篇经验能让你少走点弯路,把时间花在真正有趣的业务逻辑上。如果后续你在实际项目中遇到其他特殊的烧录解锁案例,也欢迎一起交流探讨。