尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

CH32V103烧写实战:串口ISP与WCH-Link从入门到排障

CH32V103烧写实战:串口ISP与WCH-Link从入门到排障 我一直觉得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的引脚电平只有BOOT01、BOOT10时才会进入系统存储区运行Bootloader也就是进入ISP模式。很多人用STM32的习惯BOOT0接个电阻到地就完事了等到要烧写的时候直接把BOOT0拉高但BOOT1忘了拉低或者两个脚悬空——悬空电平是未定义的能不能进ISP全看运气。另外CH32V103的ISP串口固定是UART1PA9/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功能更专注报错信息也更清晰。开发IDEMounRiver Studio是沁恒基于Eclipse二次开发的IDE免费内置了CH32V103的编译工具链和调试插件。装它主要是为了编译出hex文件给烧写工具用也可以用命令行方式自己搭RISC-V工具链但没必要为难自己我直接用MRS。2.3 驱动和工具版本的坑这个坑我踩得比较深值得单独拿出来说。WCHISPTool有好几个版本老版本只支持CH32F103如果芯片型号选不到CH32V103说明工具版本太老。我第一次用的时候下载了个旧版芯片列表里根本没有CH32V103一度以为是芯片有问题。后来换到最新版WCHISPToolV2.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_TXPA9接USB转TTL模块的RX核心板的UART1_RXPA10接USB转TTL模块的TXGND接GND核心板的BOOT0接3.3VBOOT1接GND3.3V供电由USB转TTL模块的VCC提供前提是模块支持输出3.3V而不是5V注意几个细节。第一UART1的TX/RX和USB转TTL模块的RX/TX是交叉接的如果两头都接成TX对TX数据根本传不过去。我习惯先固定一个规则发送端对接收端。核心板PA9TX发给模块的RX模块的TX发给核心板PA10RX。第二BOOT0接3.3V而不是5V即使你的系统供电是5VBOOT0也不能接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模式也就是BOOT01、BOOT10且刚复位过。上位机会先发送连接命令如果芯片正常应答日志区会显示“连接成功”之类的话。第六步连接成功后点击“下载”按钮工具会先擦除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接芯片的SWDIOPA13、SWCLK接芯片的SWCLKPA14、3V3接VDD、GND接GND。不需要接复位线WCH-Link会通过调试接口控制芯片复位。这里要特别提醒一句SWDIO和SWCLK对应的PA13和PA14默认功能是调试口但如果你在代码里把它们配置成普通GPIO会直接把调试口禁用掉之后WCH-Link就连接不上芯片了必须用串口ISP擦除整个Flash才能恢复。我至少因为这个问题浪费过半天时间教训是除非你对引脚复用非常清楚否则别轻易把PA13/PA14当GPIO用。4.2 在MounRiver Studio里一键下载和调试用MounRiver StudioMRS开发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或者正准备拿它做产品希望这篇文章能帮你少踩几个坑。烧写通了之后这颗芯片的性能和生态还是相当能打的。
返回列表