ARTICLE DETAIL

资讯详情

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

STM32F103C8T6+DAPLINK:一根线搞定下载调试与虚拟串口

STM32F103C8T6+DAPLINK:一根线搞定下载调试与虚拟串口 很多人第一次拿到STM32F103C8T6的蓝色最小系统板第一件事就是纠结买什么下载器。搜索一圈之后发现推荐方案基本就两条路要么ST-Link外加一个USB转TTL要么直接上一只DAPLINK。前者把“下载”和“串口”拆成两件事桌面上得摆两条USB线后者一根线插上Keil能下载、串口助手能看打印、bin文件还能直接拖进去烧这就是DAPLINK的核心价值。这篇内容就围绕STM32F103C8T6 DAPLINK这个组合把虚拟串口这件事彻底讲明白。重点回答几个最常被问的问题为什么DAPLINK的虚拟串口可以免驱为什么同样都是DAPLINK别人的插上有COM口而我的没有以及从接线、配置、代码到排错的完整过程。无论你是刚入门的单片机爱好者还是正在做课设的学生这条路线都能帮你少折腾几天。1. 一根线同时干下载和串口的活儿DAPLINK到底哪里不一样1.1 传统方案为什么要把下载和串口拆开ST-Link V2是ST官方调试器主要负责SWD/JTAG下载和调试但它本身不带通用串口功能部分新版本或带VCP的型号除外。所以想看串口打印很多人会再买一个CH340模块插第二个USB口。这还没完CH340在Windows下需要手动安装驱动遇到Win10/11的驱动签名策略偶尔还要跟“驱动安装失败”斗智斗勇。USB转TTL本质是一个“透明桥”把电脑的USB报文转成TTL电平的串口信号。CH340是国产芯片里出货量最大的方案但它的USB描述符是厂商自定义类Vendor Specific Class操作系统不认识必须装芯片厂家提供的驱动。这个驱动倒是不难找难的是很多人第一次装驱动时端口被占用、驱动版本冲突、按驱动精灵装了一堆垃圾软件。整个过程非常劝退。相比之下DAPLINK走的是ARM官方开源的CMSIS-DAP标准它的USB描述符用的是标准类调试接口用HID人机交互设备类或者Bulk批量传输类虚拟串口用CDC通信设备类。Windows、Linux、macOS对这几类设备的系统驱动内置得很齐全插上就能识别不需要额外装任何厂牌驱动。1.2 DAPLINK其实是三台设备合体说得直白一点DAPLINK不是单纯比ST-Link多了一个串口它把三个功能做进了同一个USB设备里功能普通解决方案DAPLINK下载/调试ST-Link V2独立设备CMSIS-DAP调试接口Keil/IAR/OpenOCD都支持串口通信CH340/CP2102等USB转TTLCDC虚拟串口系统内置驱动固件烧录需要软件配合磁盘模式把bin/hex直接拖进去这里最容易被忽略的一点是拖拽烧录。DAPLINK上电后会枚举出一个U盘盘符把编译好的bin文件拖进这个盘它就自动帮你看目标芯片烧录并复位运行。STM32F103C8T6出厂的BootLoader是串口ISP和DAPLINK的拖拽烧录完全不冲突前者要接BOOT0进系统存储器后者直接走SWD省去跳线帽的烦恼。对于只用F103C8T6做项目的人来说这三个功能里你每天用最多的其实不是烧录而是虚拟串口。任何时候调试程序都需要printf看变量、看状态、看协议交互。以前烧一次程序插一次ST-Link看串口还要拔下来换CH340来回折腾现在一根USB线从头插到尾下载调试和串口打印同时在线这个体验差异谁用谁知道。1.3 为什么说它是“入门首选”而不是“专业首选”诚实地说专业调试器里ST-Link V3、J-Link的功能更强比如SWO跟踪、RTT、更高频率的SWD时钟。DAPLINK的优势是便宜、开源、免驱、便携满足F103C8T6的下载和串口需求绰绰有余。入门阶段最重要的是“别在工具上劝退”DAPLINK正好就是这个角色。顺带提一句现在市面上STM32F103C8T6的国产兼容芯片很常见比如GD32F103和APM32F103。这些芯片的SWD调试协议和STM32一致DAPLINK基本可以通用。我实测下来正常下载、跑串口都没有问题唯一要注意的是部分国产芯片的读保护默认开启首次连接可能需要先全片擦除再写程序这个后面会细说。2. “免驱动”不是玄学HID与CDC两种固件决定你有没有COM口2.1 USB设备靠“类”被系统识别Windows的驱动体系里所有设备都有一个“设备类”。鼠标键盘属于HID类U盘属于Mass Storage类安卓手机通过MTP传输文件。系统自带的类驱动class driver能自动认领这些设备所以插上就能用。DAPLINK要免驱关键就在USB描述符里把接口声明成标准类。具体到虚拟串口它用的是CDC类下的Abstract Control ModelACM子类也就是俗称的USB CDC ACM。Windows对应的驱动是usbser.sysLinux是cdc_acmmacOS自带的USB CDC驱动也认所以谈不上绝对意义的“免驱”准确说法是“系统内置驱动免去用户手动安装”。对比一下CH340为什么非要装驱动它的USB接口描述符不是标准CDC类而是厂商自定义的Vendor接口操作系统不知道拿它当什么用当然需要装一个驱动程序来告诉系统“这个设备是一组串口”。DAPLINK没这个问题根本原因就在固件的USB描述符设计。2.2 为什么同样是DAPLINK有的有COM口有的没有这个问题的答案通常只有一句话固件版本不一样。DAPLINK固件的常见形态有三种纯HID版只带CMSIS-DAP v1调试接口USB描述符里只有一个HID设备没有CDC接口所以设备管理器里看不到COM口。标准DAPLink固件调试接口HID或Bulk和CDC虚拟串口同时存在属于复合设备插上后既能在“通用串行总线设备”里看到调试探针又能在“端口COM和LPT”里看到一个COM口。旧版mbed CMSIS-DAP固件常见于早期调试器只有HID接口没有拖拽烧录盘符也没有CDC串口。所以如果你的板子插上之后设备管理器里找到的是“HID-compliant vendor-defined device”那恭喜你你的DAPLINK正在以纯HID模式工作。它只能下载调试没有虚拟串口。要把它变成“免驱动虚拟串口版”就得刷一版带CDC功能的DAPLINK固件。2.3 刷固件把纯HID版变成HIDCDC版市面上的DAPLINK主控芯片很多时候就是STM32F103C8T6或者类似的ARM芯片。DAPLINK项目本身就开源所以给下载器升级固件不是什么高难度操作。大多数DAPLINK板子预留了固件升级的“维护模式”按住板子上的按钮通常标RESET、DFU、BOOT之类再插入USB。如果成功进入维护模式电脑会出现一个名为MAINTENANCE的盘符。这时候把下载好的DAPLINK固件bin文件直接拖进该盘拷完自动烧录重新拔插就能生效。注意固件版本要和硬件匹配主控是STM32F103C8T6的板子选的固件就是配套的bin不同调试器板子可能有不同的引脚复用搞错了最明显的后果就是拖进去之后设备不识别。所以最好去你买的那家店的详情页找原厂固件或者去DAPLINK官方仓库找对应工程的release固件。通过这个操作你手上的纯HID下载器就可以变成带虚拟串口的“免驱动版”这也是整个项目里最核心的一步。2.4 补一个关于CMSIS-DAP v1/v2的知识下载接口也有版本区别CMSIS-DAP v1是基于HID传输的稳定但速度偏慢CMSIS-DAP v2是基于Bulk传输的速度快很多但Windows下需要WinUSB驱动或者libusb支持。Win10/11对WinUSB的内置支持很好所以大多数新固件直接用v2。你不需要理解太深只需要知道如果Keil里识别的是CMSIS-DAP v1且下载很慢多半是固件版本老刷新版固件有机会变成v2。3. 动手前先确认三件事固件版本、接线、供电3.1 上电第一步看设备管理器到手之后先别急着接目标板把它单独插入电脑USB口打开设备管理器按下面的路径判断如果出现MAINTENANCE盘符或者DAPLINK盘符说明枚举正常。如果“端口COM和LPT”里出现一个带COM编号的串口那虚拟串口已经就绪。如果只有一个“HID-compliant vendor-defined device”那就按上一章的方法刷固件。如果出现带感叹号的未知设备先换一根确定支持数据传输的USB线再说很多“识别不了”的根源是线的问题。这里多说一句USB线真的不要凑合。很多朋友手里的Micro USB线其实是充电线里面只有电源正负极没有D和D-插上怎么弄都没反应。遇到“灯都不亮”或者“电脑毫无反应”的情况先把线换掉别急着怀疑板子烧了。3.2 SWD接线和串口接线分开看STM32F103C8T6最小系统板如果你用DAPLINK板载的USB转串口基本就闲置了。DAPLINK需要接的引脚分两拨下载调试四根线SWDIO - 板子的SWDIOPA13SWCLK - 板子的SWCLKPA14GND - GND3.3V - 3.3V给目标板供电也做电平参考虚拟串口三根线DAPLINK的TXD - 板子的PA10USART1_RXDAPLINK的RXD - 板子的PA9USART1_TXGND - GND注意串口是全双工交叉接法DAPLINK发送对应MCU接收DAPLINK接收对应MCU发送。很多新手第一次接反现象就是下载正常但串口助手什么都收不到或者发指令MCU没反应。另外有个别板子的丝印TXD/RXD是站在DAPLINK自己角度标的接的时候按交叉规则来别盲信丝印。如果目标板已经用USB或外部电源供电DAPLINK就不需要接3.3V只接SWDIO、SWCLK、GND和串口三根线就够了。但GND必须共地不共地的话电平参考不一致轻则串口乱码重则下载失败甚至可能损坏引脚。3.3 供电的隐藏问题两个3.3V电源别怼在一起我最想提醒的是不要在目标板由外部供电的同时又让DAPLINK的3.3V引脚接到目标板3.3V。两个电源同时输出相同电压理论上没事但实际纹波、上电时序不同长期插着容易造成某一方电流倒灌。正确姿势是二选一要么DAPLINK的3.3V作为目标板唯一电源适合跑纯逻辑的小项目要么目标板自己供电DAPLINK只接GND和信号线。我的建议是学习阶段直接用DAPLINK供电简单省事电机、屏幕这类大功率负载再外接电源。还有一个容易忽略的是DAPLINK的VTref检测。很多下载器通过读取目标板的3.3V来判断目标芯片是否存在如果检测不到目标电压会报“No target connected”。所以如果你用外部电源给板子供电而没接GND或者供电没开下载器一样会认为目标板离线。4. 插上电脑没有COM口按这个链路逐个排查4.1 完整排查链路很多人跑到群里问“为什么我的DAPLINK没有串口”其实这类问题的排查路径非常固定按顺序走一遍基本能定位看灯DAPLINK插入后指示灯是否正常亮起。不亮先换线换口最好插电脑主板USB不要走HUB。看设备管理器有没有出现新设备如果有感叹号或未知设备优先处理驱动或线材问题。看设备类型如果出现在“人体学输入设备”下说明DAPLINK工作于纯HID模式没有CDC接口需要刷固件。看端口如果端口(COM和LPT)里有COM口说明虚拟串口已就绪。打开串口助手测一下如果COM口存在但打不开多半是串口被占用或者系统有旧驱动残留。设备管理器里右键卸载此设备勾选“删除此设备的驱动程序软件”重新拔插。下面这个表格是这些年来帮人排查最常遇到的组合可以直接对着查现象可能原因解决办法插上无任何反应USB线只有电源无数据或USB口故障换线、换USB口优先用主板背面的USB口设备管理器有“未知设备”USB枚举失败线材接触不良或固件损坏换线按住按钮进MAINTENANCE模式刷固件只有HID设备没有COM口固件是纯HID版未包含CDC接口刷带CDC的DAPLINK固件有COM口但串口助手打不开端口被占用或旧驱动残留或电脑休眠引发设备假死卸载设备并删除驱动重新拔插关闭串口助手再试下载正常串口收不到数据TX/RX接反或MCU串口未初始化或波特率不一致按交叉接线检查检查PA9/PA10配置统一代码与串口助手波特率串口乱码波特率不一致、共地不良、USB线质量差统一波特率补上GND共地换好线4.2 一个容易被忽略的Windows细节Windows的驱动缓存比很多人想象的顽固。如果电脑之前装过某种免驱串口工具的其它版本或者你插过别的同类型设备系统可能给DAPLINK分配了一个已被占用的COM号导致设备显示正常但实际打不开。我的处理习惯是插入DAPLINK后打开设备管理器找到COM口那一项记住COM号。如果串口助手能选到就万事大吉如果选到了但打不开先把串口工具关掉右键设备卸载设备选删除驱动程序软件重新拔插。98%的情况到这里就恢复了。另外一个系统层面的坑是快速启动。Windows开启快速启动后USB设备枚举有时会不够干净DAPLINK偶尔掉盘或COM口消失。遇到“昨天好好的今天又没了”的情况可以临时关掉快速启动或者直接在设备管理器里把对应的USB Root Hub禁用再启用让系统重新枚举一次。5. 代码侧真正跑通printf重定向与串口回环实测5.1 CubeMX里的USART1配置用STM32CubeMX新建工程选STM32F103C8T6引脚图里能看到PA9和PA10默认就是USART1_TX和USART1_RX。在Connectivity - USART1里开启Asynchronous模式波特率设115200数据位8停止位1无校验即常规的8N1。这两个引脚不需要做特殊复用设置CubeMX会自动配置。生成代码时选HAL库还是标准库都行DAPLINK的虚拟串口对底层库没有要求。如果你用的是江协科技那种经典标准库风格模板思路完全一样只要把USART1的GPIO和串口外设初始化好就行。严格说DAPLINK虚拟串口在主机侧的波特率设置是不敏感的因为USB CDC走的是USB包并不是真实的同步时钟。但MCU侧必须是真实的USART波特率也就是说程序里设置了115200串口助手最好也选115200否则数据虽然能进主机但解码后显示出来就是乱码。这算一个常见的理解误区。5.2 printf重定向代码要让串口能看到printf的输出核心是重定向底层字符输出函数。HAL库Keil的组合写法如下#include stdio.h int fputc(int ch, FILE *f) { HAL_UART_Transmit(huart1, (uint8_t *)ch, 1, 0xFFFF); return ch; }然后在main里直接调用printf(DAPLink Virtual COM Port OK!\n);如果你用的不是HAL库而是标准库把HAL_UART_Transmit换成直接往USART1的数据寄存器写就行int fputc(int ch, FILE *f) { while (!(USART1-SR USART_FLAG_TXE)); USART1-DR (uint8_t)ch; return ch; }Keil MDK里要注意一个经典坑如果不勾选MicroLIBprintf会走半主机模式Semihosting程序有可能在第一次printf时卡死。解决方法是Options for Target - Target - 勾选Use MicroLIB如果实现了fputc后仍然无效再检查工程是否已经勾选微库选项。这是几乎所有入门STM32的人都会撞一次的坎。5.3 串口回环实测能收能发才叫通printf能发出去只是单向验证。更严谨的测试是做回环在串口助手里发送一个字节或一段字符串MCU收到后再把相同内容发回来。最简单的是查询接收uint8_t rx_buf[64]; if (HAL_UART_Receive(huart1, rx_buf, 1, 100) HAL_OK) { HAL_UART_Transmit(huart1, rx_buf, 1, 0xFFFF); }进阶一点用中断接收uint8_t rx_data; HAL_UART_Receive_IT(huart1, rx_data, 1); void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart) { if (huart-Instance USART1) { HAL_UART_Transmit(huart1, rx_data, 1, 0xFFFF); HAL_UART_Receive_IT(huart1, rx_data, 1); } }把这套代码烧进去打开任意串口助手选择DAPLINK枚举出的COM口波特率115200发送一个字符串能看见原样回来说明虚拟串口的收发链路全通。如果你的串口助手发送之后什么都没收到先别怀疑代码。很多串口工具默认会勾选DTR、RTS有些STM32板载复位电路会被这些信号影响导致MCU反复复位重启现象就是发一条指令后感觉板子重启了。这时候把DTR、RTS的勾选去掉再试。这个问题在CH340上很常见在DAPLINK虚拟串口上偶尔也会冒出来。5.4 DAPLINK虚拟串口和普通串口工具的关系最后说清楚一个边界DAPLINK的虚拟串口在电脑端就是一个普通的COM口任何串口工具、日志工具、调试上位机、Python的serial库都能直接操作。它的行为和CH340几乎没有区别唯一优势就是你不需要为了这个COM口去装驱动、找注册码、和乱七八糟的驱动软件搏斗。如果你在Linux或者macOS下开发同样直接用/dev/ttyACM0之类的设备节点即可系统不需要任何额外驱动。跨平台使用这点DAPLINK比CH340省心得多。6. 进阶玩法与坑位清单烧录、调试、虚拟串口三不误6.1 Keil里配置CMSIS-DAP下载调试DAPLINK的下载调试接口和虚拟串口是同时工作的。在Keil里打开Options for TargetDebug页签选择CMSIS-DAP Debugger再点Settings能看到SW Device列表里出现目标芯片说明下载链路正常。这种情况下你可以在串口助手开着COM口的同时反复下载程序互不冲突。这个特性对调试非常友好边看日志边改代码边烧录效率完全不一样。下载速度方面CMSIS-DAP v1的HID传输确实不快但F103C8T6程序通常几十KB体感烧录时间也就一两秒问题不大。如果嫌慢优先确认固件是否支持CMSIS-DAP v2。6.2 拖拽烧录的正确玩法和边界把编译出的hex或者bin文件直接拖进DAPLINK盘符这是它的招牌功能。拖进去之后DAPLINK会自动烧录并复位运行目标板。玩过Arduino的朋友可以把这理解成“STM32版的一键烧录”。边界是DAPLINK毕竟不是量产烧录器它适合开发调试阶段快速换固件。量产或者要加密的场景还是用专业烧录器或者配合读保护、ISP方式。说到加密STM32F103C8T6可以做读保护RDP设置后JTAG/SWD访问会被禁止DAPLINK也会连不上。国产兼容芯片里有一部分出厂默认开了读保护首次用DAPLINK连接会报错解决方法是先在支持的烧录软件里执行全片擦除unprotect然后再写程序。6.3 国产兼容芯片的使用注意用GD32F103C8T6或APM32F103C8T6替代的板子DAPLINK的接线和代码都一样。如果遇到SWD无法连接可以试试降低SWD时钟频率在Keil的CMSIS-DAP Settings里把Max Clock从5MHz改成1MHz甚至100kHz很多连接不上的情况其实是线材干扰加上SWD时钟太高。另外注意先擦除再烧录特别是在旧固件里开了读保护的情况下。6.4 我踩过而且你很可能也会踩的坑最后把我在这个组合上踩过的坑一次性列出来每一条都是真金白银换来的串口接反导致排查半小时DAPLINK的TXD接开发板PA10DAPLINK的RXD接PA9交叉接。接反不会烧东西就是没有数据。充电线冒充数据线换了第三根线才意识到手里根本没有一根能传数据的Micro USB线下载器和串口全都无法工作。目标板外接电源时没有共地没接GND串口打印偶尔正常偶尔乱码下载时偶尔失败。DAPLINK的3.3V和目标板3.3V同时供电两个3.3V电源直接对接长期使用有隐患。Windows休眠唤醒后COM口消失在设备管理器里禁用并重新启用USB Root Hub或者拔插一次。刷固件刷错版本拖入固件后盘符消失、电脑也识别不了不要慌重新进入MAINTENANCE模式再刷正确固件基本都能救回来。串口助手勾选了DTR/RTS导致MCU反复复位把这两个选项去掉问题秒解。还有一个实用小技巧调试时如果串口助手频繁打不开COM口不用重启电脑把串口助手先退出再在设备管理器里禁用再启用该COM口比拔插USB还快。从我自己的使用频率来看STM32F103C8T6这类小板子配上DAPLINK最大的收益不是省了一个模块钱而是把“下载—调试—看日志”这个循环从三套工具变成一根线。很多朋友问我入门买什么我现在的标准答案基本都是F103C8T6板子DAPLINK杜邦线这套组合足够你把中断、定时器、串口、PWM这些基础玩明白。等以后真要用到RTT、SWO跟踪这些高级功能再上专业调试器也不迟。如果你也刚把DAPLINK拿到手先按这个流程把虚拟串口打通后面的开发路会顺很多。
返回列表