ARTICLE DETAIL

资讯详情

深耕网站视觉设计与运营推广的一线实战洞察。

STM32F103C8T6烧录方式全解析:ST-Link、J-Link与USB转TTL实战指南

STM32F103C8T6烧录方式全解析:ST-Link、J-Link与USB转TTL实战指南 刚接触STM32F103C8T6那会儿我最怕的不是写代码而是把编译好的程序弄进芯片里。Keil里点一下Download弹出来的不是Programming Done而是各种No Target ConnectedCannot Load Flash Programming Algorithm甚至板子直接罢工。后来折腾久了才发现烧录这件事本身不复杂复杂的是你没搞清楚手上这块最小系统板到底该用哪种方式、哪种接线、哪种配置。这篇就把ST-Link、J-Link、USB转TTL三条路一次性讲透从原理到接线到实测踩坑尽量让你少走我当年走过的弯路。1. 先搞明白为什么STM32F103C8T6的烧录方式不止一种1.1 芯片出厂时自带的两种入口STM32F103C8T6这颗芯片内部其实预置了两套独立的程序加载通道这是理解所有烧录方式的前提。第一套是调试接口通道也就是SWD和JTAG。它走的是芯片的调试内核Cortex-M3的Debug Access Port可以直接读写Flash、寄存器、内存还能在线单步调试。ST-Link和J-Link都是走这条路。它的特点是速度快、功能全、可以反复烧录不用改硬件缺点是至少占用2到5个引脚。第二套是系统存储器引导通道也就是常说的ISPIn-System Programming。芯片出厂时在系统存储区固化了一段Bootloader只要把BOOT0拉高、BOOT1拉低复位后芯片就会运行这段Bootloader通过USART1PA9/PA10接收上位机发来的固件。USB转TTL就是走这条路。它的特点是不依赖任何专用调试器一根几块钱的串口模块就能干活缺点是每次烧录要手动拨BOOT跳线、速度慢、不能在线调试。提示很多人以为USB转TTL是串口通信其实烧录时它扮演的是ISP下载器的角色通信协议是STM32自定义的Bootloader协议不是普通串口收发。这一点在排查问题时很关键。1.2 三种方式对应的实际场景我把这三种方式按使用场景做了个简单归类你可以对号入座烧录方式走哪条通道典型场景是否需要跳线能否在线调试ST-LinkSWD日常开发、调试、量产小批量不需要能J-LinkSWD/JTAG多平台开发、需要高级调试功能不需要能USB转TTLISPUSART1手头没调试器、板子已焊死、应急救砖需要不能如果你只是自己玩最小系统板ST-Link是性价比最高的选择十几块钱一个Keil和STM32CubeProgrammer都能直接用。J-Link贵一些但如果你同时玩STM32、GD32、国产替代芯片它的通用性更好。USB转TTL则是兜底方案当你调试器丢了、板子SWD引脚被占用、或者芯片被读保护锁死时它往往能救你一命。1.3 一个容易被忽略的前提BOOT引脚状态不管用哪种方式BOOT0和BOOT1的状态决定了芯片复位后从哪里启动。正常运行时BOOT00芯片从主Flash启动也就是执行你烧进去的程序。用ISP烧录时BOOT0必须拉高接3.3VBOOT1保持低电平接GND复位后芯片才会进入系统存储器运行Bootloader。很多最小系统板已经把BOOT0通过一个跳线帽或者拨码开关引出来了用之前先确认一下。我见过有人USB转TTL死活连不上最后发现是BOOT0没拉高芯片一直在跑原来的程序当然不响应Bootloader。2. ST-Link实战从接线到Keil配置的完整链路2.1 接线SWD四根线别接错ST-Link和STM32F103C8T6之间SWD模式只需要四根线SWDIO→ PA13SWCLK→ PA14GND→ GND3.3V→ 3.3V如果目标板已独立供电这根可以不接但共地必须接这里有个坑市面上有些ST-Link克隆版把引脚丝印标反了或者把SWDIO和SWCLK的位置和原版不一致。我第一次买的一个蓝色小U盘样式的ST-Link丝印上写着SWDIO的那根实际是SWCLK接上去Keil一直报No Target Connected。后来拿万用表量了一下才发现。所以接线前最好用万用表确认一下或者直接看ST-Link外壳上的引脚定义图。另外SWDIO和SWCLK这两根线尽量短最好不超过15厘米。线太长或者用杜邦线随便绕容易出现通信不稳定表现为偶尔能连上、偶尔连不上或者烧录到一半报错。2.2 Keil里的关键配置项接线没问题后打开Keil进入Options for Target → Debug选项卡选择ST-Link Debugger然后点旁边的Settings。在Debug标签页里Port选SWDMax Clock可以先设成1MHz等稳定后再往上调。真正容易出问题的是Flash Download标签页。这里必须确认两件事第一Programming Algorithm里要有STM32F10x Medium-density Flash这一项。如果没有点Add手动添加路径一般在Keil安装目录的ARM/Flash下。选错了算法会导致烧录地址不对程序跑不起来。第二Reset and Run这个勾要打上。它的作用是烧录完成后自动复位并运行程序。如果不勾烧完芯片还停在复位状态你得手动按一下复位键才跑。很多人烧完发现没反应以为是烧录失败其实就是这个勾没打。注意如果你用的是国产替代芯片比如某些兼容F103的型号Flash算法可能不通用。这时候要么换用STM32CubeProgrammer要么找厂商提供的专用算法文件。2.3 实测中遇到的三个典型报错报错一No Target Connected。这个最常见原因无非三种接线错、目标板没供电、SWD引脚被程序占用。第三种特别隐蔽——如果你之前的程序把PA13/PA14配置成了普通GPIO或者复用了其他功能SWD就失效了。解决办法是按住复位键点Keil的Download在松开复位键的瞬间芯片还没运行到占用SWD的代码就能抢连上。或者把BOOT0拉高让芯片从系统存储器启动此时SWD是默认可用的。报错二Cannot Load Flash Programming Algorithm。这个通常是Flash算法没选对或者Keil版本和器件包不匹配。检查Pack Installer里STM32F1系列的DFP包是否安装版本是否和Keil兼容。报错三Flash Download failed - Target DLL has been cancelled。这个多半是ST-Link驱动问题。在设备管理器里看看ST-Link是否被正确识别有时候Windows会自动装一个错误的驱动需要手动更新为ST官方驱动。3. J-Link功能更强但配置门槛也更高3.1 J-Link和ST-Link的本质区别J-Link和ST-Link都走SWD但J-Link的定位更偏专业调试。它支持的芯片范围更广除了STM32还能调GD32、NXP、TI等大量ARM芯片。调试功能上J-Link支持更高速的SWD时钟可以到几十MHz、更丰富的断点类型、RTT实时传输等高级特性。但对于STM32F103C8T6这种基础芯片J-Link和ST-Link在日常烧录上的体验差别不大。如果你手头已经有J-Link直接用就行如果专门为F103买一个ST-Link更划算。3.2 J-Link在Keil中的配置要点在Keil的Debug选项卡里选择J-LINK / J-TRACE Cortex点Settings。Port同样选SWDMax Clock可以设高一些比如4MHz或10MHzJ-Link的驱动能力比ST-Link强长一点的线也能稳住。Flash Download标签页的配置和ST-Link类似选对算法、勾上Reset and Run即可。J-Link有个自己的上位机软件叫J-Flash可以脱离Keil单独烧录。用法是新建工程、选芯片型号、加载hex或bin文件、点Program。J-Flash的好处是支持批量烧录和序列号自动递增做小批量生产时比较方便。3.3 No J-Link Found的排查思路这个报错通常出现在以下几种情况J-Link驱动没装好。去设备管理器看正常应该显示J-Link driver。USB线是充电线没有数据线芯。换一根确认能传数据的线。J-Link固件版本太老和当前Keil或J-Flash不兼容。用J-Link Commander执行固件升级。目标板供电不足。J-Link的3.3V输出电流有限如果目标板上有大功耗外设最好独立供电。还有一个特殊情况某些国产J-Link克隆版在升级固件后会被锁提示J-Link clone之类的信息。这种就只能换正版或者换ST-Link了。4. USB转TTL最土但最能救命的烧录方式4.1 ISP烧录的完整操作流程USB转TTL烧录STM32F103C8T6核心是让芯片进入Bootloader模式然后用上位机软件通过串口发固件。具体步骤如下接线USB转TTL的TX接STM32的PA10USART1_RXRX接PA9USART1_TXGND接GND3.3V接3.3V。注意TX和RX是交叉的不是直连。设置BOOTBOOT0接3.3V高BOOT1接GND低。复位按一下复位键芯片进入系统存储器Bootloader。上位机操作打开STM32CubeProgrammer或者FlyMcu选择串口模式选对COM口波特率一般用115200。加载hex或bin文件点下载。恢复BOOT烧录完成后把BOOT0跳回GND再复位芯片就从主Flash启动运行新程序了。4.2 为什么有时候连不上BootloaderUSB转TTL烧录失败九成以上是以下几个原因串口线接反了。TX接TX、RX接RX是错的必须交叉。这个错误太常见了我每次帮别人排查都先问这个。BOOT0没拉高或者拉高时机不对。必须在复位之前就把BOOT0拉高复位后芯片才会采样BOOT引脚。如果先复位再拉高芯片已经跑起来了不会进Bootloader。串口模块电平不对。有些USB转TTL模块是5V电平的虽然STM32的USART1引脚大部分是5V容忍的但为了稳定最好用3.3V电平的模块或者模块上把跳线设成3.3V。COM口被占用。如果同时开了串口助手和烧录软件两者抢同一个COM口烧录软件会打不开串口。关掉串口助手再试。波特率不匹配。虽然STM32的Bootloader支持自适应波特率但有些廉价串口模块在高波特率下不稳定。可以降到9600试试。4.3 用USB转TTL救砖的真实案例我有一次把STM32F103C8T6的SWD引脚复用成了普通IO结果ST-Link再也连不上Keil一直报No Target Connected。这时候USB转TTL就派上用场了BOOT0拉高、复位、用FlyMcu通过串口擦除整片Flash然后重新烧一个正常的程序进去。整个过程不到两分钟芯片就复活了。还有一种情况是芯片被设置了读保护RDP Level 1SWD能连上但读不了Flash。这时候也可以用ISP方式连接STM32CubeProgrammer会提示是否解除读保护确认后整片擦除芯片恢复出厂状态。提示ISP方式擦除整片Flash会丢失所有数据包括你之前烧的程序。如果芯片里有重要数据操作前先确认能不能通过其他方式读出来。5. 三种方式的速度、稳定性与适用性横向对比5.1 实测烧录速度对比我拿同一个工程大约30KB的hex文件在三种方式下各烧了五次取平均值烧录方式平均耗时连接稳定性是否需要手动复位ST-Link (SWD, 1MHz)约2.5秒很稳不需要J-Link (SWD, 4MHz)约1.8秒很稳不需要USB转TTL (115200)约8秒一般需要速度上J-Link最快ST-Link紧随其后USB转TTL明显慢一截。但说实话对于F103C8T6这种64KB Flash的芯片几秒钟的差距在日常开发中几乎无感。真正影响体验的是连接稳定性和是否需要手动操作。5.2 什么情况下选哪种方式日常开发调试无脑选ST-Link。便宜、稳定、Keil原生支持、能在线调试。一个ST-Link可以用好几年性价比极高。多平台多芯片开发如果手头有J-Link优先用J-Link。它的通用性可以让你一套工具通吃STM32、GD32、国产替代芯片等。应急救砖、SWD被锁USB转TTL是最后的底牌。建议手头常备一个CH340或CP2102的USB转TTL模块几块钱的东西关键时刻能省很多事。量产烧录小批量可以用J-Flash配合J-Link做序列号递增大批量一般用脱机烧录器或者产线专用工具这里不展开。5.3 一个容易被忽视的细节供电方式三种烧录方式都涉及供电问题。ST-Link和J-Link的3.3V输出电流一般在100mA到200mA之间如果目标板上有WS2812灯珠、OLED屏、蜂鸣器这类耗电外设调试器供电可能不够导致烧录过程中电压跌落、芯片复位。这时候最好给目标板独立供电调试器只接SWDIO、SWCLK和GND三根线。USB转TTL模块的3.3V输出电流更小通常只有几十毫安基本只能给最小系统板本身供电。如果板子上有额外外设务必独立供电。6. 烧录之外的几个关键问题6.1 程序烧进去了但跑不起来烧录成功不等于程序能正常运行。常见原因有时钟配置错误比如外部晶振没起振但程序里配置了HSE作为时钟源芯片会卡在时钟初始化。可以先用HSI内部时钟跑一个点灯程序验证。启动文件不匹配Keil工程里选的启动文件startup_stm32f10x_md.s要和芯片密度对应。F103C8T6是中等密度选md结尾的。中断向量表偏移如果用了Bootloader或者IAP主程序的向量表偏移要设置正确否则中断会跳错地址。Flash算法选错前面提过选错算法会导致烧录地址不对。6.2 读保护和写保护的处理STM32F103C8T6支持读保护RDP和写保护WRP。读保护开启后SWD能连上但读不了Flash内容程序也无法通过普通方式读出。写保护则是把某些Flash页设为只读防止误擦写。如果你拿到一块二手板子烧录时报Flash protected之类的错误可以用STM32CubeProgrammer连接后在Option Bytes里把RDP设为Level 0执行后会整片擦除芯片恢复可读写状态。6.3 国产替代芯片的烧录兼容性现在市面上有不少兼容STM32F103C8T6的国产芯片比如GD32、APM32、CW32等。这些芯片在引脚和寄存器层面高度兼容但烧录时可能有细微差别Flash算法可能不通用需要用厂商提供的算法文件。某些芯片的SWD时序略有不同ST-Link可能需要降低时钟。读保护机制可能不一样解除方式有差异。如果你用的是国产替代芯片建议优先用厂商推荐的烧录工具和配置不要直接套用ST的配置。7. 我踩过的几个坑和对应的解决办法7.1 杜邦线接触不良导致的玄学问题早期我用杜邦线接ST-Link经常出现这次能烧下次就连不上的情况。后来发现是杜邦线母头的弹片松了接触电阻变大。换了一批质量好点的杜邦线或者直接焊排针用杜邦线压紧问题就消失了。如果你也遇到时好时坏的情况先别怀疑芯片换线试试。这是成本最低的排查手段。7.2 Keil版本和器件包不匹配有一次换了台电脑装了最新版Keil结果打开旧工程烧录时报Flash Download failed。查了半天发现是新版Keil默认装的STM32F1器件包版本和旧工程不兼容。解决办法是在Pack Installer里卸载新版包装回工程原来用的版本。所以如果你在一个工程上反复烧录没问题换电脑后突然不行了优先检查Keil和器件包版本。7.3 ST-Link固件升级后反而不能用ST-Link的固件有时候需要升级才能支持新芯片但升级后可能和旧版Keil不兼容。我遇到过一次升级后Keil报ST-Link firmware too old明明刚升的级。后来发现是Keil里的ST-Link DLL文件版本太老需要把Keil安装目录下的STLink文件夹里的DLL替换成新版。这种问题比较少见但一旦遇到很折腾。建议非必要不升级ST-Link固件除非你确实需要支持新芯片。7.4 USB转TTL的驱动问题CH340和CP2102是两种最常见的USB转TTL芯片驱动不一样。CH340在Windows 10上一般能自动识别但有些精简版系统会缺驱动需要手动装。CP2102的驱动相对稳定但也要注意版本。如果设备管理器里USB转TTL显示黄色感叹号或者COM口时有时无先解决驱动问题再排查接线和BOOT设置。8. 给不同阶段玩家的选型建议如果你刚开始学STM32F103C8T6我的建议是直接买一个ST-Link配合Keil或者STM32CubeIDE使用。这是最省心的组合接线简单、配置直观、报错信息也相对友好。USB转TTL可以作为一个备用模块放在抽屉里等遇到SWD被锁或者调试器不在手边的情况再拿出来。如果你已经有一定经验手头有J-Link那就继续用J-Link它的通用性和调试能力确实更强。但没必要为了F103专门去买J-LinkST-Link完全够用。如果你在做课程设计或者小项目需要把板子交给别人用可以考虑在板上留出SWD排针和串口排针这样别人用ST-Link或者USB转TTL都能烧录兼容性最好。最后再分享一个小技巧不管用哪种方式烧录第一次拿到新板子时先烧一个最简单的GPIO点灯程序验证整条链路。点灯成功了说明接线、供电、烧录配置都没问题再去跑复杂程序。这样能把问题范围缩小排查起来快很多。
返回列表