ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

CH32V103烧写全攻略:串口ISP与WCH-Link调试避坑指南

CH32V103烧写全攻略:串口ISP与WCH-Link调试避坑指南 拿到CH32V103开发板的第一件事不是写代码而是先把程序烧进去。我见过不少人在ch32v103xx烧写这一步就卡住明明是照着STM32的流程操作结果ST-Link接上毫无反应串口助手一直提示等待上电最后怀疑芯片是坏的。实际上问题大多出在“把ARM单片机的习惯带到了RISC-V单片机上”。今天这篇就来专门聊CH32V103xx的烧写问题包括有哪些可行的烧写路径、串口ISP怎么操作、为什么经常失败、以及用WCH-Link调试时要注意哪些细节。无论你是刚接触RISC-V单片机的新手还是从STM32转过来的老工程师这篇文章都可以让你少折腾至少一个下午。1. 烧写CH32V103前必须弄懂的三件事1.1 它不是STM32但也不是完全陌生的芯片CH32V103是沁恒基于自研青稞V3A内核做的32位RISC-V通用MCU最高主频72MHzFLASH从64KB到128KB不等SRAM 20KB左右。它的引脚排布、外设寄存器、中断控制器这些设计大量参考了STM32F103所以从STM32转过来写代码并不难。但“引脚兼容”不等于“工具链兼容”。STM32F103用的是ARM Cortex-M3内核烧写通过ARM的CoreSight调试架构完成CH32V103是RISC-V内核调试接口协议完全是另一套。这意味着ST-Link、J-Link、老式CMSIS-DAP这些ARM调试器物理上可以插到SWD口上但协议不通烧写时大概率会提示“未找到目标设备”或者直接卡死。这是ch32v103xx烧写失败最容易被忽视的底层原因。1.2 芯片实际提供两条标准烧写通道CH32V103没有把烧写方式做得花哨实际开发中用到的就是两条路串口ISP和SWD调试接口。串口ISP是利用芯片ROM里的bootloader通过USART1接口把程序写进FLASH。它只需要一个USB转TTL模块不需要额外调试器成本最低。进入方式是把BOOT0引脚置高、BOOT1置低然后复位或重新上电。SWD接口是配合WCH-Link调试器使用的除了烧写还能在线调试、查看变量、断点单步。WCH-Link是沁恒官方调试器老款叫WCH-Link新款叫WCH-LinkE都能连CH32V103。走SWD通道时芯片不需要设置BOOT引脚直接通过PA13/PA14两线连接即可。1.3 为什么不能拿Keil直接开烧Keil MDK不支持RISC-V内核即使强行装了CH32V103的器件包编译器、链接器、调试器全部对不上。CH32V103官方配套的IDE是MounRiver Studio简称MRS它基于Eclipse内置了RISC-V GCC交叉编译链和OpenOCD调试插件。烧写CH32V103时要么用MRS要么用WCHISPTool配合串口ISP要么用WCH-LinkUtility配合WCH-Link调试器。我见过有人试图在Keil里选“CMSIS-DAP Debugger”去连CH32V103结果自然是失败。芯片本身没问题问题出在调试器协议和内核架构不匹配。烧写方案所需硬件能否在线调试适合场景串口ISPUSB转TTL模块否量产烧录、无调试器、救砖WCH-Link SWDWCH-Link/WCH-LinkE是日常开发、调试、仿真2. 成本最低的串口ISP烧写BOOT引脚与软件配置2.1 BOOT0/BOOT1引脚到底该怎么接串口ISP烧写时芯片的BOOT0要接3.3V高电平BOOT1要接GND低电平。上电或者按下复位之后芯片从System Memory里的bootloader启动等待上位机通过USART1发送固件数据。很多开发板默认把BOOT1用电阻下拉到GND所以你只需要操作BOOT0一个脚。但如果是自己画的板子或者手工焊接的转接板BOOT1悬空会带来不确定的启动状态最好明确接低。BOOT0在烧写过程中必须一直保持高电平。有人用跳线帽短接BOOT0到3.3V烧写过程中不小心触碰脱落芯片就会从FLASH启动bootloader握手直接失败。烧写完断电把BOOT0跳回GND再重新上电用户程序才会正常跑起来。用万用表测一下BOOT0对GND的电压这是一个非常值得养成的习惯。如果BOOT0引脚虚焊、跳线帽氧化或者电阻值不对都会导致电压不是理想的3.3V芯片就不会进入bootloader。2.2 软件端的关键配置项烧写工具首选WCHISPTool这是沁恒官方的串口ISP上位机软件。打开后关键配置有这几个芯片型号选择CH32V103xx注意不要选成CH32F103xx前者是RISC-V内核后者是ARM Cortex-M3内核bootloader协议不同。串口号选择USB转TTL模块对应的COM口选错会直接提示连接失败。接口选择USART1这是唯一被bootloader使用的串口。波特率默认115200即可失败时降到38400或9600再试。固件文件支持hex和bin两种格式。MRS编译生成的hex文件一般在工程的obj目录下。2.3 一次成功的串口ISP烧写标准操作顺序以CH32V103C8T6核心板为例完整操作流程是把BOOT0跳线帽接到3.3V一侧BOOT1保持在GND一侧。用USB转TTL模块连接PA9和PA10模块的RX接芯片的PA9TX模块的TX接芯片的PA10RXGND共地。打开WCHISPTool选择芯片型号、串口号和波特率。点击“下载”按钮选择编译好的固件。如果板子还没上电先点“下载”再给板子上电如果已经上电按下复位键再松开。等待进度条跑完烧写成功后断电把BOOT0跳回GND重新上电运行。这里有个提高成功率的手法先按住板子的复位键不放在软件里点击“下载”等软件提示连接到目标后再松开复位键。这样能确保bootloader是在上位机准备好的情况下才被激活握手成功率明显更高。2.4 开源替代工具wchisp不想装图形界面工具的话GitHub上有个开源命令行工具wchisp支持CH32V103系列。它通过串口与bootloader通信用法很简洁wchisp flash firmware.bin如果电脑上有多个串口需要指定端口wchisp -p /dev/ttyUSB0 flash firmware.bin这个工具的好处是轻量、跨平台适合集成到脚本里做批量烧写。具体参数以实际版本README为准不同版本对芯片型号的支持略有差异。3. 串口烧写失败的排查链路从现象到根因3.1 排查第一步确认芯片是否真的进了bootloader串口烧写失败最常见的一个现象是软件一直停在“等待上电”或者“连接中”的提示上。第一步不是怀疑芯片坏了而是确认芯片是否真的进入了bootloader。把BOOT0置高、按复位键之后芯片内部的bootloader会在USART1的TX引脚PA9上周期性地发送握手信号。用逻辑分析仪或者示波器测量PA9对GND的波形如果能看到规律的串口脉冲说明bootloader已经跑起来了如果PA9安静得像没通电一样说明芯片根本没进入System Memory启动模式。没有示波器的话可以用串口助手打开对应的COM口观察有没有数据返回。需要说明的是CH32V103的bootloader握手协议和STM32的串口ISP协议不是一回事你看到的可能不是一串可读的ASCII字符而是一堆十六进制数据但只要串口助手能收到数据就说明bootloader在正常等待通信。如果PA9上没有任何波形排查方向就锁定在BOOT0电平、复位动作和供电这三件事上。3.2 排查第二步驱动、接线、共地和供电一个都不能少USB转TTL模块的驱动没装好是串口烧写失败的隐形杀手。打开设备管理器确认COM口已经正常枚举。如果模块插上后出现在“其他设备”里带黄色感叹号先补驱动再继续别急着点“下载”。接线方面最容易犯的错误是TX/RX同名相连。芯片的PA9是发送脚必须接模块的RX芯片的PA10是接收脚必须接模块的TX。同名相接连的是“你自己和我说话我也和自己说话”数据根本传不出去。共地问题也常被忽视。USB转TTL模块和目标板必须共地否则电平参考点不一致串口信号会乱跳。用杜邦线把两边的GND连起来是最稳妥的做法。供电不要完全依赖USB转TTL模块的3.3V输出。一些模块的3.3V稳压器本身电流余量就小驱动CH32V103加上晶振、LED、外设之后电压会被拉低bootloader工作在不稳定的电压下自然容易握手失败。更可靠的做法是目标板独立供电USB转TTL模块只负责通信两边再共地。3.3 排查第三步软件配置和波特率调整WCHISPTool里的芯片型号选错会直接导致握手失败。CH32V103系列和CH32F103系列的bootloader协议不同选错型号后软件发出去的握手命令对不上芯片的预期芯片不会应答。Flash容量选错会导致下载校验失败。CH32V103C8T6是64KB FlashCH32V103R8T6也是64KB如果是128KB的型号则要选对应容量。选小了程序烧不进去选大了校验不过。波特率也是一个值得调整的参数。默认115200对绝大多数USB转TTL模块都没问题但有些兼容版CH340芯片在高波特率下时序不稳定或者USB延长线太长引入了干扰。遇到诡异的失败把波特率降到9600再试往往就好了。操作系统层面Windows的串口驱动对某些CH340兼容芯片占用CPU时间片会有抖动偶尔会导致握手超时。这时候关掉串口监视类软件、换一个USB口尤其不要插在USB Hub上、换一根短一点的USB线都是有效的办法。3.4 真实案例复盘BOOT0虚焊导致一直“等待上电”有一块手工焊接的CH32V103C8T6转接板接上USB转TTL模块后WCHISPTool一直提示“等待上电”按复位、换BOOT0跳线、换波特率全都无效。当时我第一反应是“芯片是不是已经烧了”。先把USB转TTL模块的TX和RX短接用串口助手发送数据模块本身收发正常排除了工具问题。然后用万用表量BOOT0对GND电压只有0.8V明显不是稳定的高电平。继续检查发现BOOT0引脚连接跳线帽的焊盘虚焊信号根本没有真正送到芯片引脚上。补焊之后复测BOOT0电压变成3.3V再按“先复位再下载”的顺序一次性成功。这次排查的教训是在怀疑芯片之前先拿万用表把BOOT0电压、NRST电压和3.3V电源量一遍。电平不对一切皆有可能。3.5 真实案例复盘带自动复位电路的模块反而添乱另一个常见坑是使用带DTR/RTS功能的USB转TTL模块。这类模块针对STM32的自动ISP流程设计了复位和BOOT0控制电路但在CH32V103上很可能失效因为两者的bootloader握手时序不完全一致。症状是点击“下载”后模块自动控制复位但始终连不上。如HG680模块或者玩STM32时常用的带自动下载电路的模块接RTS和DTR后反而会把BOOT0和NRST信号配合得乱七八糟。解决办法很简单绕开DTR/RTS这两个引脚只用TXD、RXD、GND三根线BOOT0用手动跳线帽控制复位用手动复位键操作时序完全人工掌握。这样虽然自动化程度低但可控性最高。故障现象优先排查项常见根因一直提示等待上电BOOT0电压、复位时序BOOT0虚焊、跳线帽未接好点击下载后瞬间失败TX/RX交叉、波特率、型号接线同名相连、型号选错握手成功但校验失败Flash容量、供电电压容量选错、3.3V电流不足换了模块才成功USB转TTL模块、驱动CH340兼容芯片高波特率不稳4. 想调试就别省WCH-LinkSWD烧写的接线与配置4.1 WCH-Link的硬件连接串口ISP只解决“把程序烧进去”的问题要在线调试、打断点、看寄存器就必须用WCH-Link走SWD接口。WCH-Link和WCH-LinkE的引脚定义与ST-Link不同不要凭记忆按ST-Link的线序插。以WCH-LinkE为例排针上通常有3V3、SWDIO、SWCLK、GND、TX、RX等引脚。接CH32V103时SWDIO接PA13SWCLK接PA14GND接GND。WCH-LinkE的3V3可以给目标板供电但电流有限还是建议目标板独立供电后和调试器共地。杜邦线越短越好。SWD接口在较高时钟频率下对线长和干扰敏感超过20厘米的杜邦线在高速下载时可能偶发失败适当降低adapter speed可以缓解。4.2 驱动、固件与目标芯片选择Windows下接入WCH-Link后系统一般会识别为“WCH-Link”设备。如果设备管理器里显示黄色感叹号安装官方驱动即可。使用OpenOCD等工具时可能需要用Zadig把驱动切换成WinUSB模式这一步按WCH官方文档操作。用WCH-LinkUtility烧写时选择目标芯片型号为CH32V103软件会自动切换到RISC-V调试模式。点击“Connect”能读回芯片ID和Flash大小能正常读回来说明SWD连接通畅。注意老款WCH-Link可能需要升级固件才能支持新发布的芯片型号。升级途径是WCH-LinkUtility里的菜单升级过程保持调试器连接稳定不要中途断电。我遇到过因为长期没升级固件导致连不上CH32V103的情况升级后问题消失。4.3 MounRiver Studio与OpenOCD烧写流程MRS是CH32V103日常开发的推荐环境。编译完成后在Project Explorer里选中工程点击工具栏的Download图标MRS会调用WCH-Link把程序写入Flash。如果需要调试点Debug按钮启动调试会话设置断点、单步执行、查看变量都很顺畅。OpenOCD也支持CH32V103适合习惯命令行或者想集成到CI流程里的场景。命令行烧写格式大致如下openocd -f interface/wch-link.cfg -f target/wch-riscv.cfg -c program firmware.elf verify reset exit具体配置文件名称需要与本机安装的OpenOCD版本对应我用过多个版本wch-link.cfg和wch-riscv.cfg是比较稳定的命名。如果目标文件是hex把firmware.elf替换成firmware.hex即可。4.4 串口ISP和WCH-Link到底怎么选我的建议是两条路径都备着。日常开发用WCH-Link调试效率高遇到WCH-Link连不上、芯片被读保护锁住、程序把SWD引脚复用掉之类的情况串口ISP往往能救场BOOT0置高复位后直接从bootloader擦除/重烧绕开一切用户代码。量产烧录的场景串口ISP成本低、连线简单配合wchisp命令行可以快速批量操作。但如果追求在线生产调试WCH-LinkE同时支持SWD和串口ISP两条链路一块调试器全搞定。5. 烧写成功之后还会踩的三个坑锁死、引脚复用与启动异常5.1 读保护把调试口锁了怎么办CH32V103支持读保护RDP功能。一旦开启了读保护调试接口无法读取Flash内容有时候甚至连连接都失败WCH-LinkUtility点击Connect无响应。很多“芯片突然连不上了”的情况追根溯源都是之前某个程序里执行了库函数里的读保护配置。解除办法是对Flash执行全片擦除。WCH-LinkUtility或OpenOCD的unlock/erase命令都能完成。注意全片擦除会把用户程序一起抹掉属于“救了砖但程序没了”的操作完成后重新烧写固件即可。如果是串口ISP场景把BOOT0拉高复位理论上绕过了用户代码也可以尝试通过上位机执行擦除。多数情况下串口ISP是解锁的保底方案。5.2 SWCLK/SWDIO被程序复用的二次烧写失败比较阴间的坑是第一次烧写成功程序跑起来了但第二次想再烧就不行了。原因可能是用户程序把PA13SWDIO或者PA14SWCLK配置成了普通GPIO、SPI或UART功能芯片复位后用户程序立刻执行引脚重映射SWD调试口在极短时间窗口后被程序“抢走”WCH-Link自然连不上。解决办法一是按住目标板复位键不放在WCH-LinkUtility里点击Connect或Download然后迅速松开复位键。由于调试器在复位释放瞬间尝试建立连接有一定概率能在用户程序接管引脚之前完成握手。多试几次掌握时机成功率会提升。解决办法二更稳用串口ISP方式接入因为BOOT0置高复位后芯片根本不执行用户代码自然不存在引脚复用冲突。通过串口ISP烧录一个不占用SWD引脚的程序或者直接全片擦除SWD通道就恢复了。所以我在把CH32V103的程序写进Flash之前都会特意确认一下PA13/PA14是否被工程里的某个初始化代码意外复用。养成这个习惯后二次烧写失败的概率会低很多。5.3 烧写成功但上电不运行先查这三处烧写成功并不代表万事大吉。程序烧进去之后上电不运行优先检查三个地方。第一BOOT0引脚是否已经跳回GND。如果BOOT0一直是高电平芯片每次上电都进bootloader用户程序永远不会执行。这个原因听着很蠢但实际出现概率不低尤其是那些把BOOT0用跳线帽控制、没有明确丝印的板子。第二NRST引脚上的复位电容是否过大。有朋友为了抗干扰在复位脚上加了一个10uF电容结果上电时复位电平下降速度异常芯片一直处于复位状态或者复位时间过长看上去就是“烧写了但没运行”。CH32V103的复位电容建议按数据手册选择常用100nF量级别凭感觉加大电容。第三供电电压和去耦电容。CH32V103的VDD和VDDA都需要接3.3V并且靠近引脚放置100nF电容。手工焊接的板子如果漏焊了VDDA周围的去耦电容芯片上电后内部振荡器可能工作不稳定程序就跑飞或者完全无法启动。最后再分享一个我的个人习惯在烧写CH32V103遇到“串口烧写失败”时我从不先怀疑芯片而是拿一张纸记录BOOT0电压、NRST电压、复位方式、波特率、USB模块型号然后按本文上面的顺序一条条排查。烧写本质上是电平、时序和工具选型的组合问题不是玄学。把BOOT0当作第一嫌疑人把TX/RX交叉当作第二嫌疑人把波特率和驱动当作第三嫌疑人这套清单走下来ch32v103xx的烧写问题基本都能定位到具体环节。
返回列表