尧图网络科技YAOTU DIGITAL 获取报价
获取报价
首页 / 资讯中心 / 文章详情

CH347F实战:一芯搞定STM32 SWD调试与SPI Flash烧录

发布时间:2026/9/24 14:07:15

资讯中心
01
ARTICLE

CH347F实战:一芯搞定STM32 SWD调试与SPI Flash烧录

CH347F实战:一芯搞定STM32 SWD调试与SPI Flash烧录
做嵌入式开发久了手边总会堆满各种下载器和编程器调试STM32要一个ST-Link烧个SPI Flash又要掏出一个CH341A再加上逻辑分析仪、串口线桌面乱成一锅粥。前阵子我收到一片CH347F模块发现这芯片居然把SWD调试和SPI Flash烧录两大刚需合到了一起配合OpenOCD和flashrom这两个开源工具一片芯片就能把STM32的调试和SPI Flash的读写全包了。这篇就和大家聊聊怎么用CH347F同时玩转STM32的SWD调试和SPI Flash烧录包括硬件连接、驱动配置、工具链使用以及我踩过的那些坑。CH347F是南京沁恒推出的一款USB高速转接芯片内部集成了USB2.0 HS PHY支持JTAG/SWD、SPI、I2C、UART等多种接口。更妙的是它可以通过配置切换工作模式而不是像普通USB转串口芯片那样只固定一种功能。这意味着同一颗芯片既能扮演ST-Link那样的SWD调试器角色也能变身CH341A那样的SPI Flash编程器。对于经常在“调MCU”和“刷Flash”之间来回切换的开发者来说这个思路非常实用。这套方案适合谁如果你手上恰好有CH347F模块或者正打算入一个多合一的调试编程器又不想买一堆专用工具那么这篇文章正好适合你。哪怕你是第一次听说OpenOCD和flashrom只要照着下面的步骤走也能顺利跑通。下面我按自己的实战流程从硬件原理到软件命令再到问题排查一步步拆开讲。1. 为什么选择CH347F一芯多用的硬件基础1.1 CH347F是什么一个USB转多协议接口芯片CH347F本质是一个“USB桥接芯片”就是把USB信号转换成各种传统嵌入式接口。它的核心优势在于支持多种工作模式而且每种模式下还能同时保留一路UART。举个例子当我把它配置成JTAG/SWD模式时除了可以用OpenOCD调试STM32还能同时通过UART打印日志当我把它配置成SPII2C模式时又可以用flashrom读写SPI Flash还能顺手接一个I2C传感器。这种“组合拳”对于调试和量产都非常方便。芯片本身不需要额外的MCU插上USB就能被系统识别。Windows下有官方驱动Linux下则直接使用内核自带的USB驱动和libusb开源工具链配合起来很顺畅。从硬件设计上看CH347F引脚不算多外围只需要少量去耦电容和一个晶振部分模块会用内置时钟很轻松就能集成到自己的小工具里。1.2 为什么用CH347F而不是ST-Link/J-Link/FT2232H很多人会问ST-Link不香吗J-Link不香吗香但贵且专一。ST-Link只能调试ST的MCU虽然也能通过刷固件变成DAP-Link但SPI Flash编程能力基本没有。J-Link加上J-Flash也能烧SPI Flash但正版价格摆在那里盗版稳定性又看脸。FT2232H也很强JTAG、SPI、UART都能做但芯片价格和开发门槛都偏高而且市面上模块质量参差不齐。CH347F走的是“够用且便宜”的路线。它同时具备SWD/JTAG和SPI主机能力SWD最高速度可以跑到几十MHz级别实际配合OpenOCD使用稳定速度通常在4MHz到12MHz左右SPI模式也支持常用Flash读写。对于个人开发和中小批量生产这个性能完全够用。更关键的是OpenOCD和flashrom这两个开源项目都已经加入了CH347支持生态闭环很完整。工具/方案支持SWD调试支持SPI Flash编程价格开源工具链ST-Link/V2仅ST MCU不支持约20-40元OpenOCD支持J-Link正版广泛支持部分型号需J-Flash数百至数千元支持有限FT2232H模块支持支持约80-150元OpenOCD/flashrom支持CH347F模块支持支持约30-60元OpenOCD/flashrom支持从表格可以看出CH347F是功能和成本平衡得比较理想的选择。如果你只是偶尔调一下STM32、偶尔刷一下Flash一片CH347F就足够了。1.3 “一芯多用”的实际定位不是同时并行而是快速切换这里必须说清楚CH347F虽然“一芯多用”但SPI和JTAG/SWD并不是在同一时刻同时工作的。根据官方手册CH347F的工作模式主要有这么几种模式0双路UART模式1单路UART SPI I2C模式2单路UART JTAG/SWD也就是说SPI和JTAG/SWD是两种不同的模式。我需要在调试STM32时把芯片切到模式2在烧SPI Flash时切到模式1。好在模式切换不是改硬件跳线而是通过官方工具写配置字几秒钟就能完成。实际使用中我一般先备份好两套配置需要哪个就切哪个整个过程并不麻烦。这种“分时复用”的设计其实很合理。因为日常开发的痛点不在于“同时”使用两种接口而在于“频繁切换”时不想换工具。用一颗芯片、一个USB口解决两种场景这正是CH347F的价值所在。2. 硬件连接与驱动准备实操前必读2.1 CH347F引脚与最小系统接线和很多USB转接模块一样市售的CH347F模块一般已经把晶振、EEPROM、USB座、电平转换都做好了我只需要关注对外接口。以我手头的模块为例引出的关键信号包括信号名模式2JTAG/SWD功能模式1SPI功能说明TCK/SKSWCLKSCK时钟TMS/CSSWDIOCS数据IO/片选TDI/DITDIMOSI数据输入TDO/DOTDOMISO数据输出RST#复位输出通用IO可接目标板复位UART_TX/RX串口发送/接收串口发送/接收调试日志连接STM32 SWD调试时只需要用到SWCLK和SWDIO两个信号另外最好把GND连上RESET也接上方便OpenOCD控制复位。连接SPI Flash时则需要接上SCK、CS、MOSI、MISO以及VCC和GND。有一点要特别留意CH347F模块的IO电平通常是3.3V。如果目标SPI Flash是5V器件必须加电平转换否则轻则读不到ID重则烧坏Flash。STM32的SWD接口一般是3.3V可以直接连接但也要确认目标板IO电压不是5V。2.2 驱动安装与工作模式切换Windows下我一般用官方提供的CH347驱动安装后设备管理器里能看到“USB-Serial”或者“USB JTAG/SPI”之类的设备。Linux下不需要额外安装驱动系统会把CH347识别为一个USB设备OpenOCD和flashrom通过libusb直接访问非常省心。模式切换则通过官方配置工具完成。工具界面里可以选择工作模式比如选“模式2UARTJTAG/SWD”用于调试STM32选“模式1UARTSPII2C”用于烧SPI Flash。保存之后重新插拔一下USB设备新模式就生效了。建议在电脑里同时保存两份配置文件的备份或者用工具里的“读取配置”功能把当前配置导出来避免误操作后还要重新设置。2.3 电平、供电和地线最常见的翻车点我在最早调试时就翻过车只连了SWCLK、SWDIO和GNDOpenOCD却一直报“SWD/JTAG Communication Failure”。排查半天发现目标板是独立供电的虽然连了GND但调试器和目标板之间还存在电位差导致信号电平不稳定。所以记住一个原则无论调试还是烧录地线必须先接而且必须可靠连接。另外CH347F模块一般会从USB取5V电源板上再稳压到3.3V给IO使用。如果目标板需要供电可以用模块上的3.3V输出但要注意电流限制。STM32核心板还好如果带屏幕、传感器等外设建议目标板独立供电然后只共地。SPI Flash也一样尽量单独供电避免从CH347F模块拉太多电流导致电压跌落。3. OpenOCD CH347F 玩转STM32 SWD调试3.1 OpenOCD对CH347F的支持现状与安装OpenOCD是目前最流行的开源调试器软件支持非常多的调试器和目标芯片。对CH347的支持在较新版本中已经合入主线我使用的是OpenOCD 0.12.0之后的版本配置中可以直接指定adapter driver ch347。如果发行版自带的OpenOCD版本太老建议自行编译最新版或者使用WCH官方或社区维护的OpenOCD分支。Linux下源码编译比较直接git clone https://github.com/openocd-org/openocd.git cd openocd ./bootstrap ./configure --enable-ch347 make -j$(nproc) sudo make install注意--enable-ch347这个选项如果没启用后面会找不到适配器。Windows下则建议直接下载带CH347驱动的预编译版本省去编译麻烦。3.2 编写CH347F适配的OpenOCD配置文件OpenOCD的配置思路很清晰先指定调试器接口再指定目标芯片。下面是我给STM32F103写的配置# ch347_stm32.cfg adapter driver ch347 adapter speed 4000 transport select swd source [find target/stm32f1x.cfg]如果你用的是STM32F4系列把最后一行换成source [find target/stm32f4x.cfg]这里的adapter speed 4000表示SWD时钟频率为4MHz。对于常见的STM32F1/F4这个速度足够稳定。如果接线较长或者目标板干扰大可以降到1000甚至500。启动OpenOCD时只需要指定这个配置文件openocd -f ch347_stm32.cfg看到类似Info : Listening on port 3333 for gdb connections的输出就说明连接成功了。此时OpenOCD默认在3333端口开启了GDB服务器在4444端口开启了telnet控制台。3.3 烧录、调试、读写STM32的操作流我习惯另开一个终端连上OpenOCD的telnet控制台来操作telnet 127.0.0.1 4444进去后最常用的命令有这么几条halt flash write_image erase app.hex reset runhalt让CPU暂停避免烧录过程中Flash被运行中的程序干扰。flash write_image erase app.hex擦除并写入hex固件reset run复位并运行程序。如果想读回Flash内容做备份可以这样halt dump_image backup.bin 0x08000000 0x10000这条命令会把从0x08000000开始的64KB内容读出来保存成backup.bin。想验证内存数据可以用mdw 0x08000000 8按32位字显示前8个字。还有reset halt这个组合命令可以复位后立即停在复位向量处方便调试启动流程。对于开看门狗导致无法停下来的情况reset halt比单纯halt更可靠。3.4 遇到“SWD/JTAG Communication Failure”怎么破这个报错应该是STM32调试最常见的噩梦。我遇到过的原因大概有这几种接线错误SWDIO和SWCLK接反或者没有共地。先检查杜邦线用万用表量通断。目标板供电异常目标板没上电或者电压不对。SWD调试器通常不能代替目标板供电。速度太高杜邦线面包板环境下4MHz可能不稳定降到500kHz试试。调试口被禁用/复用程序里把SWD引脚复用成GPIO或者设置了读保护。这种情况需要先用复位线配合或使用ST-Link的connect under reset模式。没有接复位线某些情况下OpenOCD需要通过复位线控制目标。在配置里加上reset_config srst_only试试。排查时我一般按“先查硬件、再降速度、最后查加密”的顺序来。硬件没问题后把adapter speed调到500再不行就加reset_config srst_only大多数问题都能解决。4. flashrom CH347F 搞定SPI Flash烧录4.1 flashrom是什么为什么要用它flashrom是一个老牌开源闪存编程工具支持上千种Flash芯片和几十种编程器。它不像厂商专用软件那样只认自家硬件而是通过统一的命令行接口来读写Flash。配合CH347F的SPI模式相当于把一个USB转接模块变成了一个通用SPI Flash编程器。CH347F在flashrom中的驱动名是ch347_spi使用时通过-p参数指定flashrom -p ch347_spi如果提示找不到编程器先确认CH347F已经切换到SPI模式并且驱动权限正常。Linux下如果提示权限不足可以加sudo或者写一个udev规则让当前用户有权限访问USB设备。4.2 让CH347F变身SPI编程器首先要把CH347F的工作模式从JTAG/SWD切换到SPI。使用官方配置工具选择模式1UARTSPII2C保存并重新插拔USB。接下来把SPI Flash连接到CH347F模块的SPI接口。以常见的W25Q64为例接线如下CH347F信号W25Q64引脚SCKCLK引脚6CSCS#引脚1MOSIDI引脚5MISODO引脚2VCC 3.3VVCC引脚8GNDGND引脚4这里强调两点。第一HOLD#引脚3和WP#引脚7不能悬空乱接最好都接到VCC否则Flash可能进入保护状态或异常保持。第二有些Flash是5V供电的必须用3.3V转5V的电平转换模块不能直接接在CH347F上。4.3 烧录SPI Flash的完整命令与流程最基本的操作是读取、擦除和写入。先备份flashrom -p ch347_spi -r backup.bin这个命令会读取整颗Flash内容并保存到backup.bin。如果不知道Flash型号可以先用-V或--flash-name查看flashrom -p ch347_spi --flash-name擦除整片flashrom -p ch347_spi -E写入新固件flashrom -p ch347_spi -w firmware.bin-w会自动执行擦除、写入和校验一步到位。如果只想写入某个区域可以用-l layout等高级功能不过日常使用频率不高。在实际操作中我最常用的流程是先读取备份再写新固件最后再读回来比对一次。虽然-w自带校验但手工读回来再做一次cmp更让人放心。对于关键数据我还会用diff命令确认两个文件完全一致。4.4 SPI Flash在STM32系统中的典型玩法SPI Flash在STM32项目里最常见的用途是存字库、存配置文件、存录音数据、存OTA升级固件等。比如你用STM32驱动一块TFT屏幕中文字库放不下就可以把字库文件烧到SPI Flash里运行时通过SPI读取。再比如产品需要记录运行参数频繁改写片上Flash会影响寿命外挂SPI Flash就是更好的选择。用CH347Fflashrom烧SPI Flash最大的好处是不依赖目标板程序。哪怕MCU还没焊上去或者片上程序跑飞了只要Flash颗粒还在就能通过CH347F直接刷写。这在维修和生产场景中特别实用。我自己就遇到过一次板子上的STM32固件写崩了连SWD都连不上但外挂的W25Q16里还存着关键配置。用CH347F切到SPI模式直接读出Flash内容轻松恢复了数据。5. 一芯多用模式切换与混合调试的实战技巧5.1 模式切换的底层逻辑与快速操作CH347F的模式切换本质上是修改芯片内部的配置信息这和数据手册里的“Mode Select”机制一致。官方工具通过USB发送特定命令把配置写入芯片的配置区重启后生效。为了减少切换的麻烦我习惯在工具里把两种模式分别保存成两个配置文件比如ch347_swd.cfg和ch347_spi.cfg。切换时只需“加载配置-保存-拔插”三步十几秒就能完成。如果你觉得软件切换还是太慢可以看看自己的CH347F模块是否预留了模式切换引脚。有些模块把模式选择引脚引了出来通过跳线帽或拨码开关就能切换使用起来更方便。不过要注意不同厂商的模块设计不同具体看原理图。5.2 工作模式与引脚复用对照搞清楚引脚复用关系能避免很多接线错误。下面这张表是我自己整理的快速参考引脚模式2JTAG/SWD模式1SPI引脚ASWCLKSCK引脚BSWDIOCS引脚CTDIMOSI引脚DTDOMISO引脚ERST#GPIO/UART引脚FUART_TXUART_TX引脚GUART_RXUART_RX注意SWD模式下其实只需要SWCLK和SWDIO两根信号线TDI/TDO可以不接。但SPI模式下需要完整的四线SCK/CS/MOSI/MISO。所以从SWD模式切到SPI模式后必须重新接线否则很容易把信号接错。5.3 同时挂载SWD和SPI Flash的硬件设计建议如果你像我一样要在一套硬件上频繁切换这两件事我建议在PCB设计阶段就做好规划。可以把CH347F的SWD信号和SPI信号分别引到两组排针上用跳线帽选择。更进阶的做法是使用模拟开关如TS3A5018来切换两组信号但这会增加成本和复杂度个人DIY没必要。对于现成的目标板我给几个实用建议把CH347F模块固定在一块小转接板上SWD和SPI各做一根定制线切换时直接换线不用每次找线。用不同颜色的杜邦线区分信号红色电源、黑色地线、黄色时钟、白色数据免得插错。如果SPI Flash和目标MCU挂在同一条SPI总线上烧录时最好把MCU的片选或供电断开避免总线冲突。6. 常见问题与排查实录6.1 OpenOCD找不到CH347适配器症状是OpenOCD启动后报Error: couldnt find a CH347 device或者No usable device found。这时候先从系统层面确认设备枚举。Linux下执行lsusb | grep 1a86如果能看到WCH的USB设备说明硬件连接没问题。接下来检查OpenOCD版本和编译选项确认支持CH347。如果版本没问题再检查当前用户是否有USB访问权限。Linux下可以临时用sudo openocd验证如果sudo下能识别就写一个udev规则来解决权限问题。6.2 连接ST-Link正常换CH347后却失败很多人在ST-Link上跑得好好的一换CH347就报SWD/JTAG Communication Failure。其实不一定是CH347的问题而是两者时序和默认速度不同。ST-Link的默认速度较低而OpenOCD对CH347默认速度可能偏高。解决方法是把adapter speed降到1000甚至500同时检查配置文件中是否有ST-Link相关的残留设置比如hla_swd之类的语句必须删掉。另外CH347模块的SWDIO/SWCLK引脚顺序可能和ST-Link不一样务必对照模块丝印接线。6.3 flashrom识别不到SPI Flash如果运行flashrom -p ch347_spi --flash-name提示No EEPROM/flash device found先检查模式是否切到了SPI模式。如果模式正确再看接线。我最常犯的错误是把MOSI和MISO接反因为有些模块的丝印是DO/DI不是MOSI/MISO。另外Flash的CS#引脚必须直接连到CH347F的CS引脚不能悬空。有些Flash的WP#和HOLD#如果悬空也会出问题建议都接VCC。如果还是识别不了用示波器或者逻辑分析仪看SCK是否有时钟输出这样可以判断是硬件问题还是软件问题。6.4 烧录途中校验不一致或超时写入过程中提示VERIFY FAILED或者Programming failed大概率是信号质量问题。第一个办法是降低SPI速率flashrom里可以加-p ch347_spi:spispeed1000类似的参数具体语法不同版本略有差异可以执行flashrom -p ch347_spi --help查看。第二个办法是缩短杜邦线长度尽量控制在10厘米以内。第三个办法是检查供电电压尤其是SPI Flash的工作电压是否稳定。我碰过一次奇怪的问题就是USB延长线质量差导致供电跌落到2.8VFlash进入了低电压保护怎么擦都擦不干净。6.5 为什么OpenOCD已停止进程崩溃/卡死Windows下经常看到“OpenOCD已停止工作”的弹窗Linux下表现为进程挂死。这个我经历过好几次主要原因和经验如下OpenOCD版本太老老版本对CH347支持不完善换新版本或官方分支。配置冲突同一个配置文件里既有adapter driver ch347又有interface/hla之类的语句导致驱动初始化失败。USB驱动被占用某些Windows环境下CH347被识别为串口设备OpenOCD无法以libusb方式访问。解决方案是使用Zadig把设备驱动替换为WinUSB或者使用官方提供的OpenOCD搭配的驱动。热插拔问题OpenOCD运行中拔掉USB再次插上后进程不自动恢复。建议先停止OpenOCD再切换模式或拔插。遇到崩溃时我会先用dmesgLinux或设备管理器Windows确认设备还在再尝试重新启动OpenOCD。如果频繁崩溃就检查是不是USB线质量太差或者电脑的USB电源管理导致设备休眠。7. 实操心得与扩展建议这套方案我实际用了大半个月最大的感受是“桌面干净了”。以前调试STM32要插ST-Link烧Flash要插CH341A互相之间还容易搞混。现在一片CH347F模块通过配置切换就能覆盖这两个主要场景OpenOCD和flashrom配合起来也相当稳定。虽然它不是同一时间并行干两件事但对我来说换工具的时间成本远远小于换来换去的麻烦。另外CH347F的UART通道在模式2下也可以同时用这意味着我可以在调试STM32时用OpenOCD控制暂停/单步同时用串口日志观察输出。再配合一个免费的串口工具基本上一个小模块就把调试、日志、Flash编程三件事都包圆了。最后分享一个小技巧如果你经常需要给不同型号的STM32和不同品牌的SPI Flash刷写可以在电脑上放一个脚本目录把常用的OpenOCD配置和flashrom命令都写成脚本比如debug_f103.sh、flash_w25q64.sh。我用CH347F这么久最大的心得就是“多合一工具不一定最强但一定最方便”。当你不用在工具堆里翻来找去的时候开发的流畅度会明显提升。希望这篇实战记录能帮你少走一些弯路。
02
RELATED NEWS

相关资讯

更多网站建设与数字化升级内容

03
WHY YAOTU

想打造同款高转化官网?

懂行业、懂生意,从建站到增长一站式陪跑

场景化定制

不做模板站,围绕你的业务场景量身设计,小众不撞款。

营销型架构

以转化目标组织内容与路径,让官网真正带来询盘。

全周期服务

设计、开发、运营、运维一体,上线只是开始。

免费获取你的建站方案

留下需求,专属顾问 24 小时内为你输出方案建议。