资讯动态

STM32串口烧录实战:用FlyMCU脱离ST-LINK下载固件

发布时间:2026/9/24 11:52:01 来源:尧图企业网站定制
做过STM32开发的人基本都遇到过这种场景代码写完了Keil编译零错误、零警告结果插上ST-LINK准备点LOAD下载要么驱动崩了要么下载器坏了要么出差在现场压根没带调试器。以前我也只会傻乎乎地在Keil里点那个下载按钮直到有一次在客户那边靠一个几块钱的USB转TTL模块用FlyMCU把固件灌进板子才算真正理解了串口烧录的含金量。今天这篇教程就是把这条路完整走一遍用FlyMCU通过串口给STM32烧录程序全程不依赖ST-LINK这类调试器。文章最后还会附一份和ST-LINK的全面对比帮你搞清楚日常开发、紧急救砖、批量生产和在线调试这些场景下到底该用谁。先说清楚一个容易混淆的点Keil是编译器它本身不负责烧录真正干活的是Keil里配置的调试器或者烧录工具。ST-LINK只是其中一种而FlyMCU是通过串口直接和STM32芯片内部的Bootloader对话把hex文件写进Flash。这种方式成本低到可以忽略还不吃驱动、不挑环境非常适合作为调试器失灵时的备用方案。1. 串口烧录没你想的那么冷门先搞懂Bootloader在干嘛很多新手第一次听说“串口烧录”时都挺疑惑STM32不是要SWD或者JTAG才能下载程序吗一个串口怎么可能把程序烧进去其实这得从STM32出厂时自带的一段“留守程序”说起。1.1 芯片出厂自带的那段“引导代码”到底干了啥每一颗STM32芯片在出厂时内部都固化了一段只读的引导程序官方叫System Bootloader中文常译作系统引导程序或系统存储器程序。这段程序平时不跑只有芯片满足特定条件才会启动它。它最大的功能就是通过串口、USB、CAN等外设接口接收上位机发来的数据再写入芯片内部的Flash完成程序下载。用生活化一点的话说这就好比每台路由器出厂时都带了一个“恢复模式”。你不需要额外往里面装任何东西只要按住Reset键再接电它就会进入一个特殊的管理界面你可以在里面刷固件、恢复系统。STM32的System Bootloader就是这个“恢复模式”串口就是它的管理通道。我在实际项目里用到它的场景多半是这三种第一手里没有ST-LINK只有一块USB转TTL小板临时要给板子更新程序第二板子上的SWD接口被程序意外改成了普通IO口ST-LINK连不上了需要先用串口把程序擦掉第三批量生产阶段不想每个板子都用昂贵的调试器直接用串口FlyMCU怼上去烧录成本极低。1.2 BOOT0和BOOT1一个跳线帽决定芯片从哪儿启动要让STM32进入这个System Bootloader关键不在软件而在硬件引脚的电平状态。STM32有一个BOOT0引脚和一个BOOT1引脚有些型号叫BOOT1/PH2或者BOOT1/PB2这两个引脚在芯片复位时的电平组合决定了芯片执行的第一段代码来自哪里。三档启动模式的对应关系如下表BOOT0BOOT1启动位置有什么用0任意主Flash正常运行用户程序10系统存储器启动System Bootloader用于串口烧录11内部SRAM调试用程序掉电即失绝大多数开发板上BOOT0都做成了一个跳线帽或者拨码开关你只要在上电复位前把BOOT0拨到1、BOOT1保持0然后复位一下芯片它就会乖乖进入系统存储器开始监听串口数据等待上位机发来固件。这里有一个很常见的翻车点项目里用BOOT0做成了普通IO口来控制某个外设导致芯片每次复位都进入Bootloader程序怎么都跑不起来。我在一个量产项目中就吃过这个亏后来所有涉及BOOT引脚的设计都强制要求预留跳线或者上拉/下拉电阻位绝不能默认悬空。1.3 为什么串口ISP一定要走USART1PA9/PA10STM32的System Bootloader对串口是有要求的。不同型号支持的串口不一样但对绝大多数STM32F1、F4系列来说默认使用的都是USART1对应引脚就是PA9USART1_TX和PA10USART1_RX。有些型号还支持USART2、USART3但最保险、最通用的还是USART1。这就意味着你在板上接串口烧录用的两个引脚必须是PA9和PA10。如果用错串口FlyMCU无论怎么点“开始编程”芯片都不会有任何响应。我见过不少人在自制板子上把串口引到别的USART上结果发现根本没法用FlyMCU烧录最后只能走SWD或者改硬件非常被动。所以做PCB时如果打算预留串口ISP功能老老实实把USART1留出来再配合BOOT0跳线这几乎就是一颗芯片出厂自带的“万能恢复通道”。后面不管程序写崩了、SWD锁死了、还是调试器丢了只要能拉出三根线就能把固件救回来。2. 开工前备料软件、硬件、接线一张表说清楚讲完原理就要动真格了。串口烧录需要的软件和硬件都很简单但每一样都不能少尤其是驱动的坑我后面会专门说。2.1 软件清单FlyMCU、CH340驱动、串口助手一个都不能少首先是最核心的软件FlyMCU。这个软件很多人习惯叫“ISP”全名是FlyMcu免费不用安装解压就能跑官网更新也挺勤快。它的界面是中文的操作逻辑非常直白主要就是选串口、选波特率、选中要烧录的hex文件然后点“开始编程”。第二个是USB转串口芯片的驱动最常见的就是CH340驱动因为市面上大多数廉价USB转TTL模块用的都是CH340芯片。Windows 10和Windows 11通常能自动识别不需要手动装但Windows 7或者精简版系统就要手动安装否则设备管理器里会出现一个带黄色感叹号的“USB-SERIAL CH340”根本没法用。另外如果你用的是CP2102或者FT232芯片的模块就要装对应的驱动不要和CH340驱动混用。第三个是串口调试助手常见的有XCOM、SSCOM之类。它不是烧录必须的但在排查问题时非常有用。比如你怀疑芯片没进入Bootloader可以先用串口助手往USART1发一个0x7F字节这是ST官方Bootloader的同步命令看芯片有没有应答。如果FF回包了说明Bootloader活着问题大概率出在FlyMCU配置上。2.2 硬件清单与接线方式USB转TTL和开发板怎么连硬件方面最舒服的方案是直接用开发板自带的USB转串口。像正点原子、野火这类开发板板载的CH340和USART1之间已经接好了你只需要USB线连电脑、USB线连板子基本就完成了接线。但如果你用的是自制板或者最小系统板就需要独立的USB转TTL模块然后按下面这张表去接线USB转TTL模块STM32最小系统板说明TXDPA10USART1_RX一定要交叉TXD接RXDRXDPA9USART1_TX交叉接线GNDGND必须共地3.3V/5V外部供电或3.3V建议独立供电谨慎处理这里我踩过的坑太多了重点说三条。第一TXD和RXD一定要交叉。USB转TTL的TXD要接到STM32的RXDPA10USB转TTL的RXD要接到STM32的TXDPA9。很多新手按“同名相连”接结果芯片完全没反应还以为是硬件坏了。第二务必共地。如果USB转TTL和板子各用各的电地电位不一致串口通信轻则乱码重则烧芯片。第三电源要谨慎。如果板子本身已经用其他方式供电USB转TTL就不要接VCC线出来只接TXD、RXD、GND三条线就够了。如果一定要用USB转TTL给板子供电先确认模块上有没有3.3V输出有些模块的VCC是5V直接把STM32的3.3V引脚烧掉的就是这个原因。2.3 Keil里先做好一件事把hex文件生成出来FlyMCU烧录的是hex文件不是Keil默认编译出来的axf文件。如果你没做过设置Keil编译完成后并不会生成hex。菜单栏打开Options for Target切到Output选项卡勾选Create HEX File然后重新编译一次keil就会在工程的Objects目录下生成一个后缀为.hex的文件。这个文件才是FlyMCU要用的固件。我个人的习惯是编译完顺手看一眼输出窗口里的信息比如“Program Size: Code… RO-data… RW-data… ZI-data…”确认编译成功之后再去翻hex文件。如果勾选了Create HEX File但没生成多半是编译不通过或者编译的还是旧工程。3. FlyMCU完整烧录流程从新建工程到最后跑起来的实操记录所有材料备齐之后烧录本身其实只要几分钟。但为了让新手少走弯路我把每一步操作和背后的原因都拆开讲顺便记录一下实操现场的完整流程。3.1 第一步确认驱动和COM口号别连错口USB转TTL模块插到电脑后打开设备管理器找到“端口(COM和LPT)”确认里面出现了对应的COM口。CH340常见的显示是“USB-SERIAL CH340 (COM3)”CP2102常见的显示是“CP2102 USB to UART Bridge Controller (COM4)”FT232则是“USB Serial Port (COM5)”。这一步非常关键因为很多电脑同时插着蓝牙模块、GPS模块、其他调试器COM口一大堆选错口的话FlyMCU会一直卡在“连接中”。我见过有人试了半天最后发现FlyMCU里选的是USB-TTL的COM口而USB-TTL根本没插真正的板子插在另一个COM口上这种低级错误很搞人心态。3.2 第二步设置BOOT0让芯片进入系统存储器接线完成后先把板子断电。然后把BOOT0跳线帽从0拨到1BOOT1保持0再重新上电。如果是开发板上的拨码开关通常ON对应1OFF对应0具体看板子丝印。上电之后芯片不会立刻跑你的程序而是进入System Bootloader等待串口数据。这个状态不会持续太久Bootloader会自动判断有没有收到合法的同步命令如果没有它最终会跳转到主Flash执行用户程序。所以实操时的标准操作是先把BOOT0拨到1再按一下复位键然后在几秒内点FlyMCU的“开始编程”。如果操作太慢Bootloader超时跳走了FlyMCU就会提示连接失败。3.3 第三步FlyMCU界面配置里最容易出错的两个选项打开FlyMCU后先确认左上角的串口下拉框选的是刚才查到的COM口。然后是波特率选项我建议直接选115200这个值在绝大多数场景下都很稳。如果你用的是老芯片或者劣质晶振、长杜邦线115200有可能失败那就降到38400基本能解决九成问题。460800这些高速档位实用性不高除非你的线材质量很好、板子供电很稳否则不建议拿来烧录大固件。接下来是那两个让无数新手摸不着头脑的选项“DTR的低电平复位RTS高电平进BootLoader”和“DTR的高电平复位RTS低电平进BootLoader”。这两个选项是针对开发板上一键下载电路设计的。这类电路通常用CH340的DTR和RTS信号去控制STM32的复位脚和BOOT0脚实现点击“开始编程”时自动复位、自动进入Bootloader的效果。如果你的板子是正点原子、野火这类带一键下载电路的选哪一个取决于板子的三极管接法用默认的“DTR的低电平复位RTS高电平进BootLoader”通常没问题如果没反应就换另一个选项再试。但如果你用的是自制板、USB转TTL直连PA9/PA10或者最小系统板上没有一键下载电路这两个选项勾不勾其实无所谓勾了反而可能因为电平变化干扰复位。最安全的方法是取消勾选然后在点“开始编程”的同时手动按一下板子的复位键FlyMCU就会立刻抓到芯片。这个细节我在很多教程里都没见过但实操特别管用。3.4 第四步选择hex文件并开始编程烧完之后的复位操作在FlyMCU的界面里找到“选择文件”或者“搜索”按钮选中Keil生成的hex文件。然后点击“开始编程”有些版本叫“开始ISP”软件会通过串口向芯片发送同步握手、擦除Flash、写入Flash、校验这一系列指令。整个过程快的话几秒钟大固件可能要几十秒。界面上会滚动输出一堆提示比如“连接成功”“正在擦除”“正在编程”“正在校验”“编程完成”之类。烧录成功之后务必断电把BOOT0跳线帽拨回0然后重新上电或者按一下复位键。这一步千万不能忘否则芯片每次复位都会再进Bootloader你的程序根本不会运行。很多新手烧录提示成功了但板子一点反应都没有十有八九就是BOOT0没拨回来。3.5 烧录验证怎么看程序是真的跑起来了程序跑没跑最简单的判断方式就是看现象。如果是LED闪烁程序看灯亮不亮如果是串口打印程序打开串口助手选对应COM口波特率调到和你程序里初始化的一致正常情况下能收到printf或者串口发送的内容。这里补充一个更硬核的验证方法在FlyMCU里可以点击“读设备信息”或者“读Flash”如果软件能正常读出芯片型号、Flash容量、UID等信息说明芯片和上位机的连接是通的Bootloader也活着。如果只显示“连接中”或者“写入超时”那就说明前面某个环节出了问题可以对照下一章的排查清单逐项检查。4. 串口ISP对比ST-LINK什么时候用谁心里要有数很多人一看到“别再只会用Keil”这个标题就以为是要抛弃ST-LINK。其实不是我只是希望大家多掌握一种手段。ST-LINK和串口ISP各有各的主场下面这份对比能帮你快速判断自己现在这个场景该用谁。4.1 参数对照成本、速度、功能、适用场景一览对比项串口ISPFlyMCU USB转TTLST-LINKSWD模式硬件成本几块钱到十几块钱几十到几百原装更贵驱动复杂度CH340驱动装机率高需装ST-LINK驱动或Keil自带下载速度115200波特率下约10KB/s级别SWD最高能到几MB/s大固件优势明显BOOT0操作需要手动拨BOOT0不需要SWD直接控制芯片在线调试不支持烧完只能看现象支持断点、单步、变量监视、寄存器查看擦除/读保护处理有限受Bootloader功能限制支持更全面的Flash操作和整片擦除额外功能读UID、读设备信息、设置某些选项字节支持Keil一站式下载调试、RTT日志等适合场景应急救砖、低成本量产、现场无调试器日常开发调试、复杂问题定位这张表不是说谁碾压谁而是让你在正确的时间拿正确的工具。日常开发阶段我强烈建议用ST-LINK因为在线调试查问题实在太重要了尤其是指针异常、栈溢出、外设初始化失败这类问题光靠看现象猜效率太低。4.2 ST-LINK能做到但串口做不了的事在线调试是串口ISP永远无法替代的。STM32程序跑飞了最痛苦的莫过于不知道它飞到哪了。用ST-LINK在Keil里打断点、看Watch窗口、单步执行甚至看某个外设寄存器的当前值基本能一路追到崩溃现场。串口烧录只能把程序写进Flash至于程序运行到哪一步、某个变量的值是多少完全黑盒。另一个区别是速度。STM32F4的固件动辄几百KB串口115200波特率的实际传数率大概在10KB/s左右几百KB的固件要烧很久而且中间一旦串口通信出错就前功尽弃。SWD模式下几MB/s的下载速度体感完全不是一个量级。所以如果你的固件很大、迭代很频繁一定优先用ST-LINK串口烧录更适合应急和小批量场景。还有一点SWD接口不占用用户的串口外设因为SWD用的是PA13/PA14这两个调试引脚。而串口ISP用的是USART1如果你的程序正好也需要USART1那ISP下载时可能会有干扰虽然烧录完成重启后不影响使用但下载期间程序跑起来也会占着这个串口。调试时就需要取舍。4.3 串口烧录反而更香的几种场景场景一现场救砖。我在客户现场遇到过一次很典型的救援设备运行中程序跑飞然后客户关电重启结果启动自检一直过不去因为程序本身有bug。现场没有ST-LINK只有一个USB转TTL模块和一台普通笔记本。我用FlyMCU把改进后的固件重新烧进去几分钟就解决了问题。这种场景下ST-LINK反而没有串口方便因为不是每个人都会随身带调试器但USB转TTL线材很容易找到。场景二低成本量产。几十块板子同时烧录如果每块都用ST-LINK要么买几十个下载器要么一块一块拔插效率很低。串口ISP的方案是准备几根便宜的USB转TTL线或者直接用USB HUB扩展出多个COM口配合FlyMCU批量烧录成本低到可以忽略。很多做小批量产品的公司生产线上就是这么干的。场景三芯片SWD被锁死。程序里如果不小心把SWD引脚配置成普通IO或者开了读保护且忘了密码ST-LINK可能连不上芯片。但如果你预留了BOOT0跳线让芯片进入System Bootloader很多时候还能通过串口把Flash擦掉恢复SWD接口。这算是串口ISP最救命的一个用途。5. 踩坑实录串口烧录最常见的问题与解法速查最后这部分我把这几年用FlyMCU串口烧录遇到的高频问题整理成了一份速查表。如果你按照前面的步骤操作后依然失败按表逐一排查大概率能找到原因。5.1 “一直在连接”与“No response”九成是这三个原因FlyMCU最常见的故障现象就是点“开始编程”后一直显示“连接中”或者直接提示“No response from the device”。据我观察九成以上是下面三个原因之一。第一接线错误尤其是TXD和RXD没交叉。我在前文里已经反复强调过TX对RX、RX对TXUSB转TTL的TXD必须接PA10RXD必须接PA9串口助手调试时也一样千万别同名直连。第二BOOT0没在复位前设置成1。很多人是板子已经跑起来了才去拨BOOT0拨完不按复位那芯片当然不会进Bootloader。第三COM口选错了或者根本没共地。设备管理器里看到的COM口和你FlyMCU里选的不一致也会一直卡在连接中。如果这三个都没问题那就要怀疑是不是芯片的晶振问题。STM32的System Bootloader在生成串口波特率时依赖于外部高速晶振HSE最小系统板上如果省略了8MHz晶振串口ISP基本没法工作。我遇到过最小系统板因为晶振虚焊导致完全无法串口下载的情况换一块板子立刻就好。所以如果你用自制板遇到连接不上先量一下晶振是否起振。5.2 下载成功但程序没运行BOOT0忘了拨回来烧录提示成功但板子没有任何反应这也是高频问题。绝大多数情况是BOOT0还拨在1的位置芯片每次上电都进System Bootloader根本不执行Flash里的用户程序。解决方法是断电把BOOT0拨回0重新上电。还有一种情况是BOOT1引脚悬空或者电平不对导致芯片进入了SRAM启动模式。SRAM启动模式下芯片既不会跑Flash程序也不会进System Bootloader程序里所有的初始化都起不来。这时候把BOOT1正确接地0电平BOOT0拨回0就能恢复正常。很多STM32最小系统板BOOT1引脚默认有下拉电阻但如果自制板没拉悬空状态就会出问题。5.3 校验失败和写入超时把波特率降下来再说如果FlyMCU烧录过程中前面的握手成功了但到“擦除”或者“编程”阶段出现“校验失败”“写入超时”多半是波特率设置过高或者通信链路不稳定。我建议先把波特率从115200降到38400并且把杜邦线的长度控制在10厘米以内尽量用短而粗的线。我用长杜邦线接过一次大约20厘米115200波特率下烧录偶尔失败换到38400之后一次通过。另外供电稳定性也很重要如果板子用的是USB转TTL模块上的3.3V供电而这个模块本身又插在电脑前面板USB口上电压波动会导致烧录失败。换到主板后置USB口或者外接稳压电源问题往往迎刃而解。5.4 关于选项字节和读保护的一点点提醒FlyMCU里有一个“选项字节”区域可以设置读保护RDP、写保护WRP、硬件看门狗配置等内容。这个功能很强但也很危险。如果你不小心把RDP设置为最高级别Level 2芯片会永久锁死连ST-LINK都无法再连接整颗芯片直接报废。所以除非你非常明确自己在做什么否则不要去动选项字节。如果只是误设了Level 1读保护ST-LINK通常还能通过整片擦除来解除串口ISP能不能解除则取决于Bootloader的具体实现不同型号表现不一样不要抱太大希望。我个人的建议是量产阶段如果不开读保护那就坚持不开如果要开先在开发板上验证好解锁流程千万别拿没有备份的样机去试。写在最后的一点经验折腾串口烧录这几年我最大的体会是工具不在多而在于你紧急时候有没有备选方案。ST-LINK好用但你不能指望它在任何场合都陪着你。FlyMCU和USB转TTL虽然看着“寒酸”却是真正能在关键时刻救场的组合。我现在画PCB只要是STM32相关的板子都会习惯性预留USART1串口和BOOT0跳线的ISP接口成本几乎为零却等于给产品留了一条人工呼吸通道。如果你打算长期和STM32打交道建议你也把串口ISP这套流程练熟然后放心大胆地在Keil里点LOAD用ST-LINK做深度调试让串口烧录安安静静当那个“永远在线”的备胎。

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价