
焊好一块GD32F103的最小系统板插上J-Link打开Keil点下载弹出SWD/JTAG Communication Failure。这个报错几乎每个折腾过GD32F103程序烧录的人都见过而且十有八九不是芯片坏了。GD32F103这颗基于Cortex-M3内核的国产32位MCU引脚和STM32F103基本兼容价格却低一截这几年在很多项目里成了替换首选。程序烧录这件事主要就是SWD和串口两条路SWD依赖调试器适合开发和调试串口ISP依赖芯片内置Bootloader适合生产和现场升级。但恰恰是这两条路坑多得超出预期——接线、驱动、BOOT引脚、Flash算法、读保护任何一环出问题都能让你在烧录这一关卡半天。这篇内容就把我从SWD到串口的完整实操经验捋一遍包括踩过的坑和排查思路适合刚接触GD32F103的开发者也适合想搞清楚烧录原理再做量产方案的朋友。1. 烧录GD32F103之前先搞清楚这三件事1.1 GD32不是单纯的STM32兼容芯片很多人在GD32F103上第一次烧录都是在STM32的工程上直接换个芯片型号、直接下载。运气好能跑起来运气不好就是烧录失败或者程序运行异常。问题出在哪GD32F103虽然和STM32F103的引脚定义、寄存器布局大部分兼容但Flash控制器、IDCODE、内置Bootloader协议都有差异。烧录软件必须识别出这是一颗GD32的芯片调用对应的Flash算法才能正确擦除和写入。我用一个生活类比来解释STM32和GD32就像两种同品牌的打印机USB接口长得一样、驱动结构也类似但墨盒型号不完全相同。你强行用STM32的驱动去给GD32装固件轻则装不进去重则把墨盒状态搞乱。所以在Keil、J-Flash这些工具里第一步永远是选对器件型号不能偷懒直接拿STM32的工程硬烧。第二个容易忽略的点是Flash容量。GD32F103有多个子型号Flash从16KB到1MB都有烧录时选的容量或算法不匹配会导致擦除扇区数量不对、下载到一半报错、校验失败。选算法时看清楚自己的芯片是哪个型号是128KB、256KB还是更大再对应选烧录算法。第三个差异是IDCODE。通过SWD接口连接时调试器会读回芯片的IDCODEGD32返回的和ST不一样。有些只针对STM32优化的工具会因为这个ID不同就拒绝连接报出类似Unknown Device的错误。这不是芯片坏了而是工具不认识GD32的ID需要换用支持GD32的工具或更新版本。1.2 一次烧录到底发生了什么聊完差异再看烧录的本质。搞懂这个过程后面排查问题会轻松很多。烧录一个程序本质上就三步擦除把Flash里旧的程序和数据清掉。注意Flash擦除是按扇区或整片进行的不能只擦一个字节。如果擦除过程被打断比如中途断电Flash里可能出现残留数据。写入通过调试接口或Bootloader把解析后的机器码按地址写入Flash。校验写入完成后把Flash内容读回来和原始固件比对确认数据一致。SWD和串口ISP都会做这三步只是接口和触发方式不同。SWD是外部调试器直接通过调试端口访问Flash控制器而串口ISP是芯片里固化的Bootloader代为执行擦写操作。两者最终操作的都是同一片Flash但访问路径完全不同所以一个连不上时换另一个往往能救回来。1.3 SWD与串口ISP的本质区别这两条路经常被放在一起说但各自适合的场景差很多。我画过一张对比表基本可以一目了然维度SWD烧录串口ISP烧录硬件依赖需要仿真器J-Link/DAP-Link等只需USB转串口模块速度快128KB固件几秒完成慢取决于波特率128KB可能几十秒调试能力支持断点、单步、查看寄存器不支持调试触发方式调试器直接连接需要BOOT引脚进入Bootloader适用场景开发调试、固件迭代生产烧录、现场升级出问题时的可排查性报错信息多较容易定位常见问题无非接线和BOOT设置这张表可以当个索引遇到问题先想清楚自己走的是哪条路再去排查对应环节。下面两章我就分别把SWD和串口ISP的实操细节拆开讲。2. SWD烧录实操接线、工具选型与Keil配置2.1 SWD为什么只接四根线也能跑SWDSerial Wire Debug是ARM定义的调试接口理论上只需要两根线SWDIO数据线和SWCLK时钟线再加上供电和地一共四根。相比JTAG动辄十几根线SWD节约引脚也更适合PCB走线。GD32F103的SWD引脚复用情况要记一下SWDIO在PA13SWCLK在PA14。这两个引脚上电默认是调试功能用户程序里可以把它们配置成普通GPIO但如果这么干了下次就没办法通过SWD连接了后面我会专门讲这个坑。接线时有几个细节特别容易被新手忽略调试器必须和目标板共地否则通信电平根本没有参考点。如果目标板独立供电调试器的VCC可以不接但接了VCC能让调试器检测目标板电压减少VTarget0这类误报。SWDIO和SWCLK线尽量短我一般控制在15厘米以内再长就得降低SWD时钟频率。复位线NRST建议一起接上虽然SWD不强制要求复位线但后面讲到的Connect under Reset模式需要用到它。很多开发板把SWD接口做成了4Pin或5Pin的排针标注VCC、GND、SWDIO、SWCLK。实际接线时养成先接GND再接信号线的习惯可以避免插拔瞬间的电位差损坏芯片。2.2 烧录器选型J-Link、DAP-Link还是ST-LinkSWD调试器市面上常见的几类我都用过说下实际体验。J-Link是兼容性最好的选择。SEGGER官方软件J-Flash里直接提供了GD32F103的器件支持连接稳定速度可调报错信息也相对友好。缺点是正版价格高市面上大量盗版J-Link在连接GD32时偶尔会出现固件版本过旧导致识别不了的情况。如果你手里的J-Link连不上GD32优先去SEGGER官网升级一下J-Link软件版本很多连不上其实是软件版本太老器件数据库里没有GD32。DAP-LinkCMSIS-DAP是我现在日常开发的主力。它本质上就是一个开源调试器Keil里直接选CMSIS-DAP即可连接GD32F103。价格便宜几块钱到几十块钱的都有速度日常调试完全够用还不存在盗版固件那个坑。唯一要注意的是部分便宜的DAP-Link线材质量差SWD接线一长就容易报错。ST-Link是个有点尴尬的存在。ST-Link硬件上走SWD协议理论上能连GD32但ST的官方工具链对非ST芯片有ID校验在Keil里有时能用在ST官方下载工具里基本别想。所以我给的建议是手头只有ST-Link时可以应急用如果是正经项目别把它作为唯一方案。量产脱机烧录器就是另一回事了。像GD-Link脱机版或第三方脱机烧录器可以把固件存进烧录器不接电脑直接对芯片烧录适合生产线上批量使用后面第六章再细说。从成本、稳定性和上手难度综合看我的推荐顺序是J-Link正版或高仿兼容好的 DAP-Link ST-Link。2.3 Keil与J-Flash的配置细节Keil MDK下给GD32F103烧录流程比STM32要多个安装器件包的步骤。GD32F103的Device不存在于Keil默认数据库里需要先安装兆易官方提供的GD32F10x AddOn。安装完成后在Device选择界面才能看到GigaDevice的GD32F103系列型号。选好器件后在Options for Target的Debug选项卡里配置调试器选择调试器类型J-LINK或CMSIS-DAP。点Settings进入连接参数Max Clock先设小一点比如1MHz以内确认能连上后再调高。SWD线长或电路板布局不佳时高速连接最容易出问题。Connect模式如果正常连接失败切换成Connect under Reset模式再试试。切到Flash Download选项卡勾选Reset and Run下载完成后自动复位运行。然后把左边的烧录算法清掉重新添加GD32F103对应容量的Flash算法。这里选错会出现下载到一半报Erase Failed或Programming Failed。J-Flash这边逻辑类似但更偏批量生产。新建工程时在Device框里输入GD32F103选择正确的容量型号接口选SWD速度先用400kHz能连上再逐步提高到4MHz。J-Flash有个方便的功能是Target - Read Back可以读回整个Flash内容我排查芯片里到底烧了什么时经常用。J-Flash下载固件的步骤也很固定File - Open Data File打开hex文件然后Target - Connect成功后再Target - Program。不要连上之后直接点Program按钮我见过不少新手卡在这一步。3. 报错SWD/JTAG Communication Failure我的排查链路3.1 这个报错到底在说什么SWD/JTAG Communication Failure是一句很笼统的提示翻译成人话就是调试器发出了一串SWD请求但目标芯片没有按照预期的协议返回有效应答。我习惯把SWD通信类比成打电话。调试器一句喂你在吗芯片应该回一声在。如果线路不通、对方没电、对方在不断线重新占线甚至对方根本不在服务区调试器就只能告诉你说通话失败。所以这个报错的根源可能有好几层不能只盯着软件配置看。3.2 我的排查顺序先硬件再配置最后怀疑芯片遇到Communication Failure我从不随机乱试而是按固定顺序排查多数情况能在五分钟内定位。**第一量供电。**用万用表测目标板VCC对GND电压确认3.3V正常。J-Link的J-Flash界面里有一项VTarget电压显示如果显示0V或者明显偏低可以先排除目标板供电。很多便携设备用电池供电或Type-C供电不稳调试器一接上电压就被拉垮这种情况我遇到不下五次。**第二查接线。**SWDIO接PA13、SWCLK接PA14、GND共地这是我最先核对的。杜邦线氧化、接触不良、接错排针位置都是常见问题。我有一个技巧用J-Link Commander工具执行connect命令如果看到VTarget 3.3V但No target found多半是SWDIO/SWCLK两根线的问题如果VTarget都读不到大概率是地线或供电问题。**第三看复位电路。**NRST引脚上外接了一个较大电容比如100nF以上复位信号的上升沿会变缓可能导致调试器在连接初期无法稳定把芯片拉入调试状态。试着手动按一下复位键在复位释放的瞬间点下载有时能连上。要是这样能连上就说明复位电路对连接过程有影响在Keil里改用Connect under Reset模式。**第四检查读保护状态。**如果芯片之前被设置过读保护RDP Level 1调试器只能做整片擦除不能读取Flash和调试。J-Link会报类似Could not connect to target或Target is protected的提示。解决方式是在工具里选择全片擦除Erase Full Chip或切换到更高权限模式。这一点在二手芯片或退回维修的主板上特别常见。**第五怀疑SWD引脚被复用成GPIO。**如果目标板之前跑过一个把PA13、PA14配成普通GPIO的程序并且没有使能SWD引脚的重映射调试器肯定连不上。启动过程中的复位窗口期是唯一的连接时机。使用Connect under Reset让调试器在芯片复位后、用户程序运行前的那一瞬间建立连接。我在低功耗项目上就遇到过程序一进Sleep模式调试器立刻失联就是靠这个方法拉回来的。**第六降低SWD速度。**如果前面都没问题把SWD Clock从4MHz逐步降到1MHz、400kHz甚至100kHz。PCB走线较长、信号质量差、使用了高品质但不适合高速的杜邦线时降速往往立竿见影。3.3 一个典型排查案例我之前帮朋友修过一块GD32F103的板子现象是第一次能烧录第二次就Communication Failure。拿到板子先量供电正常3.3V看接线SWDIO/SWCLK、GND没错。J-Link Commander读VTarget也是3.3V就是找不到target。仔细看才发现这块板子把SWDIO和SWCLK旁边放了一个小电容到地用于ESD保护。电容容值偏大导致信号沿变缓高速SWD通信直接失败。把速度降到100kHz后连接成功。更换了小容值电容后4MHz也稳定连接了。这就是为什么我一直强调SWD速度要由高到底试很多信号质量问题会随时间、温度、走线阻抗变化暴露出来。固定用一个速度并不能说明电路设计没问题。4. 串口ISP烧录BOOT引脚、CH340与工具选择4.1 串口烧录的原理内置Bootloader在做什么串口ISP烧录不依赖外部调试器芯片在出厂时系统存储器System Memory里已经固化了一段Bootloader程序。当芯片从系统存储器启动时CPU会运行这段Bootloader它初始化USART0也就是PA9TX、PA10RX这两个引脚等待上位机通过串口发来固件数据然后调用Flash编程接口把程序写入用户Flash区。整个过程就走普通串口协议所以只需要一个USB转TTL模块就能烧录。最常用的芯片是CH340便宜、稳定、驱动好找很多开发板自带的下载电路就是CH340。理解了Bootloader的工作流程就能明白为什么串口烧录要求BOOT引脚设置正确、复位时序正确。CPU执行的代码决定它是在跑用户程序还是Bootloader而BOOT引脚的配置决定CPU启动后跑哪段代码。4.2 BOOT引脚怎么设置GD32F103的启动方式由BOOT0和BOOT1两个引脚的电平决定BOOT0BOOT1启动位置0X用户Flash正常运行用户程序10系统存储器运行出厂Bootloader11SRAM调试用一般不常见串口烧录时需要把BOOT0拉高、BOOT1拉低然后复位芯片让CPU进入系统存储器执行Bootloader。烧录完成后把BOOT0拉回低电平再次复位芯片才会运行刚烧进去的用户程序。手动操作这个流程很简单板上BOOT0跳线跳到1BOOT1跳到0按复位然后在上位机工具里点下载。但生产现场让工人手动跳线不现实于是有了自动下载电路。4.3 一键下载电路的设计逻辑所谓一键下载电路本质就是让CH340的DTR和RTS这两个串口控制信号通过三极管或MOS管自动拨动BOOT0和NRST。原理不复杂上位机下载软件在开始传输前会先通过DTR、RTS的翻转时序把目标芯片复位一次让它在BOOT0为高的情况下进入Bootloader然后开始发送数据。下载结束后再把BOOT0拉低并复位让用户程序开始运行。实际电路里通常用两个NPN三极管把DTR接到控制BOOT0的三极管基极把RTS接到控制复位引脚的三极管基极。具体高低电平逻辑关系取决于三极管接法有的板子是DTR#接BOOT0控制、RTS#接复位控制。抄作业时直接参考CH340典型一键下载电路即可原理图在网上很多。这里有个重要提醒不是所有的串口下载工具都支持DTR/RTS自动控制如果用的软件没有这个功能即使硬件支持也不会自动烧录。常见下载软件里一般会有DTR/RTS的选项需要勾选。4.4 CH340驱动和串口调试助手串口ISP烧录前先确认电脑能识别到USB转串口模块。在设备管理器里展开端口COM和LPT能看到CH340对应的COM口。如果没出现或者显示黄色感叹号就去装CH340驱动。CH340驱动安装有几个常见坑Windows 10以上系统建议从厂商官网下载最新驱动部分老版本驱动在Win10上会提示数字签名问题。装了驱动还是COM口不出现换根USB线试试。市面上很多只能充电不能传输数据的劣质USB线最容易导致串口不识别。如果电脑插过多个不同品牌的USB转串口会出现COM口号漂移下载软件里选错COM口也是高频错误。串口调试验证我常开一个XCOM或SSCOM把USB转串口的TX和RX短接自发自收能收到自己发的内容就说明驱动和硬件工作正常。这一步能排除相当一部分串口烧写失败的问题。4.5 串口烧写失败的典型原因即使前面都正常串口烧录依然可能失败。我把这些年遇到的失败案例整理成了下面这张表现象根本原因处理方式一直显示连接超时BOOT0没有拉高芯片在跑用户程序检查BOOT0电平复位后再试下载工具提示芯片ID不一致工具选错芯片型号选择GD32F103对应型号不要用STM32数据发送后无响应TX/RX接反交叉对接MCU的TX接USB转串口的RX烧录到一半卡住波特率太高或线路干扰波特率降到9600或115200下载成功但程序不运行BOOT0没跳回低电平将BOOT0置低重新复位打开串口时报错串口被其他软件占用关闭串口调试助手释放COM口串口烧录和SWD烧录还有一个不同点串口没有调试接口那么强的错误上报能力。SWD连不上时会有ACK、IDCODE等信息辅助定位串口经常就是干巴巴的超时两个字。所以宁可多花两分钟检查BOOT引脚和接线也不要在那里反复点下载按钮。5. 按场景选烧录方式开发调试和生产下载的差异5.1 开发调试阶段SWD几乎无可替代我个人的习惯是只要电路板上预留了SWD接口开发阶段一律用SWD烧录。原因很简单SWD支持调试。你能在Keil里打断点、看变量、单步执行甚至在上电瞬间观察程序死在哪一行。串口ISP只是把固件塞进Flash烧完就什么都不管了程序起不起来、为什么卡住全都要靠串口打印或LED瞎猜。对于GD32F103这种Cortex-M3内核的芯片SWD还可以配合调试器的Trace功能用SWO引脚输出调试信息。虽然不常用但在定位时序敏感问题时比串口打印更可靠因为它不影响程序执行时序。SWD开发阶段的另一个好处是烧录速度快。128KB的固件SWD只需要几秒串口ISP即使在115200波特率下也要半分钟以上。一天烧几十次程序SWD省下的时间非常可观。5.2 生产与现场升级串口ISP的优势场景串口ISP在生产场景的地位非常牢固原因也很现实成本低、操作门槛低。成本方面USB转串口模块几块钱一个PC端无需购买昂贵的调试器一个生产工人拿一台电脑就能批量烧录。操作门槛方面搭配一键下载电路工人只需要把板子插到串口线上在软件里点一下烧录按钮不需要理解BOOT引脚和复位时序。现场升级则是另一个典型场景。很多工控设备已经密封在机箱里只有维护串口引到外面。通过串口ISP升级固件不需要拆机箱不需要接调试器只需要一个串口线就能完成。这种场景下SWD的调试优势完全用不上串口的便捷性反而是核心需求。另外有些产品设计时没预留SWD测试点PCB上只有串口接口那么串口ISP是唯一选择。所以我的原则是电路板设计阶段一定要预留SWD测试点哪怕不用也要留几个过孔或焊盘。这个习惯救过我太多次了。5.3 从SWD切换到串口的工程配置与注意事项如果你的项目需要从SWD烧录模式切换到串口ISP烧录有几点配置需要注意。首先确认Keil工程已经勾选了Output标签页里的Create HEX File。SWD烧录时可以直接烧录AXF或HEX文件但串口ISP工具一般只认HEX或BIN。不勾选这个选项编译后根本不会生成HEX文件串口工具也无从下手。其次确认编译器生成的代码起始地址是0x08000000这是GD32F103用户Flash的起始地址。如果项目中启用了Bootloader应用代码的起始地址可能需要偏移串口ISP工具会把HEX文件烧到文件里标明的地址所以地址不对会导致程序完全跑不起来。第三如果产品既要用SWD调试又要支持串口ISP升级注意BOOT0引脚不能被应用程序占用。BOOT0在芯片复位瞬间决定启动位置它是专用的启动引脚程序运行后可以当普通GPIO用但设计电路时要保证能通过跳线或电路控制它的电平。第四串口ISP升级的通信协议要加校验。互联网上很多现场固件升级失败都是因为串口线受到干扰数据传错了Bootloader写入后校验不通过但此时Flash可能已经被写坏一半。可靠的做法是升级前先校验固件CRC升级完成后再读回校验双保险。6. 烧录之外容易被忽略的事读保护、选项字节和量产6.1 读保护防止固件被读出的关键一步很多工程师烧录完成后就把这事忘了但产品一旦要量产读保护是个必须考虑的问题。GD32F103和大多数Cortex-M芯片一样支持读保护功能。开启读保护后通过SWD或JTAG接口将无法直接读取Flash内容一定程度上防止竞争对手把固件逆向出来。这里有个绕不开的矛盾读保护开启后调试器连接会出现异常很多人误以为芯片坏了。我接手过不少SWD连不上的板子一查就是读保护开着。如果确认芯片是自家产品且固件已经失控可以通过全片擦除解除读保护代价是Flash内容完全清空程序也没了。读保护等级需要仔细看GD32的数据手册。不同等级的保护策略不同有的等级可以永久锁定芯片解除后无法恢复。量产时应根据产品安全需求选择合适的保护等级。我见过一些工程师为了省事对所有产品一律开最高等级保护结果遇到需要返厂升级的板子连Bootloader方案都做不了非常被动。6.2 选项字节烧录时最容易忽略的配置选项字节Option Bytes是单片机Flash里一块独立的存储区域存储着硬件看门狗配置、BOOT0引脚锁定、读保护等级、Flash写保护等信息。它不参与用户程序存储但直接决定芯片的运行行为。J-Flash和Keil里都能查看和修改选项字节。比如如果产品需要独立看门狗且不允许用户程序关闭可以在选项字节里配置硬件看门狗程序里即使软件关闭也没用。再比如Flash写保护可以防止程序意外擦除自身对OTA升级需求的产品尤其重要。我强调一下烧录时不要只关注程序文件本身选项字节的设置一定要和周遭设计匹配。比如有一个项目程序里用了外部看门狗但选项字节配置成了内部硬件看门狗导致设备不定期复位排查了整整一天才发现是选项字节的问题。所以烧录前的配置检查应该和烧录本身一样重要。6.3 量产烧录的几个实用建议量产阶段烧录效率和一致性远比能不能烧进去重要。我总结了几条经验**优先使用脱机烧录器。**脱机烧录器不需要连接电脑固件烧进烧录器后工人只需放上芯片按一下按钮就能完成烧录。不仅速度快还能避免电脑串口被占用、驱动损坏等生产中断问题。**每片都做读回校验。**不要相信烧录成功提示就等于数据完全正确。脱机烧录器一般支持烧录后自动校验这个功能一定要开启。如果校验失败设备会报警提示。**烧录后再贴片还是贴片后再烧录要提前定。**有些芯片适合先烧录再贴片因为程序里可能要保存校准数据有些产品需要贴片后烧录因为烧录时要连接板上的测试点。两种方式的良率和成本差异很大要在PCB设计阶段就规划好SWD测试点的位置。**把烧录工序和测试工序打通。**比如烧录完自动跑一个自检程序通过串口输出特定应答码测试工装根据应答码判断是否合格。这样能把烧录从孤立动作变成产线质检的一环。**保留现场升级通道。**不管量产时用SWD还是脱机烧录器产品都最好预留串口ISP升级接口。固件出问题后不用拆机就能远程或本地升级能省下海量售后成本。最后说几点实际体会烧录问题折磨人但绝大多数都不是芯片本身的问题。我排查过几十块连不上的板子真正芯片损坏的不到两成剩下的要么是供电不对、要么是接线错误、要么是工具配置没到位、要么是读保护没注意到。所以遇到烧录失败先稳住心态按供电、接线、速度、复位、读保护这个顺序排查比网上乱找答案高效得多。最后分享一个小技巧如果你手上没有调试器但有一根USB转串口线串口ISP完全可以完成日常固件烧录。把BOOT0跳线拉高复位后用串口工具发送HEX文件一样能把程序烧进去。虽然不能调试但很多板卡支持远程串口升级这个方案在现场救援时真的能救命。我在实际项目里已经养成了一个习惯每一块GD32F103的板子无论大小都会预留SWD测试点和BOOT0跳线位置。开发阶段用SWD生产阶段用串口ISP或脱机烧录器两手准备才不会被单一烧录方式的故障卡住进度。