用DAPLINK给STM32F103C8T6做虚拟串口这事我最初是抱着试试看的心态搞的结果发现这方案比我想象中实用太多。原来调试单片机总离不开USB转TTL模块手边刚好没有的时候特别抓瞎后来换了个带虚拟串口功能的DAPLINK下载器一根USB线同时搞定下载、调试、串口通信而且免驱动省了一大堆装驱动的破事。这篇文章就把我折腾出来的经验完整写下来从原理到接线到实操再到各种坑尽量一次讲透。1. 为什么我推荐用DAPLINK做STM32F103C8T6的虚拟串口1.1 串口调试在嵌入式开发中的核心地位玩过STM32F103C8T6的朋友都知道串口几乎是调试阶段的“生命线”。不管是打印日志、调试传感器数据还是验证通信协议都离不开一个可靠的串口通道。我最早用USB转TTL模块比如CH340、CP2102那一类来做这件事虽然能用但问题也很典型一是要额外占用一个USB口二是驱动偶尔抽风换个电脑就要重新装尤其是在别人机器上现场调试的时候装驱动的过程非常影响效率。STM32F103C8T6这块芯片本身就是入门首选价格便宜、资源够用、资料多但很多初学者在串口这一步就卡住了。老是听说“串口连不上”“识别不了COM口”“波特率对不上”“乱码”之类的提问归根结底很多人并不是不会用串口而是被“驱动”这个拦路虎挡住了。DAPLINK下载器带虚拟串口功能恰好能一次性解决这个痛点下载程序、在线调试、虚拟串口三合一而且免驱动插上就能用。1.2 DAPLINK相比传统USB转TTL的核心优势我之所以推荐DAPLINK而不是继续用USB转TTL核心原因有几个。首先是“一线搞定”DAPLINK下载器通过USB连接电脑后同时会虚拟出一个串口和调试接口不需要再接额外的串口线也不用单独占用两个USB口。其次DAPLINK是基于CMSIS-DAP协议的开源方案调试功能对MDK、IAR、OpenOCD等都支持兼容性非常广泛。我用过的野火DAP下载器就是典型代表它有标准版和精简版之分标准版带虚拟串口功能精简版砍掉了串口只保留下载调试功能这个坑后面会专门说到。还有一个容易被忽视的点是DAPLINK的虚拟串口在Windows 10和Windows 11系统下不需要装驱动因为系统自带了HID和CDC的驱动支持不像CH340那样偶尔还要担心驱动版本不对导致设备识别失败。安卓模拟器上vspd之类的虚拟串口软件和DAPLINK这种硬件虚拟串口完全是两码事别搞混了。1.3 免驱动背后的门道HID还是CDC很多刚入门的朋友听到“免驱动版”可能会误解为“不需要任何驱动”其实更准确的说法是“系统内置了对应的驱动”。DAPLINK的调试接口走的USB HID协议而Windows系统天生支持HID设备所以插上就能识别为“HID兼容设备”不需要额外安装驱动。虚拟串口部分常见有两种做法一种是用USB CDC类协议能被系统识别为标准的Communications and CDC Abstract Control Model设备Win10/Win11直接识别为COM口新装的Win10可能需要系统更新一下USB串行设备驱动另一种是部分魔改固件把CDC也包装成HID方式兼容性更广但性能和通用性稍差。我实测过几款不同固件版本的DAPLINK发现Win10下都能直接识别出“USB串行设备”然后映射成一个COM口。这里要特别提醒如果你用的是Win7系统可能还是需要手动装一下驱动Win7对CDC设备的支持不像Win10那么完善。所以带个Win10以上的电脑环境下DAPLINK虚拟串口才是真正意义上的“免驱动”。2. 动手前的准备认清DAPLINK与STM32F103C8T6的硬件细节2.1 DAPLINK下载器的引脚定义与版本区分市面上常见的DAPLINK下载器外形五花八门但引脚定义基本都遵循一个约定。一般情况下下载器上会标有3.3V、5V或者VCC、GND、SWDIO、SWCLK、TXD、RXD、RST之类。SWDIO和SWCLK是用来连接芯片的SWD调试接口TXD和RXD就是虚拟串口的收发引脚。这里有一个非常关键的细节虚拟串口引脚的连接方式。DAPLINK的TXD并不是直接接到STM32的TXD而是接到STM32的RXDPA10DAPLINK的RXD接到STM32的TXDPA9。这种交叉连接方式很多初学者容易搞反串口助手窗口里啥都收不到还以为是程序写错了。版本方面需要注意区分“是否带虚拟串口”。很多便宜的精简版DAP下载器只引出了SWDIO、SWCLK、GND、3.3V、5V这几个脚没有TXD和RXD这种就不支持虚拟串口功能。我在淘宝上买过9块9包邮的回来一看没有串口引脚只好退掉重新买。所以下单前一定要看清楚商品详情页有没有标注“带串口”或“V2版本”。2.2 STM32F103C8T6最小系统板的串口引脚STM32F103C8T6最小系统板是目前非常流行的蓝色开发板它默认的串口引脚是USART1的PA9TX和PA10RX。很多人会疑惑为什么是这两根引脚因为STM32F103C8T6有多个串口而USART1是最常用的调试串口它可以通过内部引脚重映射但默认情况下就是PA9和PA10。另外STM32F103C8T6的USART1和USB口PA11、PA12是独立的所以即使你用了USB虚拟串口功能也不会和DAPLINK的物理串口冲突。需要注意的是如果你在代码里同时启用了USART1和USB要注意引脚之间的关联不过本文讲的方案不涉及芯片自带的USB所以不用纠结这个问题。最小系统板上通常已经集成了USB转串口电路比如板子上的CH340芯片但我推荐直接用DAPLINK的虚拟串口而不是用板载的CH340。原因很简单板载CH340需要另外插一根USB线而且占用了开发板的USB口接线变多容易乱。用DAPLINK的话目标板只需要通过杜邦线接下载器下载器和电脑之间一根USB线就够了桌面清爽不少。2.3 完整接线明细与供电注意事项我用的是标准版DAPLINK下载器和STM32F103C8T6最小系统板接线方式供参考DAPLINK引脚STM32F103C8T6最小系统板引脚说明SWDIOPA13SWDIO调试数据线SWCLKPA14SWCLK调试时钟线GNDGND必须共地3.3V3.3V可选由DAP给板子供电TXDPA10RX交叉连接DAP发送到板子接收RXDPA9TX交叉连接板子发送到DAP接收供电方面如果目标板只是最小系统、没有大功率外设DAPLINK的3.3V输出可以给板子供电。但如果你接了OLED屏、传感器、舵机之类的东西乖乖用USB线或者外部电源给STM32F103C8T6单独供电只和DAPLINK共地就好。我接过一个带ESP8266模块的项目靠DAP的3.3V供电Wi-Fi模块一发射就把电压拉低了导致系统反复重启查了半天才发现是供电不足的问题。还要注意一个细节DAPLINK的3.3V和5V输出能力有限通常只有几十到几百毫安给整个系统板供电时心里要有数。连接目标芯片后如果DAP下载器指示灯熄灭八成是供电过载或者接线短路这个后面专门讲。3. 免驱动虚拟串口的原理与固件版本选择3.1 从USB的角度理解“免驱动”这件事要真正理解为什么DAPLINK的虚拟串口免驱动得从USB设备分类说起。USB设备在枚举的时候会主动上报自己的“设备描述符”告诉电脑自己属于哪个类别。CH340这种USB转串口芯片用的是厂商自定义类别Windows本身不认所以必须装官方驱动才能识别成COM口。而DAPLINK的CDC虚拟串口遵守的是USB通信设备类标准Windows系统自带了usbser.sys这个驱动所以枚举成功后就自动映射成COM口了。我经常用这个类比来理解USB CDC就像是USB生态里的“普通话”Windows系统默认就会说这种“普通话”所以不需要额外装“翻译器”。CH340用的厂商自定义协议更像是“方言”Windows听不懂你得给它装一个“翻译器”才行。所以DAPLINK免驱动的根本原因就是它说的是设备类的“普通话”。需要注意的是老版本固件的DAPLINK可能枚举成一个HID设备和一个CDC设备而CDC设备在极少数精简版Windows系统下还是会被标记成未知设备。遇到这种情况先去Windows更新里补一下驱动库或者手动指定usbser.sys驱动一般就能解决。3.2 固件版本对虚拟串口的影响DAPLINK下载器的固件质量参差不齐尤其是国产的各类翻版下载器固件版本五花八门。我查过不少资料发现国外有款基于SAML21的DAPLINK固件支持免驱动CDC串口而野火官方早期固件的虚拟串口在某些Windows版本下也存在识别问题。如果你手里的DAPLINK插上电脑后设备管理器里只有“HID兼容设备”而没有“COM和LPT”下面的串口设备那多半是固件里没有启用虚拟串口功能或者固件版本太老。有些DAPLINK可以重新烧录固件来开启虚拟串口功能但操作起来比较麻烦还要用到另一个下载器初学者不建议折腾。我的建议是直接买固件支持虚拟串口的版本比如带有“V2”“升级版”“带串口”标识的产品。买回来先插电脑看一眼设备管理器确认出现COM口后再接线测试省得后面出问题不知道是硬件还是固件的原因。3.3 在设备管理器中确认虚拟串口正确识别把DAPLINK插上电脑的USB口后正常情况下的识别结果应该是设备管理器里出现一个“HID兼容设备”用于调试下载同时“端口COM和LPT”下面出现一个“USB串行设备COMx”。这个COMx就是你的虚拟串口号。我遇到过一种情况设备管理器里能正常识别出两个设备但MDK里下载程序的时候却提示找不到CMSIS-DAP调试器。后来发现是驱动被某些管家软件给优化“禁用”了右键设备手动启用就好了。另外如果你插了多个USB转串口设备COM号可能会乱跳每次烧录前在串口助手里确认当前的COM号避免打开错误的串口。如果设备管理器里有黄色感叹号右键选择“更新驱动程序”然后在“浏览我的电脑”里选择“从计算机的设备驱动列表中选择”手动挑“USB串行设备”试一下。这个方法我用了不止一次屡试不爽。4. 实操全流程从CubeMX配置到串口收发测试4.1 CubeMX创建工程时的三个关键参数我用STM32CubeMX配合Keil MDK来演示完整流程这是目前最主流的开发方式。打开CubeMX后选芯片STM32F103C8T6然后需要关注三个关键配置缺一不可。第一个是调试接口。在System Core SYS Debug里选择Serial Wire这个必须设置否则第一次下载程序后片内调试口被占用第二次就连接不上芯片了。这个坑几乎每一个做STM32开发的人都踩过所以配置时一定要记得。第二个是USART1。在Connectivity USART1里把Mode选为Asynchronous异步模式参数保持默认的115200、8位数据、无校验、1位停止位即可。引脚会自动分配成PA9USART1_TX和PA10USART1_RX如果引脚被占用的话CubeMX会报冲突这时候稍微调整一下相关外设的引脚分配就好。第三个是时钟树。STM32F103C8T6最高主频是72MHz默认情况下CubeMX会按外部晶振HSE自动配置。如果板子上没有外部晶振你要把HSE关掉用HSI内部时钟但USART波特率精度会略差一点。我手里的板子一般都有8MHz晶振所以我习惯用外部时钟这时直接将HCLK设为72MHz即可。4.2 MDK里配置DAPLINK下载与调试的步骤CubeMX生成MDK工程后打开项目先别急着编译先去配置调试器。点击Options for Target魔术棒在Debug选项卡里选择CMSIS-DAP Debugger然后点旁边的Settings。正常情况下CMSIS-DAP Adapter列表里会识别出你的DAPLINK下载器Port选SWMax Clock我一般设为1MHz稳定优先如果线材比较短、质量好也可以用5MHz或10MHz。这里有个小经验如果点了Settings后识别不到设备先别急着换下载器看看是不是USB没插好或者驱动被禁用了。另外有些精简版的DAPLINK在MDK里识别为“CMSIS-DAP”或“ARM-CMSIS-DAP”名称不同但功能一样。还需要把Flash Download选项卡里的Reset and Run勾上这样烧录完成后芯片会自动复位运行程序不用手动按复位键。接着就可以正常编译了。第一次编译如果报错“Cannot load driver”大概率是下载器驱动没正常加载。去设备管理器确认一下设备状态如果一切正常还报错试试换个USB口尤其是台式机前置USB口经常供电不足导致识别失败我用后面板的USB口基本没出过问题。4.3 编译烧录与串口助手的收发验证编译烧录这一步相对顺利点LOAD按钮DAPLINK的指示灯闪烁然后就提示下载成功。最关键的是烧录完成后打开虚拟串口看现象。这里我写一段简单的测试代码实现“收到什么就回什么”的环回功能来验证串口通路是否正常。在main.c的while循环之前加一个发送字符串的逻辑在stm32f1xx_it.c或main.c里加中断接收回调#include main.h #include stdio.h uint8_t rx_buffer; int fputc(int ch, FILE *f) { HAL_UART_Transmit(huart1, (uint8_t *)ch, 1, 0xFFFF); return ch; } void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart) { if (huart-Instance USART1) { HAL_UART_Transmit(huart1, rx_buffer, 1, 0xFFFF); HAL_UART_Receive_IT(huart1, rx_buffer, 1); } } int main(void) { HAL_Init(); SystemClock_Config(); MX_GPIO_Init(); MX_USART1_UART_Init(); HAL_UART_Receive_IT(huart1, rx_buffer, 1); printf(DAPLINK Virtual COM Test\r\n); while (1) { } }这样重定向了printf到串口同时在接收中断里把收到的字节原样发回去。编译烧录后打开串口助手选择DAPLINK虚拟出来的COM口波特率设为115200。点“打开串口”如果一切正常马上就能收到“DAPLINK Virtual COM Test”这行字符串。然后在发送框里输入任意内容点击发送接收区会出现同样的内容说明虚拟串口的收发都通了。这里有个细节串口助手的波特率必须和CubeMX里配置的波特率一致否则收到的一定是乱码。我在测试时习惯先发一串“0x55”或者字母“U”因为它的二进制是01010101波形稳定看波形更容易判断波特率偏差。5. 常见问题与排查技巧实录5.1 设备管理器识别异常与驱动残留我遇到过的最尴尬的情况是DAPLINK插上去完全没反应设备管理器里连未知设备都不出现。这种情况一般是USB供电或线材问题换一根数据线试试注意有些USB线只能充电不能传数据这个非常坑。我之前就用过一根看似完好的线结果它只有电源线没有数据线。还有一种情况是设备管理器里出现了两个“USB串行设备”但你不知道哪个是DAPLINK的。可以用排除法拔掉DAPLINK看哪个COM号消失那就是它的串口号。或者右键设备属性看位置信息通常能显示出插入的USB口位置。如果你之前装过CH340或其他USB转串口的驱动系统里可能存在驱动残留导致COM号冲突。解决办法是在设备管理器里选择“显示隐藏的设备”把旧设备挨个卸载掉然后重新插拔DAPLINK。Windows会自动重新分配一个可用的COM号。5.2 连接目标芯片后DAP指示灯熄灭怎么办这是搜索热词里提得很多的现象“dap下载器连接上芯片后灯熄灭不连又恢复亮”。我拿这个问题专门分析过基本可以锁定三种原因。第一种是最常见的目标板供电有问题可能短路或者电流过大把DAPLINK的3.3V引脚拉死了。DAPLINK给目标板供电能力有限一旦目标板上有短路下载器就会进入过流保护状态指示灯熄灭。排查方法把DAP和板子之间的3.3V连线断开改用外部电源给板子供电只保留SWDIO、SWCLK、GND三根线。如果灯恢复正常那问题就在板子的供电上。第二种是SWDIO和SWCLK接反了。这两根线颜色接近有时候杜邦线一插就接错了。接反后通讯对不上下载器反复尝试访问芯片可能造成状态异常。用万用表量一下或者重新仔细核对接线。第三种是GND没接好或接触不良。别小看地线SWD调试必须有共地才能工作如果目标板是外部供电而没和DAPLINK共地下载器一接上芯片逻辑电平就乱指示灯也可能受影响。解决办法很简单确保GND线接牢而且最好用独立的一根杜邦线直接连接不要共用一根母对母跳线转好几个弯。5.3 能下载程序但虚拟串口一直没有输出这种情况在带虚拟串口的DAPLINK上比较常见。能下载程序说明SWD调试通道是好的虚拟串口没输出说明串口通路有问题。按照这个思路排查先检查TXD、RXD接线是否交叉接对再检查CubeMX里USART1有没有正确使能然后检查程序里有没有真正执行串口发送函数。我写代码时偷懒直接用HAL_UART_Transmit阻塞发送发送一个长字符串有时候会卡在主循环里虽然不影响收发但实时性很差。后来改用中断方式或DMA方式传输数据效率高很多。如果只是测功能用阻塞发送就够了但要注意不要在一个死循环里反复发送否则发送缓冲区会把CPU卡死。另一个容易忽略的点是“虚拟串口只发不收”。有些DAPLINK固件默认只支持调试下载虚拟串口是单向的或者需要特殊设置才打开。我手里的野火DAP就有一个硬件跳线帽或者固件配置项用来切换串口模式具体要看产品手册。5.4 串口乱码与收发失败的排查串口出现乱码先确认波特率是否一致这是排在第一位的原因。其次是时钟配置不正确如果CubeMX里HCLK配置错误导致USART的波特率计算有偏差收发也会出乱码。尤其是用了内部时钟HSI的时候精度不够长时间通信容易积累误差建议用外部晶振。我实测过如果CubeMX里把HSE设为External Clock Source外部时钟源但板子上没有外部晶振芯片实际跑在内部时钟上造成主频和配置不一致串口波特率就会有较大偏差接收乱码甚至完全不收。这种情况把HSE改为关闭状态或者使用一个真实的外部晶振就好。收发失败还有一种隐蔽原因USART1的PA9、PA10引脚上接了其他外设导致电平被拉低。我试过在PA9上接了一个LED结果串口发送的波形被LED的寄生电容影响高电平上不去接收端全是乱码。拔掉LED后恢复正常。所以排障时要把该引脚的外部负载全部断开用示波器看波形最直观。5.5 常见问题速查表现象可能原因解决方法DAP插上电脑无任何反应USB线只能充电、USB口供电不足换数据线、换后置USB口设备管理器有未知设备或感叹号Windows驱动库不全驱动未正确加载手动更新为“USB串行设备”驱动或系统更新MDK无法连接CMSIS-DAP驱动被禁用、下载器USB识别失败设备管理器启用设备重新插拔DAP连接芯片后灯熄灭目标板短路、供电过载、接线错误独立供电、检查线路、核对SWDIO/SWCLK/GND能下载但不能串口收发TX/RX接反、固件无串口功能交叉接线、使用带串口的DAP固件串口乱码波特率不一致、时钟配置错误、外部负载干扰对照配置、检查晶振、断开引脚负载下载器连接稳定但经常掉线USB供电不足、线材质量差、电磁干扰换短而粗的线、换USB口、远离强干扰源6. 几个实用小建议来自我的实际体会最后分享几个只有亲手折腾过才会注意到的小技巧。第一DAPLINK的虚拟串口和板载CH340完全可以共存你可以在CubeMX里同时开启USART1和USART2把两个串口分别接到不同的调试通道上方便对比调试。第二使用带隔离的DAPLINK下载器在调试电机驱动这类大功率电路时能避免很多共地噪声带来的干扰如果常做电机控制类的项目可以考虑入手一个。第三虚拟串口的COM号是可以固定的。在设备管理器里右键属性端口设置的高级选项里修改COM端口号就能把DAPLINK固定到一个你习惯的COM号省得每次插拔后COM号乱跳。第四如果只是把程序下载到板子里不用在线调试DAPLINK还能用U盘拖拽的方式烧录新版本固件直接二进制文件拖进弹出的U盘就完成下载非常方便。另外再提一句STM32F103C8T6的国产替代型号在市场上很常见引脚和性能基本兼容DAPLINK下载器的使用流程完全一样不用担心芯片换国产就没法用。我自己就屯了一批国产版做批量测试下载调试一切正常。这个方案对我日常开发效率的提升非常明显你不用再为驱动发愁不用再带一堆线材和模块一个DAPLINK全搞定。如果你手里的DAPLINK本身就带虚拟串口功能赶紧按我说的这套流程试一遍把串口调试这块彻底打通后面做项目会顺手很多。