资讯详情

资讯详情

立创EDA实战:从零设计一块STM32调试器ST-Link V2.1

ST-Link V2.1 这个调试器玩 STM32 的人几乎人手一个。但市面上卖的成品要么是山寨芯片烧录不稳定要么是固件版本太老不认新片子要么就是驱动装半天装不上。我自己前后折腾过五六个不同版本最后决定干脆用立创EDA自己画一块从原理图到PCB再到固件烧录全部走一遍。这篇文章就把整个流程拆开讲清楚包括为什么选 STM32F103CBT6 这颗主控、立创EDA画板时的几个关键设置、固件怎么烧进去、以及烧完之后怎么验证它真的能用。适合有基本电路基础、想自己动手做一块靠谱调试器的朋友也适合单纯想学立创EDA完整项目流程的人。1. 为什么值得自己画一块 ST-Link V2.11.1 成品调试器的几个现实问题先说清楚为什么要自己画。市面上常见的 ST-Link V2 迷你版价格从十几块到几十块不等但拆开看里面用的主控五花八门。有些用的是正版 STM32F103C8T6有些用的是国产替代芯片甚至还有用打磨片重新丝印的。这些芯片在烧录小容量 STM32 时可能没问题但一旦遇到大容量片子或者需要高速下载的场景就容易出现校验失败、连接中断的情况。另一个问题是固件版本。ST-Link 的固件是分版本的V2.J16.S4、V2.J27.S6、V2.J37.S7 等等不同版本支持的芯片系列不一样。老固件可能不认 STM32H7、STM32G0 这些新系列而升级固件又需要先能连上调试器这就成了一个死循环。自己画板子的话主控和固件版本完全可控想刷哪个版本就刷哪个版本。还有一个容易被忽略的点是接口。成品迷你版通常只引出 SWD 的四根线3.3V、GND、SWDIO、SWCLK没有 SWO 单线输出也没有虚拟串口。而 ST-Link V2.1 相比 V2 最大的升级就是增加了虚拟串口功能和 SWO 支持调试的时候能直接通过同一个 USB 口看串口打印省掉一个 USB 转 TTL 模块。1.2 ST-Link V2.1 相比 V2 到底多了什么ST-Link V2.1 和 V2 的核心区别在于固件和硬件设计。V2.1 的固件支持虚拟串口VCP也就是说调试器插上电脑后会同时枚举出一个调试接口和一个串口。这个串口是连接到目标板的 UART 上的你在代码里用 printf 重定向到 UART就能直接在电脑上看到输出不需要额外接串口模块。另外 V2.1 支持 SWOSingle Wire Output这是 Cortex-M 内核的调试输出通道可以输出 ITM 数据。配合 IDE 的 SWO Viewer能看到程序运行时的变量值、事件跟踪信息对排查时序问题很有帮助。V2 标准版是不支持这些的虽然有些 V2 刷了 V2.1 的固件也能用部分功能但硬件上缺少必要的引脚连接稳定性没保证。自己画板子的话我建议直接按 V2.1 的标准设计把虚拟串口和 SWO 都引出来。多花不了几毛钱但调试体验提升明显。1.3 立创EDA在这个项目里的实际优势选立创EDA不是因为它是免费的而是因为它的元件库和嘉立创的制造流程打通了。画完原理图之后可以直接在立创EDA里选元件、下单打板元件封装和实际物料是对应的不会出现封装画错导致焊不上的情况。立创EDA专业版相比标准版在多层板设计和布线规则上更灵活。这个项目用两层板就够了但专业版的差分对、等长布线、铺铜管理这些功能在画 USB 差分线和电源走线时会更顺手。另外专业版支持导出位号图、坐标文件方便后续贴片或者手工焊接时对照。还有一个实际的好处是立创EDA的社区里有大量开源项目可以参考。搜 ST-Link 相关的项目能看到别人画的原理图和PCB虽然不能直接照抄但可以对照检查自己的设计有没有遗漏。这种社区生态对新手来说很友好。2. 主控选型与核心电路设计思路2.1 为什么是 STM32F103CBT6 而不是 C8T6ST-Link V2.1 的官方固件对主控有要求需要至少 128KB Flash 和 20KB RAM。STM32F103C8T6 只有 64KB Flash 和 20KB RAM刷 V2.1 固件会提示空间不足。CBT6 是 128KB Flash、20KB RAM刚好满足要求。这是最直接的原因。另一个原因是引脚数量。CBT6 是 LQFP48 封装比 C8T6 的 LQFP48 多出来的引脚主要是多了 Flash 和 RAM 的地址线实际可用 GPIO 是一样的。但 CBT6 的 Flash 更大固件升级时不用担心空间不够。价格上 CBT6 比 C8T6 贵一两块钱但为了稳定性和后续升级空间这个差价值得花。还有一个隐藏的好处是CBT6 的芯片 ID 和 C8T6 不同有些烧录工具会检查芯片型号用 CBT6 可以避免被误判为山寨芯片。虽然这不是主要考虑因素但实际使用中确实少了一些麻烦。2.2 最小系统电路的关键细节最小系统包括电源、晶振、复位、启动模式、调试接口这几个部分。电源部分USB 输入是 5VSTM32 需要 3.3V所以要用 LDO 降压。我选的是 RT9013-33SOT-23-5 封装输出电流 500mA够用了。输入输出各放一个 10uF 和一个 100nF 电容10uF 负责储能100nF 负责高频滤波。晶振部分STM32F103 外部高速晶振推荐 8MHz配合内部 PLL 倍频到 72MHz。晶振两端各接一个 20pF 的负载电容这个值不是随便选的要根据晶振的负载电容参数来算。一般晶振的负载电容是 12.5pF 或 20pF加上 PCB 走线的寄生电容大概 3-5pF所以实际用的电容值要比负载电容小一些。我用的是 20pF实测起振正常。复位电路标准的是 10K 上拉电阻加 100nF 电容再加一个复位按键。这里有个细节ST-Link 固件里对复位引脚有特殊处理如果复位电路设计不当可能会导致调试器无法被电脑识别。我建议严格按照官方参考设计来不要随意改动。启动模式BOOT0 通过 10K 电阻下拉到地BOOT1 不用管默认就是主 Flash 启动。调试接口SWD 的四根线要引出来同时把虚拟串口的 TX、RX 也引出来还有 SWO 引脚。2.3 USB 接口与虚拟串口的硬件连接USB 接口用的是 Type-C虽然 ST-Link 官方用的是 Mini USB但 Type-C 更通用现在电脑上 Mini USB 口越来越少。Type-C 座子选 16Pin 的只用到 USB 2.0 的 D、D-、VBUS、GND 这四根。CC1 和 CC2 各接一个 5.1K 电阻下拉到地这是 Type-C 作为设备端的标准做法。USB 差分线 D 和 D- 要走 90 欧姆差分阻抗在立创EDA专业版里可以设置差分对规则。两层板的话差分线走顶层底层铺地线宽和间距根据板厚和介质常数来算。我用的是 1.6mm 板厚FR4 材质差分线宽 0.2mm间距 0.15mm实测阻抗接近 90 欧姆。虚拟串口的连接方式STM32F103 的 USB 外设和 UART 是分开的。USB 的 D、D- 接 PA12 和 PA11UART 的 TX、RX 接 PA9 和 PA10。固件里会把 UART 的数据通过 USB 虚拟串口转发出去。硬件上不需要额外芯片直接连到主控就行。这里有个容易踩的坑USB 的 D 需要上拉电阻才能被电脑识别为全速设备。STM32F103 内部有上拉电阻但需要在固件里使能。如果硬件上再外接一个 1.5K 上拉电阻到 3.3V可能会和内部上拉冲突。我建议不接外部上拉靠固件控制。3. 立创EDA原理图绘制与PCB布线实操3.1 原理图阶段的元件选型与封装确认在立创EDA里画原理图第一步是找元件。立创EDA的元件库分两种一种是系统库一种是用户库。系统库里的元件大部分有对应的嘉立创库存可以直接下单。搜 STM32F103CBT6选 LQFP48 封装的注意看引脚间距是 0.5mm这个在焊接时比较考验手艺。电阻电容选 0603 或 0805 封装0603 更省空间但手工焊接难度大一些0805 更容易焊。我选的是 0805因为板子空间够没必要为难自己。LDO 选 SOT-23-5 封装晶振选 5032 贴片封装Type-C 座子选 16Pin 沉板式。每个元件都要确认封装和实际物料一致。立创EDA里有个功能叫“元件属性”可以看到封装名称和嘉立创编号。下单前一定要核对一遍特别是 Type-C 座子不同厂家的引脚定义可能不一样选错了会导致 D、D- 接反。原理图画完之后用立创EDA的“设计管理器”检查一遍网络连接。重点看电源网络有没有短路SWD 接口的线序对不对USB 差分线有没有接反。这个检查步骤不能省我见过有人画完直接打板结果 USB 的 D、D- 接反了板子回来只能飞线。3.2 PCB布局的优先级与关键区域划分PCB 布局我一般按功能分区电源区、主控区、USB 接口区、调试接口区。电源区放在板子一角LDO 和滤波电容靠近 USB 接口减少 5V 走线长度。主控放中间晶振尽量靠近主控的 OSC_IN 和 OSC_OUT 引脚走线越短越好。USB 接口区放在板子边缘方便插拔。差分线从 Type-C 座子出来直接走到主控的 PA11、PA12中间不要打过孔如果必须打孔两个过孔要对称放置。调试接口区放在板子另一侧SWD 的四根线和虚拟串口的 TX、RX 引到排针上。晶振下面不要走任何信号线包括电源线。晶振是敏感器件周围的寄生电容会影响起振频率。我在晶振下面铺了一块地铜并且打了几个过孔到主地平面起到屏蔽作用。复位按键放在板子边缘方便按到。BOOT0 的跳线帽或者电阻放在主控附近不占太多空间。整个板子尺寸我控制在 45mm x 25mm和市面上的迷你版差不多大。3.3 布线规则设置与星型接地的实际处理立创EDA专业版的布线规则设置里线宽我设了三档信号线 0.2mm电源线 0.5mm地线铺铜。过孔尺寸外径 0.6mm内径 0.3mm。差分对规则里D 和 D- 设为一组线宽 0.2mm间距 0.15mm最大长度差 5mil。星型接地这个说法在两层板里其实很难严格实现因为只有一个地平面。我的做法是底层整片铺地顶层在关键区域铺地比如晶振周围、LDO 周围。数字地和模拟地不分开因为 STM32F103 的模拟部分只有 ADC这个项目不用 ADC所以没必要分。电源走线从 LDO 输出出来之后先经过一个 10uF 电容再分两路一路去主控的 VDD 引脚一路去 USB 接口的 3.3V。每路走线尽量短线宽 0.5mm。主控的每个 VDD 引脚旁边放一个 100nF 电容这个电容要尽量靠近引脚走线先过电容再到引脚。铺铜的时候底层整片铺地顶层在空白区域铺地。铺铜和走线之间的间距设 0.3mm避免短路。铺铜完成后用立创EDA的“设计规则检查”跑一遍看有没有未连接的网络、间距违规、短路等问题。3.4 丝印标注与位号图导出丝印标注很重要特别是调试接口的引脚定义。我在排针旁边标了“3.3V”、“GND”、“SWDIO”、“SWCLK”、“TX”、“RX”、“SWO”这样焊接和使用时不会搞错。板子背面标了版本号和日期方便后续迭代。位号图导出立创EDA专业版里在“制造”菜单下有“导出位号图”选项可以导出 PDF 或图片格式。位号图上会显示每个元件的位置和编号手工焊接时对照着看很方便。坐标文件也一起导出如果后续要贴片直接发给工厂就行。导出之前检查一遍所有元件的位号有没有重复有没有漏标。我遇到过位号重复的情况两个电阻都叫 R1结果焊接时不知道该焊哪个。立创EDA有自动编号功能画完原理图之后点一下“重新编号”所有位号会自动更新。4. 固件烧录的完整流程与工具链4.1 烧录前的硬件准备与连接方式板子焊好之后先别急着上电。用万用表测一下 3.3V 和 GND 之间的电阻正常应该在几百欧姆以上如果接近零说明有短路。测完再上电上电后测 3.3V 输出是否正常LDO 有没有发烫。烧录固件需要用到另一个调试器比如你手头现有的 ST-Link 或者 J-Link。把新板子的 SWD 接口和调试器连起来3.3V 对 3.3VGND 对 GNDSWDIO 对 SWDIOSWCLK 对 SWCLK。注意不要接反接反了可能烧坏芯片。新板子上的 STM32F103CBT6 是空片可以直接通过 SWD 烧录。如果芯片里已经有程序可能需要先擦除。STM32CubeProgrammer 里可以选“Full chip erase”把整个 Flash 擦干净再烧。4.2 使用 STM32CubeProgrammer 烧录固件的步骤STM32CubeProgrammer 是 ST 官方的烧录工具支持 ST-Link、UART、USB DFU 等多种方式。打开软件选择 ST-Link 模式点“Connect”如果能连上会显示芯片型号和 Flash 大小。连上之后点“Erasing Programming”选择固件文件。ST-Link V2.1 的固件文件通常是 .bin 或 .hex 格式在开源社区能找到。选好文件后设置起始地址.bin 文件一般从 0x08000000 开始.hex 文件会自动识别地址。点“Start Programming”等待烧录完成。烧录过程中不要断电不要拔线。烧完之后点“Disconnect”然后拔掉调试器重新插上 USB 线。这时候电脑应该能识别到一个 ST-Link 调试器和一个虚拟串口。如果电脑没识别到先检查 USB 线是不是数据线有些线只能充电再检查驱动有没有装。Windows 10 以上系统一般会自动装驱动如果没装去 ST 官网下载 ST-Link 驱动手动安装。4.3 固件版本选择与升级注意事项ST-Link V2.1 的固件版本有很多常见的有 V2.J27.S6、V2.J37.S7、V2.J40.S7 等。版本号里的 J 代表 JTAG/SWD 固件版本S 代表 SWIM 固件版本用于 STM8。选版本的时候不是越新越好要看你的使用场景。如果你主要调试 STM32F1、F4 这些老系列V2.J27.S6 就够用了稳定性好。如果要调试 STM32H7、G0、G4 这些新系列建议用 V2.J37.S7 或更高版本。版本太老可能不认新芯片版本太新可能对老芯片的兼容性有细微变化。升级固件的时候如果当前固件还能连上可以直接用 ST-Link Upgrade 工具升级。如果连不上需要用 STM32CubeProgrammer 通过 SWD 接口强制烧录。强制烧录时把 BOOT0 接高电平让芯片从系统存储器启动然后通过 UART 烧录。不过 STM32F103 的系统存储器启动方式比较麻烦我一般直接用 SWD 强制烧。4.4 烧录后的功能验证与常见问题排查烧录完成后插上电脑打开设备管理器应该能看到“STMicroelectronics STLink dongle”和“STMicroelectronics STLink Virtual COM Port”两个设备。如果只看到一个说明虚拟串口没枚举出来可能是固件版本不对或者 USB 差分线有问题。验证调试功能打开 STM32CubeIDE 或者 Keil新建一个工程选 ST-Link 调试器点“Debug”如果能进入调试界面说明 SWD 通信正常。验证虚拟串口用串口助手打开对应的 COM 口波特率设 115200短接目标板的 TX 和 RX发送数据看能不能回显。常见问题排查如果电脑完全不识别先换 USB 线再换电脑 USB 口再检查 Type-C 座子有没有虚焊。如果识别到但连不上芯片检查 SWD 线序检查目标板有没有供电。如果虚拟串口打不开检查固件版本V2.J27.S6 之后的版本才支持虚拟串口。5. 实际使用中的经验与避坑记录5.1 焊接环节最容易出问题的几个位置LQFP48 封装的芯片引脚间距 0.5mm手工焊接容易连锡。我的做法是先用助焊剂涂一遍引脚然后用刀头烙铁加锡拖焊最后用吸锡线把多余的锡吸掉。焊完之后用放大镜看一遍有连锡的地方用吸锡线处理干净。Type-C 座子的引脚比较密而且沉板式的座子焊接时容易歪。我建议先用胶带固定座子焊两个对角引脚定位确认位置正了再焊其他引脚。焊完之后用万用表测一下 VBUS、GND、D、D- 有没有短路。晶振是 5032 贴片封装四个焊盘。焊接时注意方向有标记的一角对应 PCB 上的标记。晶振焊歪了会影响起振焊完之后测一下 OSC_IN 和 OSC_OUT 对地的电阻正常应该是无穷大。5.2 驱动安装与电脑识别的疑难杂症Windows 系统下ST-Link 的驱动有时候会装错版本。如果设备管理器里显示的是“未知设备”或者带黄色感叹号右键更新驱动手动选择 ST-Link 的驱动目录。如果还是不行卸载设备拔掉 USB重新插上让系统重新识别。有些电脑的 USB 口供电不足会导致 ST-Link 识别不稳定。换一个 USB 口最好是用主板后面的 USB 口不要用前面板或者 USB Hub。如果用的是笔记本插上电源再试。虚拟串口的 COM 口号有时候会变特别是插拔多次之后。在设备管理器里可以手动指定 COM 口号避免每次都要改串口助手的设置。指定之后只要插在同一个 USB 口COM 口号就不会变。5.3 调试大容量芯片时的稳定性优化调试 STM32H7、STM32F7 这些大容量芯片时SWD 速率不能设太高。STM32CubeIDE 里默认的 SWD 速率是 4MHz如果连接不稳定降到 1MHz 或 500KHz。速率降低之后下载速度会慢一些但稳定性提升明显。如果目标板是独立供电的ST-Link 的 3.3V 不要接只接 GND、SWDIO、SWCLK 三根线。这样避免两个电源冲突。如果目标板需要 ST-Link 供电注意 ST-Link 的 3.3V 输出电流有限大概 100mA 左右带不动大功率外设。长距离调试时SWD 线不要超过 20cm而且要用杜邦线或者排线不要用单根飞线。线太长或者太细信号质量下降容易出现连接中断。如果必须长距离考虑用带屏蔽的排线或者降低 SWD 速率。5.4 固件升级失败后的恢复方法固件升级失败是常见问题特别是用非官方工具升级的时候。如果升级失败导致 ST-Link 无法识别不要慌STM32F103 有系统存储器启动模式可以通过 UART 强制烧录。具体操作把 BOOT0 接高电平BOOT1 接低电平重新上电。这时候芯片从系统存储器启动内置的 Bootloader 会等待 UART 命令。用 STM32CubeProgrammer 的 UART 模式选对 COM 口波特率 115200点连接如果能连上就可以重新烧录固件。如果 UART 也连不上检查 BOOT0 有没有真的接高检查 UART 的 TX、RX 有没有接反。STM32F103 的 UART1 是 PA9TX和 PA10RX连接时电脑的 TX 接板子的 RX电脑的 RX 接板子的 TX。还有一种情况是芯片被读保护了SWD 连不上。这时候需要用 STM32CubeProgrammer 的“Option Bytes”功能解除读保护。解除读保护会擦除整个 Flash所以固件需要重新烧录。6. 从这块板子延伸出去的一些想法这块 ST-Link V2.1 调试器做完之后其实可以作为一个基础平台延伸出不少东西。比如把虚拟串口的 TX、RX 引出来之后可以直接当 USB 转 TTL 用省掉一个模块。SWO 引出来之后配合 IDE 的 SWO Viewer能看到程序运行时的实时数据。如果想做脱机烧录器可以在这块板子的基础上加一个 SD 卡座把固件放在 SD 卡里通过按键触发烧录。STM32F103CBT6 的 Flash 是 128KB放一个 Bootloader 加一个简单的文件系统够用了。不过脱机烧录涉及到目标板的电源控制需要加一个 MOS 管或者负载开关。另一个方向是做多路调试器一块板子上放两个 STM32F103分别做两个独立的 ST-Link通过 USB Hub 连接到电脑。这样调试双核系统或者同时调试两块板子的时候很方便。不过 USB Hub 的电路要额外设计而且两个 ST-Link 的固件要分别烧录稍微麻烦一些。我个人在实际操作中的体会是自己画调试器这件事最大的价值不是省了那几十块钱而是对整个调试链路有了完整的理解。从 USB 枚举到 SWD 时序从固件烧录到驱动安装每个环节都亲手走过一遍之后再遇到调试问题排查起来会快很多。这块板子我前后打了三版第一版 USB 差分线没走好第二版晶振布局有问题第三版才稳定。每次改版都是一次学习比看十篇教程都管用。
觉得有用,分享给同行:

为您的企业打造数字门面

稳重轻奢商务风格,端正雅致视觉,长效耐看不易过时。

立即咨询 →