☰
CH32V103烧写实战:串口ISP与WCH-Link从入门到排障
2026/10/3 1:26:01 网站建设 项目流程

我一直觉得CH32V103是一颗被低估的芯片,但它的烧写流程,尤其是第一次上手的时候,确实能把人折腾得够呛。这标题里“ch32v103xx 烧写”看着简单,实际操作起来——串口烧写失败、驱动识别不了、WCH-Link固件版本不对——每个坑我都踩过不止一遍。这篇文章就把我最近一次完整烧写CH32V103的实操过程、工具选型思路和问题排查记录整理出来,给正在跟这颗芯片较劲的朋友一个直接能抄的作业。

CH32V103是沁恒基于自研RISC-V内核的32位通用MCU,主频最高144MHz,片上集成Flash从16KB到64KB不等,RAM从6KB到20KB。它最让人又爱又恨的地方就是:虽然是RISC-V架构,但引脚和大部分外设都兼容STM32F103。好处是原理图基本能直接复用,坏处是很多人想当然用STM32的烧写思路去搞它,结果大概率翻车。这篇文章适合刚接触CH32V103的嵌入式开发者,也适合已经在用但烧写总出问题的老哥,内容覆盖烧写方式选型、环境搭建到问题排查的完整闭环。

1. 烧写体系和方案选型

1.1 CH32V103支持哪几种烧写方式

CH32V103官方支持三种程序下载方式,这三种方式在实际项目中各有侧重。

第一种是WCH-Link调试下载,这是沁恒官方推出的调试器,走的是自家的两线调试接口,功能和ARM体系里的SWD类似。WCH-Link支持烧写和在线调试,还能配合MounRiver Studio做断点、单步、变量监视,开发阶段最好用。新版WCH-Link固件还支持RISC-V和ARM双架构,也就是说它同时能调试CH32系列和STM32系列。

第二种是串口ISP烧写,芯片出厂时Bootloader默认开启,只要把BOOT0拉高、BOOT1拉低,复位后芯片就进入ISP模式,通过UART1接收上位机下发的程序数据。这种方式不需要调试器,一根USB转串口线就能搞定,适合量产烧录和现场升级,也是这篇博文重点展开的方式。

第三种是JTAG/SWD烧写,CH32V103虽然兼容STM32F103的引脚,但JTAG接口实际上是通过复用引脚实现的,不是完整意义上的JTAG。用标准ARM JTAG调试器去连会识别不了,因为它是RISC-V核,调试协议栈根本不一样。这一点特别多人踩坑,网上很多“STM32的JTAG能直接烧CH32”的说法,我实测下来纯属误导。

三种方式的对比可以看下面这张表。

烧写方式所需硬件速度适用场景能否调试
WCH-LinkWCH-Link调试器快开发调试、固件升级支持(单步、断点)
串口ISPUSB转串口模块中等量产烧录、现场升级不支持
JTAG/SWD不推荐不适用不适用不适用

1.2 为什么很多人一上来就串口烧写失败

先说结论:串口ISP烧写失败,90%以上不是芯片坏了,而是BOOT引脚状态不对、串口选错或者供电不稳定。

CH32V103的ISP逻辑很简单:上电/复位瞬间,芯片会检查BOOT0和BOOT1的引脚电平,只有BOOT0=1、BOOT1=0时才会进入系统存储区运行Bootloader,也就是进入ISP模式。很多人用STM32的习惯,BOOT0接个电阻到地就完事了,等到要烧写的时候直接把BOOT0拉高,但BOOT1忘了拉低,或者两个脚悬空——悬空电平是未定义的,能不能进ISP全看运气。

另外,CH32V103的ISP串口固定是UART1(PA9/PA10),不是任意串口都能用。有些开发板把CH340接到了别的串口上,你从设备管理器里看到串口已经枚举出来了,但数据根本送不进Bootloader,表现就是上位机一直提示“连接失败”或者“同步超时”。

还有一个容易被忽略的点:进入ISP模式的方式。很多人按了复位键,但上位机软件是先检测波特率、发同步命令再等应答的,如果你在上位机点“连接”之前芯片已经从ISP模式跑走了,那必然失败。正确流程是:先选对串口和波特率,再按住复位,点连接,松开复位。这个时序问题我后面实操部分会详细说。

1.3 工具选型的最终结论

我个人的建议是:开发阶段用WCH-Link,量产阶段用串口ISP。

理由很简单。开发阶段要频繁改代码、下载、调试,WCH-Link速度快、稳定,还能看变量和断点,效率比串口高出一大截。到了量产阶段,一台电脑串接一个USB转串口模块,配合PC端的烧写工具批量刷,成本低,速度也能接受。

如果你手头暂时没有WCH-Link,只想快速验证代码,那串口ISP完全够用。但要注意:串口ISP只能烧写Flash,不能读Flash内容,也不能调试。想读回固件做备份或者反汇编分析,还是得有WCH-Link。至于网上说的“用ST-Link把固件烧进去”,实测行不通,调试协议不同,别浪费时间。

2. 环境搭建和工具链准备

2.1 硬件准备清单

按我这次实操用的配置,硬件清单如下。

  • CH32V103C8T6核心板一块,最小系统板就行,注意看BOOT0/BOOT1是否引出排针
  • WCH-Link调试器一个(用于WCH-Link烧写方式)
  • USB转TTL串口模块一个,推荐CH340或CP2102芯片的,稳
  • 杜邦线若干,最好是公对公和公对母各备一些
  • 5V/3.3V供电的USB线,核心板如果需要外部供电要提前准备好

如果你用的是自己画的板子,重点检查三处:BOOT0和BOOT1有没有通过电阻拉到确定电平、UART1的TX/RX有没有接反、芯片VDD引脚上的去耦电容是否齐全。我见过一块自己焊的板子,就是因为VDD引脚没有加0.1uF电容,导致烧写时芯片反复复位,现象就是串口能识别、连接超时。

2.2 软件工具链安装的三个环节

软件方面需要装三样:串口驱动、烧写上位机、开发IDE。

串口驱动:如果你用CH340,需要装CH340驱动;用CP2102,装CP210x驱动。Windows 10以上系统一般能自动识别,但老版本系统可能要手动安装。装完驱动后插上串口模块,打开设备管理器,在“端口(COM和LPT)”下能看到新增的COM口,记下端口号。如果设备管理器里显示的是黄色感叹号,右键更新驱动程序,手动指定驱动路径。

烧写上位机:官方主推WCHISPTool,这是沁恒官方的ISP烧写工具,支持全系列CH32和CH57x等芯片。下载地址在沁恒官网的“工具与软件”页面。安装包解压后直接运行,不需要安装,绿色版。如果你用MounRiver Studio开发,它内部也集成了烧写功能,但串口ISP烧写还是建议用独立的WCHISPTool,功能更专注,报错信息也更清晰。

开发IDE:MounRiver Studio是沁恒基于Eclipse二次开发的IDE,免费,内置了CH32V103的编译工具链和调试插件。装它主要是为了编译出hex文件给烧写工具用,也可以用命令行方式自己搭RISC-V工具链,但没必要为难自己,我直接用MRS。

2.3 驱动和工具版本的坑

这个坑我踩得比较深,值得单独拿出来说。

WCHISPTool有好几个版本,老版本只支持CH32F103,如果芯片型号选不到CH32V103,说明工具版本太老。我第一次用的时候下载了个旧版,芯片列表里根本没有CH32V103,一度以为是芯片有问题。后来换到最新版WCHISPTool(V2.0以上),芯片列表就正常了。

WCH-Link也有固件版本的概念。老版本的WCH-Link固件只支持ARM芯片的调试,后来才加入RISC-V支持。如果你手里的WCH-Link插上电脑后,MounRiver Studio提示“固件版本过低”或者老是识别不到目标芯片,多半需要升级固件。升级方法是在WCHISPTool里选择“WCH-Link升级”功能,按提示操作。新买的WCH-Link一般出厂就是最新固件,但二手市场淘来的就不好说了。

还有一点:WCHISPTool和MounRiver Studio不要同时占用同一个串口。串口是独占的,一个程序打开后另一个程序就打不开了,表现就是工具一直卡在“打开串口失败”或“设备忙”。如果你遇到这种情况,先把占用串口的其他软件关掉,再用任务管理器确认没有后台残留进程。

3. 串口ISP烧写全流程实战

3.1 引脚接线和BOOT模式设置

串口ISP烧写时,芯片必须要跑在系统存储区里的Bootloader上,所以引脚设置很关键。

以CH32V103C8T6为例,接线如下:

  • 核心板的UART1_TX(PA9)接USB转TTL模块的RX
  • 核心板的UART1_RX(PA10)接USB转TTL模块的TX
  • GND接GND
  • 核心板的BOOT0接3.3V,BOOT1接GND
  • 3.3V供电由USB转TTL模块的VCC提供,前提是模块支持输出3.3V而不是5V

注意几个细节。

第一,UART1的TX/RX和USB转TTL模块的RX/TX是交叉接的,如果两头都接成TX对TX,数据根本传不过去。我习惯先固定一个规则:发送端对接收端。核心板PA9(TX)发给模块的RX,模块的TX发给核心板PA10(RX)。

第二,BOOT0接3.3V而不是5V,即使你的系统供电是5V,BOOT0也不能接5V,引脚不是5V容忍的,会损伤芯片。

第三,接线完成后不要急着上电,先用万用表量一下供电脚和GND之间有没有短路。我见过好多新手把TX和RX接反了,通电后没烧坏芯片,因为串口引脚不是直连供电轨的,但接错线导致模块发热的情况确实发生过。

接线完成后,给USB转TTL模块上电,此时核心板也会随之供电。如果芯片已经进入ISP模式,核心板上的电源指示灯应该是亮的,但程序指示灯不会跑,因为Bootloader在系统存储区,用户的代码还没执行。

3.2 用WCHISPTool完成烧写的标准步骤

打开WCHISPTool,界面很简洁,主要就是几个区域:芯片型号选择、串口配置、操作选项、烧写进度日志。

第一步,选择芯片型号。在“芯片型号”下拉框里选CH32V103系列,具体型号按你的芯片来,C8T6就选CH32V103C8T6。选错型号的话,烧写工具会在擦除或编程阶段报错误,因为芯片ID不匹配。

第二步,配置串口参数。串口号选择设备管理器里看到的那个COM口,波特率一般115200或57600,这个不影响烧写速度的上限,反而跟Bootloader的稳定性相关。实测下来,115200最稳,如果连接不稳定再降到57600或38400。数据位8、停止位1、无校验是默认值,不需要改。

第三步,选择要烧写的文件。点“选择文件”按钮,选中编译生成的hex文件。注意:WCHISPTool支持hex、bin和axf格式,但推荐用hex,因为它自带地址信息,烧写时不需要手动指定起始地址。如果用bin文件,需要手动填起始地址,填错的话程序跑飞。

第四步,也是最多人栽跟头的地方——设置芯片的烧写选项。常规来说,勾选“擦除Flash”、“写Flash”和“校验Flash”三个选项就够。如果不想动配置信息字,不要动“写选项字节”和“配置信息字”这两个选项,一旦配置错了,芯片可能会锁死,需要用WCH-Link才能解锁。

第五步,点击“连接”按钮。这一步要求芯片处于ISP模式,也就是BOOT0=1、BOOT1=0且刚复位过。上位机会先发送连接命令,如果芯片正常应答,日志区会显示“连接成功”之类的话。

第六步,连接成功后,点击“下载”按钮,工具会先擦除Flash,然后写入数据,最后校验。烧写完成后,日志区提示“操作成功”。这时候把BOOT0跳线恢复成GND,按一下复位键,程序就从用户Flash启动运行了。

3.3 串口烧写失败的排查思路

串口ISP烧写失败是最常见的问题,我把实际遇到的几类情况列出来,方便你对照排查。

现象一:点击连接后提示“同步失败”或“连接超时”。

这是最典型的失败。排查顺序如下。先检查BOOT0和BOOT1的电平,BOOT0必须为高,BOOT1必须为低。然后确认串口号是否认对了,可以拔插USB转TTL模块,看设备管理器里哪个COM口消失又出现,那个就是真实的串口。接着检查TX/RX是否接反,把模块上的TX和RX对调一下再试。最后确认是否用了正确的复位时序:按住核心板的复位键,点击上位机的“连接”,松开复位键。

现象二:连接成功,但烧写到一半停在某个百分比不动,最后报“校验错误”。

这种情况多半是供电不稳或者波特率选得太高。CH32V103在工作时需要稳定的3.3V电源,如果USB转TTL模块的LDO压降比较大,板子负载一高电压就掉下来,烧写就会出现随机错误。解决办法是换成质量更好的串口模块,或者给核心板单独用稳压电源供电,GND仍然与模块共地。另外把波特率降到57600或者38400,其实比换模块还快。

现象三:连接成功且烧写过程没有报错,但程序就是不运行。

先检查BOOT0有没有恢复到低电平,再按复位键。然后检查代码里系统时钟配置是否正确,CH32V103默认用的是内部8MHz高速RC振荡器,代码里如果没有切换到外部晶振,且你焊了外部晶振但没有正确配置时钟源,芯片也可能跑不起来。最后用万用表量一下VDD引脚对地电压,确保在3.0V到3.6V之间。

4. WCH-Link烧写和调试实操

4.1 WCH-Link的接线方式和固件确认

WCH-Link这个调试器,正常情况是专门给RISC-V的CH32系列用的,但新固件也能调试ARM芯片。它对外引出四根线:SWDIO、SWCLK、3V3、GND。第一次用的时候,先别急着接芯片,把WCH-Link插到电脑上,这时候它的指示灯会亮。打开WCHISPTool,切到“WCH-Link”选项卡,如果能识别到,说明固件能正常通信。如果没有识别到,多半是驱动问题,去设备管理器看有没有带感叹号的设备。

WCH-Link和CH32V103的接线非常简单:SWDIO接芯片的SWDIO(PA13)、SWCLK接芯片的SWCLK(PA14)、3V3接VDD、GND接GND。不需要接复位线,WCH-Link会通过调试接口控制芯片复位。

这里要特别提醒一句:SWDIO和SWCLK对应的PA13和PA14,默认功能是调试口,但如果你在代码里把它们配置成普通GPIO,会直接把调试口禁用掉,之后WCH-Link就连接不上芯片了,必须用串口ISP擦除整个Flash才能恢复。我至少因为这个问题浪费过半天时间,教训是:除非你对引脚复用非常清楚,否则别轻易把PA13/PA14当GPIO用。

4.2 在MounRiver Studio里一键下载和调试

用MounRiver Studio(MRS)开发CH32V103,烧写其实分两条路:编译后点击“锤子”图标只编译不下载,再点旁边的“虫子”图标才会编译并启动调试会话,会自动把固件下载到芯片里。

打开MRS后,先新建工程,选择芯片型号CH32V103C8,工程模板会带一个默认的启动文件和链接脚本,不用自己写。写完代码后,点“调试”按钮,MRS会弹出一个调试配置界面。在“调试器”选项卡里,选择WCH-Link,接口选SWD,目标电源可以选“由调试器提供”或“目标板自供电”。如果核心板已经用USB供电了,就选目标板自供电,避免电压冲突。

点“应用”再点“调试”,MRS会先编译,然后通过WCH-Link连接芯片,烧录固件,跑到main函数的第一行并停在断点处。这时候你可以按F5单步、F6步入,看寄存器窗口和变量窗口。

我实测下来,WCH-Link的烧写速度比串口ISP快很多,十几KB的固件几秒钟就烧写完成,串口ISP要十几秒甚至半分钟。开发阶段多用WCH-Link,脑子里那根“等烧写”的弦就不会绷那么紧,心情也会好很多。

4.3 用WCH-Link做Flash读取和固件备份

WCH-Link除了烧写,还能读取芯片的Flash内容。这个功能在调试老代码、确认别人有没有烧过程序、或者想备份固件时特别有用。

在WCHISPTool的“WCH-Link”选项卡里,选择“读取Flash”,工具会把整个用户Flash区域读出来并保存成bin文件。如果你想读出来的是hex格式,也可以选择hex保存。注意:读出来的数据包括代码区和只读数据区,不包含选项字节和系统存储区的内容。

读取Flash前,要把芯片从任何调试会话里断开。如果MRS还开着并且占用了WCH-Link,读操作会失败。另外读Flash之前最好用WCH-Link连接一次芯片,确认能正常通信,否则读到一个全0xFF的假数据,会让你怀疑固件还是怀疑芯片。

4.4 调试口被占用后的解锁流程

前面提到PA13/PA14被配置成普通GPIO后调试器无法连接,这个情况其实是有办法恢复的,不需要换芯片。办法就是用串口ISP先把Flash擦干净,再用WCH-Link重新连接。

具体流程是:BOOT0拉高、BOOT1拉低,上电进入ISP模式,用WCHISPTool连接,只勾选“擦除Flash”,不写任何新固件,然后点击“下载”。擦除完成后,把BOOT0复位为低,芯片里已经没有用户代码了,上电后不会执行任何会禁用调试口的配置,WCH-Link就能重新连上。

这个操作在量产的板上其实很常见——程序升级到一半断了电,再次升级时发现连不上调试器,其实就是同样的道理。所以培训现场我总跟人说:串口ISP不只是备用方案,它是保命方案。

5. 常见问题排查与经验速查

5.1 连接失败类问题

连接失败是整个烧写流程里最先遇到的问题,也是新手最容易放弃的地方。我复盘了一下,整理出以下排查清单。

症状排查项处理方式
串口枚举不出来驱动没装好安装对应USB桥接芯片驱动,或更换串口模块
上位机提示串口被占用其他软件占用了串口关闭MRS、串口助手等,任务管理器结束残留进程
同步/连接超时BOOT0/BOOT1电平不对量BOOT0是否为高,BOOT1是否为低
同步/连接超时TX/RX接反交换TX/RX后重试
同步/连接超时芯片不在ISP模式断电后重新上电,按顺序进入ISP
连接稳定但烧写失败波特率过高或供电不足降波特率到57600,更换供电方式
烧写成功但程序不跑BOOT0未拉低恢复BOOT0为低,复位重启
烧写成功但程序不跑代码时钟配置错误检查外部晶振配置,检查startup文件

5.2 烧写中途出错类问题

烧写过程跑到一半报“校验错误”或者进度条卡住不动,这类问题比连接失败稍微隐蔽一点。

我遇到过一个典型情况:烧写小固件没任何问题,但固件体积一增大就报校验错误。排查到最后发现是电源问题——USB转TTL模块的3.3V输出能力有限,芯片Flash写入时电流需求增大,电压被拉低,导致写入校验不稳定。换了一个能输出500mA的稳压模块后,问题彻底消失。

还有一次是WCHISPTool的进度条卡在“擦除”不动了,等了很久也没反应。最后发现是芯片进入了低功耗模式,因为代码里配置了睡眠指令,擦除时电流不够唤醒芯片。这时候只需要重新上电,在芯片醒来之前进ISP模式,擦除就正常了。

这类问题没有标准答案,但排查思路是固定的:先怀疑供电,再怀疑时序,最后怀疑工具版本和芯片本身。按这个顺序排查,能少走很多弯路。

5.3 与Zynq等其他平台烧写思路的对照

最近在搞Zynq平台的项目,发现很多人会把CH32V103的调试经验往Zynq上套,然后栽跟头。Zynq的烧写逻辑和CH32V103差别很大:Zynq内部是ARM硬核加FPGA,启动方式支持从QSPI Flash启动、SD卡启动、JTAG启动等,而且启动镜像需要经过Bootgen工具将FSBL、应用程序比特流等打包起来。CH32V103是单芯片MCU,所有代码都写在内部Flash里,烧写完直接上电运行,没有复杂的分区概念。

两者在调试器上的区别更直观。CH32V103用SWD两线口,Zynq用JTAG口,引脚定义完全不一样。我一开始用WCH-Link去连Zynq,当然连不上,后来换了Xilinx官方的Platform Cable USB或者第三方的JTAG调试器才正常。这套经历让我明白一件事:不同架构的芯片,烧写方法完全不同,但是“看数据手册、查Boot Mode、量引脚电平、比对工具日志”这套排查思路是通用的。

5.4 几条独家心得和避坑技巧

最后分享几个自己摸索出来的小技巧,常规文档里不太容易找到。

烧写前先检查芯片是否在ISP模式,不只是看BOOT引脚电平,最好用示波器或逻辑分析仪量UART1的TX,也就是PA9。芯片处在Bootloader里和跑用户程序时,TX引脚上的波形很不一样。Bootloader模式下,连接成功后TX会有规律的应答信号;用户程序如果没配置串口,TX往往是低电平或者浮空。这个“看波形确认模式”的办法在量产调试时特别有用。

烧写多块板子时,不要把所有板子的GND都串在一起共地。如果供电电源之间有压差,共地会产生环流,轻则烧写不稳定,重则损坏芯片或串口模块。每块板子都用独立的电源,串口模块也用独立供电,然后每个模块只和对应的板子共地,这样最安全。

另外,WCHISPTool烧写时如果提示“芯片ID读取错误”,多半是芯片型号选错了,或者芯片本身已经损坏。可以先选择“自动检测”功能,让工具识别芯片类型。如果自动检测也失败,基本可以确定芯片硬件出了问题。我遇到过一块高温焊接后损坏的芯片,就是这个表现。

6. 这次实操下来的一些体会

CH32V103的烧写流程本身并不复杂,真正折磨人的往往是小细节:BOOT0悬空了、USB转串口模块供电不够、工具版本太老导致选不到芯片型号、甚至TX和RX接反这种最基础的错误。我这几次实测下来,最大的感受是:不管用什么方式烧写,先把电源、地和串口逻辑理清楚,再动手接线,成功率高得多。

站在项目交付的角度,我的建议是:团队开发阶段尽量给每个人都配一块WCH-Link,烧写调试省下来的时间远超调试器的成本;到了量产环节再切换成串口ISP方案,配合定制的烧写夹具,用WCHISPTool的脚本功能甚至能做自动化烧录,效率和稳定性都有保障。如果你正在做产品化,不妨把这两种方案都提前验证一遍,别等到试产的时候才第一次用串口烧录。

如果你手头正好在折腾CH32V103,或者正准备拿它做产品,希望这篇文章能帮你少踩几个坑。烧写通了之后,这颗芯片的性能和生态还是相当能打的。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询