ARTICLE DETAIL

资讯详情

深耕编程入门与网站建设的一线实战洞察。

STM32串口烧录完全指南:不用仿真器,FlyMCU+USB转TTL也能玩转

STM32串口烧录完全指南:不用仿真器,FlyMCU+USB转TTL也能玩转 1. 为什么需要串口烧录Keil之外的另一个入口1.1 你以为烧录程序只能靠仿真器先说个我自己的经历。前几年给客户做一批设备板子已经贴好片、焊好程序下载口了结果现场才发现固件要更新。手头没有ST-LINK只有一台笔记本和一根USB转TTL线。当时心里第一反应是“完了这活干不了了”但冷静下来一想——STM32根本不需要仿真器也能烧程序串口就够了。很多人学STM32的第一步就是装Keil、插ST-LINK、点Download这套流程顺得不得了以至于形成了一种错觉STM32烧录必须依赖Keil和ST-LINK。但实际上Keil只负责把C代码编译成机器码也就是生成的hex文件ST-LINK只是把hex文件写进芯片Flash的众多工具之一。你完全可以脱离Keil甚至脱离ST-LINK用一根几块钱的USB转TTL线把程序写进芯片。这里要引入本教程的主角FlyMCU。这是一款免费的串口烧录软件国内做嵌入式的基本都听说过界面虽然比较复古但功能扎实专门用来通过串口给STM32下载程序。配合CH340这类USB转TTL模块就能实现“电脑→串口→STM32”的烧录链路整个过程不需要任何仿真器。这个能力在你开发调试阶段可能用不上但一旦遇到下面这些场景就会发现它是救命技能手边没有ST-LINK、做现场维护没带仿真器、给量产板烧录程序、帮别人烧个Bootloader。教程适合刚入门STM32的新手也适合那些一直依赖KeilST-LINK、没接触过串口烧录的开发者。原理不复杂工具也很少但细节比较多踩坑概率不小这篇教程我按自己的实操顺序写尽量把能避的坑提前踩掉。1.2 串口烧录的核心原理藏在芯片里的出厂Bootloader在讲操作之前先花两分钟搞懂串口烧录为什么能成立。不然你只知道“BOOT0拉高、点一下下载”这种操作步骤出了问题根本无从排错。STM32芯片内部有一块出厂时就烧录好的固件程序叫Bootloader存放在芯片的“系统存储器”区域这个区域用户正常情况下没法擦除改写。这段Bootloader是ST官方写好的主要作用是在特定条件下让芯片进入一个特殊模式通过USART1串口、USB等外设接收上位机发来的数据然后把数据写入用户Flash区域一般是0x08000000地址开始的区域。关键在于“特定条件”怎么触发。STM32芯片上电时会检测BOOT0和BOOT1引脚的电平状态根据它们的组合决定从哪里启动BOOT0BOOT1启动区域说明0任意用户Flash正常运行你的应用程序10系统存储器运行出厂Bootloader等待串口烧录11SRAM很少用调试用所以串口烧录的完整流程就是把BOOT0引脚拉高到1让芯片复位进入系统存储器运行出厂Bootloader然后在电脑上用FlyMCU通过串口发送数据Bootloader接收到数据后把它写入Flash烧录完成后把BOOT0跳回0再次复位芯片就会从用户Flash启动运行你刚烧进去的程序。这里有个细节要说明STM32出厂Bootloader的串口协议是固定格式的上位机要先发送一个字节0x7FBootloader收到后会回复一个0x79作为应答之后双方进入正式的握手交互阶段。FlyMCU已经把这套协议封装好了用户不需要关心这些底层字节但知道这个机制有好处——你在排查“为什么连接不上”的时候可以用串口调试助手手动发0x7F看看有没有应答字节回传这一步检测硬件链路非常有效。后面第五部分我会细说这个方法。另外不同系列STM32的Bootloader支持的串口不完全一样。以最常见的STM32F103为例Bootloader使用的是USART1对应引脚是PA9TX和PA10RX。如果你用的是STM32F407同样是USART1部分型号如STM32F030、F072会额外支持USART2但主流F1/F4系列认准USART1基本不会错。建议翻一下对应型号的Reference Manual搜索“system memory boot mode”章节里面有详细的引脚说明。2. 硬件准备与驱动安装别让一根线卡住进度2.1 你需要准备哪些东西串口烧录的硬件门槛低得惊人。我列一个完整清单大部分东西你可能手头已经有了一块STM32开发板或自己画的最小系统板本教程用STM32F103C8T6演示也是最常见的型号一个USB转TTL串口模块本质是USB转串口芯片加外围电路引出TXD、RXD、GND、VCC等引脚几根杜邦线一台电脑Windows系统数据线/电源线给板子供电用USB转TTL模块是这里面唯一需要强调选型的。市面上最常见的方案是CH340芯片淘宝上几块钱一个驱动兼容性还可以Windows 10以后系统基本自动识别FTDI方案的模块更贵但驱动稳定性和抗干扰性更好适合工业环境调试CP2102芯片的模块也比较常见。我平时包里常备两个CH340模块坏了扔了不心疼。注意一个容易踩的坑有些USB转TTL模块上除了3.3V还有一个5V引脚跳跃线上标了5V和3.3V两种输出。给STM32F103供电如果你板子上已经有稳压电路或者直接用USB口供电USB转TTL模块的VCC可以空着如果板子没有独立供电需要用模块供电推荐接3.3V输出而不是5V。STM32F103虽然IO口大部分容忍5V但芯片VDD供电范围是2.0V-3.6V直接怼5V到VDD有一定风险虽然部分板子也能跑但长期工作会不稳定。2.2 接线逻辑TX接RX、RX接TX共地不能忘很多新手第一次接线拿着USB转TTL模块直接对应连接TXD接TXD、RXD接RXD结果死活通信不上。串口通信的两端发送脚要接对端的接收脚接收脚接对端的发送脚逻辑很简单A的TXD发数据B的RXD要负责收所以必须交叉。USB转TTL模块和STM32之间具体这样接USB转TTL模块STM32引脚说明TXDPA10模块发送→STM32的RX接收RXDPA9模块接收←STM32的TX发送GNDGND必须共地否则电平参考不一致3.3V3.3V可选板子缺供电时才接GND这一条太重要了没有共地两边电平平移数据全是乱码甚至完全无响应。我这几年调试各种串口设备遇到“明明接线正确但通信失败”的案例一半以上是没接GND或者GND接触不良。接好线之后把USB转TTL模块插到电脑USB口听到设备插入提示音后右键“此电脑”→管理→设备管理器展开“端口COM和LPT”正常情况下能看到一个“USB-SERIAL CH340 (COM3)”之类的条目括号里的COM口编号就是你后面在FlyMCU里要选的。2.3 CH340驱动装不上和选错口是最高频问题如果设备管理器里看不到COM口先别怀疑硬件坏了按下面顺序排查换一根数据线。很多USB线只供电不通数据这种线在给手机充电时看不出毛病但接串口模块就完全没反应。直接换了USB口比如插到电脑后置USB口避免前置口供电不足导致模块识别失败。检查设备管理器里有没有带着黄色感叹号的未知设备。如果有说明驱动不对。CH340驱动可以从芯片厂商官网下载搜索“CH340驱动”找到官方下载页面注意别下载到捆绑软件的第三方站点版本。Windows系统如果之前装过旧版CH340驱动建议先卸载再装新版不然可能出现设备代码10错误。还有个细节如果你电脑上同时插了多个USB转串口设备COM口号可能会变。每次插入模块后养成先看设备管理器确认当前COM口的好习惯而不是凭记忆选端口。FlyMCU里选错了端口通常会报“打开串口失败”或者一直卡在连接状态。3. FlyMCU软件配置与烧录实操保姆级步骤3.1 Keil里必须先做的一件事生成Hex文件FlyMCU能干烧录的活但它干不了编译的活。它烧录的文件格式是hex文件而hex文件需要先把源码编译出来。很多人在这里就乱了以为FlyMCU能直接烧那几个.C文件当然不行。你在Keil里写的代码需要先编译、链接、生成机器码最终把机器码按hex格式打包成一个文本文件这个文件才能被烧录工具识别。Keil默认是不生成hex文件的必须手动开启这步极其容易漏。具体操作如下在Keil里打开你的工程。点击工具栏的魔术棒图标Options for Target或者快捷键AltF7。切换到“Output”选项卡。勾选“Create HEX File”注意滋下面还有个“Create Batch File”可选项不需要动。点击OK保存然后重新编译一次工程。编译完成后在你的工程目录下有一个和工程同名的.hex文件生成。它的位置通常在工程文件旁边的.objects文件夹里也可能是Output文件夹和编译输出配置有关。找到之后记下路径待会FlyMCU加载用它。这里有个细节如果你用的是新版Keil比如Keil 5.x生成的hex文件后缀默认是.hex但如果工程配置了分散加载或者自定义输出路径文件名或者位置会变。稳妥的做法是在Keil的Build Output窗口里看编译日志里面有一行“Program Size: Codexxxx RO-dataxxxx RW-dataxxxx ZI-dataxxxx”这行的上方会显示“creating hex file...”日志末尾会输出“fromelf: ... creating hex file ...”以及文件路径。顺着这个路径就能找到hex文件。3.2 FlyMCU参数设置每个选项都别乱动打开FlyMCU界面是典型的老式软件风格但功能布局很清楚。先记住一个总体原则绝大多数选项保持默认只需要改关键几项。新手最容易犯的错是看着高级选项心里痒痒什么都想尝试结果设置叠buff最后烧录失败还找不到原因。软件界面主要看这几块串口选择在“串口”下拉框中选择你的COM口号。选错端口乱点和连接按钮大概率卡死。波特率选择这是最关键的参数之一。STM32出厂Bootloader支持的最高波特率因型号而异F103系列最高能支持到115200但有些环境下115200容易出错。我个人的做法是优先用115200连接失败或者烧录不稳定时降到57600或者38400再试。波特率越低越稳定代价是烧录速度变慢一个几十KB的小固件几乎感觉不到差别。校验位、数据位、停止位一般不勾选默认即可。STM32 Bootloader的串口配置是8位数据、无校验、1位停止位对应波特率之外的那几个参数。除非你知道自己在干什么否则不要去改。目标芯片型号FlyMCU会让你选择芯片型号比如STM32F103C8或者自动识别。如果软件支持自动识别芯片最好让软件自动识别选错了型号可能会导致Flash地址错乱。其他关键选项“编程前擦除”建议勾选。它会在烧录前把Flash的对应扇区擦除避免旧数据和新增数据冲突。“编程后校验”建议勾选。烧录完成后自动读回Flash内容和hex比对确认写入无误。这个选项虽然耗时几秒但能提前暴露烧录不完全的问题。“编程前复位”“编程后复位”看你手头板子的跳线操作习惯。如果你准备自己手动控制BOOT0和复位这些自动复位选项可以关掉或者根据实际流程配合使用。初学者建议把界面做到最简勾上“编程前擦除”和“编程后校验”其他全部默认。3.3 完整烧录流程演示一步步跟着做接下来是实战环节。在开始之前先明确一次BOOT0/Boot1跳脚的设置。以最常见的STM32F103C8T6蓝色Pill板为例板子上有BOOT0和BOOT1两个跳帽默认状态下都是0。烧录前的准备工作把BOOT0跳帽拉到“1”的位置通常是靠近USB口那一边具体看丝印。把BOOT1跳帽保持“0”的位置。给板子上电或者按一下复位键让芯片以“系统存储器模式”启动。这一步可以理解为通知芯片你接下来要进入Bootloader模式准备接收外部命令。所以顺序是“先设置BOOT01 → 上电或复位 → 再开始烧录”。然后在Keil里编译工程确认已经生成了hex文件。回到FlyMCU在“串口”下拉框中选中你的CH340端口。波特率选115200不稳定再往下调。点击“打开串口”按钮。点击“选择hex文件”按钮导航到刚才Keil生成的.hex文件路径并打开。此时软件界面应该显示芯片的相关信息如果软件支持检测会读出来。点击“开始编程”按钮有些版本叫“开始下载”。这时你会看到软件下方的进度条或状态栏开始滚动显示擦除、编程、校验等状态。如果一切顺利几十秒到一两分钟内状态栏会显示类似“下载成功”或“编程完成”的提示。烧录完成后把BOOT0跳帽拉回“0”的位置按一下复位键或者重新上电芯片就会从用户Flash启动运行刚烧进去的程序。如果你烧的是一个LED闪烁程序此时应该能看到LED开始闪了。从列清单到成功跑通第一次操作可能在10分钟以内。等你熟练了整个过程不超过两分钟比打开Keil等它加载还快。3.4 实操现场记录一次典型烧录的完整日志我在写这篇教程时专门用一块STM32F103C8T6蓝板重新走了一遍流程把日志复制出来给大家参考Keil里打开一个最简单的LED闪烁工程GPIO翻转。勾选Create HEX File重新编译编译输出当前目录下生成了led_test.hex。板子上BOOT0跳帽拨到1BOOT1保持在0上电。打开FlyMCU选COM3设备管理器显示CH340波特率115200勾选编程前擦除和编程后校验。点击“选择hex文件”路径指向led_test.hex。点击“开始编程”。软件状态栏输出大致是“开始连接芯片...”“成功连接STM32F103C8”“正在擦除地址0x08000000, 大小8KB”“正在编程...”“正在校验...”“编程完成共写入X字节”整段日志看下来最关键的节点是“成功连接”和“编程完成”。如果卡在“连接芯片”这一下大概率是BOOT0没拉高、接线TX/RX接反、或者没共地。4. ST-LINK与串口烧录对比什么时候用哪个4.1 调试功能和烧录速度的差异串口烧录和ST-LINK烧录的本质区别一个是“写入”一个是“写入调试”。ST-LINK通过SWD接口不仅能烧录还能实现在线调试比如在Keil里设置断点、单步执行、查看变量实时变化、检查堆栈使用情况。这些调试能力在复杂项目里几乎是刚需串口烧录完全做不到。开发阶段最典型的场景你写了一段逻辑程序跑起来行为不对你需要在某个函数入口停住看看变量值到底是多少。没有在线调试的话只能靠printf串口打印或者点灯大法效率低得多。所以ST-LINK在开发调试阶段的地位无法替代。但换个场景需求纯粹是“把某个hex文件烧进去”比如给刚焊好的板子下载出厂固件或者给已经发布的设备升级程序串口烧录反而有优势——它对硬件资源要求低不占用SWD调试引脚而且不需要额外的仿真器硬件。烧录速度方面ST-LINK的SWD模式在正常速度下能达到每秒几十KB甚至更高而串口在115200波特率下大约每秒11KB有效数据差距确实明显。一个100KB的固件ST-LINK可能10秒搞定串口要40-60秒。但在日常开发中大部分固件都在几十KB级别串口慢个几十秒影响不大。4.2 硬件成本、接线数量和场景对比对比维度ST-LINK串口烧录FlyMCUCH340硬件成本30-60元CH340模块5-15元接线数量SWDIO、SWCLK、GND有的板子还要NRST、3.3VTXD、RXD、GND三根线在线调试支持断点、单步、变量查看不支持烧录速度快中等对硬件资源占用占用SWDIO/SWCLK两个引脚占用USART1的PA9/PA10是否依赖Keil可在Keil内一键烧录不依赖KeilFlyMCU可独立操作适用场景开发调试、断点分析量产烧录、现场维护、临时烧录接线数量对比很有意思ST-LINK最少要接SWDIO、SWCLK、GND三根线串口烧录则要TXD、RXD、GND三根线数量上差不多。但SWD模式如果板子供电不稳定还得额外接3.3V给SWD使用串口烧录的3.3V相对灵活。另外有一点值得注意SPI/I2C这类的引脚复用冲突在开发中经常遇到。SWDIO和SWCLK在STM32F103上分别占PA13和PA14如果这个项目的外设把这两个引脚占用了比如用来做普通IO或复用功能ST-LINK烧录就会出现“连接不上”的故障这时候可以用串口烧录绕开。反过来也一样如果USART1被占用比如要做串口通信那串口烧录就受影响这时候ST-LINK就成了首选。两种方式本质上是互补的。4.3 选型建议我的实际经验我的工作习惯是开发初期和排错阶段必用ST-LINK因为断点调试功能太香了但工程代码稳定后需要给多块板子烧录同样固件时我会直接把ST-LINK拔了改成USB转TTL配合FlyMCU批量烧。量产场景更明显。我之前给朋友代工过一批小批量板子20块STM32F103主板每块都要先烧Bootloader再烧应用程序。用ST-LINK挨个烧虽然也能烧但每块都要插上仿真器软件里还要重新选择目标很别扭。后来换成串口烧录先接好线用FlyMCU烧完第一块把BOOT0跳回0拔线插下一块整个过程只要在软件里再次点击“开始编程”流水线操作体验明显更好。现场维护又是一个特殊场景。客户设备跑了几年后需要升级固件你飞去现场包里能带的东西有限。带一个十几克的CH340模块几根杜邦线比带一个ST-LINK方便得多。更重要的是很多工业设备根本没有预留SWD接口反而会预留一个调试串口USART1被引出。这种情况下串口烧录是几乎唯一的维护手段。总结一下我的选择逻辑开发阶段用ST-LINK生产/现场/应急用串口。两者不是替代关系而是配合关系。5. 常见问题与排查技巧实录5.1 高频问题速查表我在陪朋友和学员调试过程中遇到烧录失败的情况数不清了其中有几个问题出现频率特别高整理成速查表现象可能原因解决办法FlyMCU报“打开串口失败”COM口被占用 / 串口没打开关闭串口调试助手、xcom等软件重新插拔USB转TTL一直卡在“连接中”BOOT0没有拉高 / 没有复位确认BOOT01按一下复位键或重新上电报“无芯片回应”接线错误 / TX和RX没交叉 / 没共地检查TXD接PA10、RXD接PA9GND共地烧录到一半卡住Flash写保护 / 供电不稳 / 线太长用STM32CubeProgrammer解除读保护换短杜邦线单独供3.3V烧录成功但程序不跑BOOT0没有跳回0把BOOT0拉回0重新复位波特率选了115200始终失败线材质量差 / 干扰大降到57600或38400试试hex文件加载后显示乱码或地址不对芯片型号选择错误检查FlyMCU目标芯片型号是否匹配5.2 排查思路分享先从物理链路查起很多新手遇到烧录失败第一反应是怀疑软件设置、怀疑Keil工程、甚至怀疑芯片坏了。我的经验是90%以上的烧录失败问题出在物理链路所以排查顺序应该从物理层开始第一步检查串口模块是否被电脑正确识别。设备管理器里看不到COM口后面全免谈。第二步检查接线。用万用表测连通性或者直接把TXD和RXD短接用串口调试助手发一条数据看能否收到“原路返回”的数据。这个回环测试能快速判断串口模块好坏。第三步确认BOOT0状态。最好用万用表量一下BOOT0引脚电平不要只信跳帽位置——我遇到过跳帽标着1但实际引脚悬空没接触好的情况。第四步才轮到软件排查比如FlyMCU串口选择、波特率高低。这里分享一个降低排查成本的小技巧买USB转TTL模块时尽量选带TXD/RXD工作指示灯的型号。接线正确时烧录过程中两个灯会闪动如果只亮一个灯甚至两个都不闪说明通信根本没有建立就不用去软件里空转了。这个经验在野外调试时特别省心。5.3 独家避坑经验几条压箱底的干货第一BOOT0跳帽的拨动时机要养成肌肉记忆。很多人的习惯是接好线→打开软件→点烧录→失败→查线。正确顺序是先把BOOT0拨到1再上电或复位然后再点烧录。顺序反了芯片还在跑应用程序自然无法响应Bootloader协议。我甚至见过有人烧录前忘了拨BOOT0点了好多次一直失败拨了BOOT0之后又忘了按复位还是失败整整折腾了一下午。做完一个动作检查一个动作急不来。第二如果用了较长的杜邦线比如20cm以上波特率尽量别开太高。导线长度增加会导致电信号衰减和串扰加剧尤其是台式机机箱USB口附近电磁环境复杂。115200连不上果断降到57600。个人实测F103在38400波特率下就算线乱成一团通常也能烧录成功。烧录时间多个几秒不算啥失败重试才是真浪费时间。第三用串口调试助手发0x7F做链路自检。这个方法很实用先把FlyMCU的串口释放掉打开任意一个串口助手打开对应COM口发送十六进制字节0x7F如果能收到返回的0x79字节十六进制显示说明芯片Bootloader已经在正常运行串口链路完全没问题。这时候如果FlyMCU还是连不上问题就出在FlyMCU软件配置上可以重点关注目标芯片型号或波特率设置。第四量产建议用STM32CubeProgrammer配合脚本它其实也有串口ISP烧录功能但支持命令行批量操作。FlyMCU适合手动操作量产场景下一块块手动点按钮效率不高。STM32CubeProgrammer是ST官方工具免费支持命令行和自动检测可以在生产线上做一键烧录、批量校验。这个工具和FlyMCU的原理完全一致如果学会了FlyMCU再上手它基本无障碍。第五注意供电。USB转TTL模块的3.3V输出电流有限通常只有几十毫安级别。如果你的板子带有传感器模块、OLED显示屏或者其他耗电外设靠USB转TTL模块供电可能会掉电压导致烧录中途芯片复位或者Flash写入失败。稳妥的做法是板子用USB口或独立电源供电USB转TTL模块只接TXD、RXD、GND三根线。供电不稳引起的“编程失败”“校验错误”非常隐蔽如果你正好是带了一堆外设的板子在烧录优先考虑这个原因。写在最后一点实际操作体会串口烧录这个技能说实话是我入行头两年完全没当回事的技能。总觉得有ST-LINK在手烧录就是点一下鼠标的事何必折腾串口线。直到后来接了小批量生产和现场维护的活才真正体会到它的价值。尤其是当你在现场手里没有仿真器客户就在旁边等着这时候一根USB转TTL线能救你于水火。我个人现在的标准操作是开发时用ST-LINK做调试代码稳定后生成hex后续所有板子都用FlyMCU走串口批量烧录。两条路我都熟练既不排斥KeilST-LINK的组合也不迷信某个单一工具。最后再分享一个小技巧如果哪天你的板子突然烧不进程序了用我们前面说的0x7F链路自检法确认Bootloader能正常响应后再折腾软件设置别一上来就怀疑芯片坏了。很多时候就是线松了、BOOT0没拨到位、串口被其他软件占用这种小事。学会串口烧录之后你再去研究自定义Bootloader、串口OTA升级这些东西会发现底层逻辑一脉相承上手会轻松很多。
返回列表