十年匠心定制 · 商业建站与技术教学双线并行 咨询热线:400-886-1026 service@lmnt.cn
ARTICLE DETAIL

资讯详情

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

FlyMCU串口烧录STM32完全指南:对比ST-LINK Utility与实战避坑

FlyMCU串口烧录STM32完全指南:对比ST-LINK Utility与实战避坑 去年在实验室帮一个学弟调F103C8T6最小系统板他急得满头汗说板子坏了下载程序Keil一直报No ST-Link detected。我过去一看这家伙手里只有一根CH340的USB转TTL串口线压根没买调试器。我当场用这根线配合FlyMCU把程序给他烧进去了他整个人是懵的——学了半年STM32一直以为烧录必须靠ST-Link不知道串口也能干这活。这就是我写这篇东西的初衷在Keil、FlyMCU、串口烧录、STM32、ST-LINK Utility这几个关键词下面有太多人卡在一个根本没必要的门槛上。这篇文章我会把FlyMCU串口烧录从原理到实操完整讲透再和ST-LINK Utility做个硬核对比告诉你什么时候用哪个最省事。适合手里没有调试器、刚入门STM32、或者经常需要在现场改固件的朋友。1. 为什么我把FlyMCU当主力烧录工具先搞懂Keil烧录的隐藏成本1.1 Keil的烧录链路拆解你花的钱到底花在哪Keil作为STM32开发最主流的IDE绝大多数人写代码、编译都在里面完成。但注意Keil本身只负责把C代码翻译成机器码它默认并不直接烧录烧录靠的是它调用的调试器驱动和算法文件。用Keil的Download按钮背后干了三件事第一通过调试器ST-Link/J-Link/DAP等建立SWD或JTAG连接第二把Hex或Bin文件通过调试器协议传给目标芯片第三调用Flash算法擦除并写入。这个链路里调试器是不可或缺的硬件。一个原装ST-Link/V2要几十上百块国产的便宜一点但也要二三十块钱而且驱动问题特别多。我在帮人处理问题时见过太多因为调试器驱动装不上、固件版本不兼容、盗版ST-Link被识别为山寨设备而卡住的情况。你花在“让Keil认识调试器”上的时间往往比写代码还长。而FlyMCU走的完全是另一条路它直接依赖芯片出厂时烧好的ISP串口引导程序只需要USB转TTL模块把电脑串口和芯片的USART1连起来不需要调试器也就不存在上面一长串驱动兼容性问题。CH340的驱动装一次基本通吃所有板子。1.2 串口烧录的不可替代场景出差、课设、产线三连问你可能会说“我有ST-Link用得着FlyMCU吗”我给你列举三个实际场景你看看自己有没有遇到过。场景一出差到现场改设备。客户那边设备坏了你带了个电脑但调试器忘在办公室。现场到处是串口线你从设备上拆一个USB转TTL线直接FlyMCU刷固件十分钟搞定。没有串口线随便找根杜邦线也能凑合只要能接到板子的UART引脚。场景二课程设计或者比赛现场。评委要看实物程序突然出问题你现场改完代码Keil编译出Hex用FlyMCU串口烧录不依赖调试器。比赛现场环境乱最怕的就是调试器接触不良。串口线反而皮实。场景三小批量产线烧录。很多小公司做STM32产品不可能每块板子都插调试器。设计时留个串口烧录接口工人只要操作FlyMCU点一下这种流程稳定、成本低、容错率高。这三个场景本质都是在说同一个道理当你想快速、低成本地把编译好的固件塞进芯片时串口是永远存在的那条路。1.3 FlyMCU的定位它不是调试器是和Hex文件打交道的搬运工一定要明确一个概念FlyMCU不是调试器的替代品。它干不了断点调试、变量监视、寄存器查看这些活它的准确定位是“固件搬运工”。在STM32开发里写代码、编译、调试是一套流程烧录是另一套流程。很多人把这两件事混在一起总以为“烧录必须从IDE里完成”。其实完全可以把烧录从IDE里拆出来单独做这正是FlyMCU擅长的。你的Keil只需要负责编译出Hex文件剩下的交给FlyMCU。我现在的习惯是Keil里F7编译然后打开FlyMCU选好Hex点烧录全程不超过30秒。比打开Keil的Download界面等它连接调试器、校验、复位还要快。而且FlyMCU启动速度极快不像某些IDE笨重得让人烦躁。2. 串口烧录能跑通的原理从BOOT0拨码到STM32出厂bootloader2.1 STM32出厂自带的ISP固件藏在哪、怎么被激活很多初学者以为串口烧录是FlyMCU这个软件有什么魔法其实核心秘密在芯片自己身上。STM32在出厂时芯片厂商就在一块专门的存储区域里烧录了一段引导程序这段程序叫ISP固件在STM32F103上位于System Memory系统存储器地址大概在0x1FFFF000附近。它内置了一个通信协议最常见的就是通过USART1接收数据并写入Flash。也就是说你不需要额外先烧一段bootloader进去芯片出厂就自带除非你人为把它擦掉了。麻烦的是这段ISP固件不是上电就自动运行的。芯片复位的瞬间硬件会根据BOOT引脚的电位决定从哪里取指执行。想让CPU去跑System Memory里的ISP固件就必须让BOOT0引脚为高电平同时BOOT1为低电平。这也是串口烧录最容易被新手忽略的地方光接好串口线没用BOOT0没拉高芯片还是在跑你自己的Flash程序自然不会响应串口的ISP握手信号。2.2 BOOT0和BOOT1的组合逻辑一张表看清启动顺序以STM32F1系列为例启动方式由BOOT0和BOOT1两个引脚共同决定。这里我直接给一张表看一眼就明白。BOOT0BOOT1启动位置实际含义0任意主Flash0x08000000运行正常用户代码这是默认状态10系统存储器执行出厂ISP bootloader串口烧录用这个11内嵌SRAM调试用掉电丢失一般用不到注意F1的细节BOOT0是硬件优先级最高的开关BOOT0为0时BOOT1随便什么状态都从主Flash启动只有BOOT0为1时BOOT1才有意义。做串口烧录就把BOOT0跳线帽调到1BOOT1保持在0绝大多数最小系统板BOOT1默认接地不用管。F4系列略有不同有些型号只保留BOOT0引脚BOOT2等引脚定义不一样但思路一样进System Memory就是串口烧录模式。用最小系统板时看清丝印上的BOOT0和BOOT1标识就行。2.3 FlyMCU和芯片bootloader的通信协议细节芯片的ISP固件被激活后会在USART1上等待接收特定格式的命令。实际协议包括握手同步、获取芯片ID、擦除Flash、写入数据、校验、跳转执行等步骤。这些底层字节流不需要你去研究但理解整个流程有助于排查问题。FlyMCU点下“开始编程”后它会打开串口向芯片发送同步序列。这里有个常见坑很多USB转TTL模块上电时DTR/RTS脚会产生额外的电平跳变可能把芯片复位导致握手失败。所以FlyMCU界面上才有“DTR低电平复位”“RTS高电平进BootLoader”这些选项。如果你用的是带DTR/RTS控制的一键下载电路勾上这些选项后软件就能自动控制复位和BOOT0实现点一下就能烧不用手动拨码。如果是手动跳线模式这些选项要么不勾要么根据实际接线来设置否则烧录时芯片会被意外复位。还有一个细节ISP协议启动后bootloader会根据外部晶振频率自动匹配波特率范围所以你在FlyMCU里选57600或者115200一般都能工作但只要有一次连续握手失败bootloader就会退出同步状态这时候你要么再复位一次芯片要么重试连接。2.4 为什么串口只能烧HexST-LINK才能烧Bin和调试有个问题很多人问FlyMCU支持Bin文件吗支持但实际使用中我们几乎只用Hex文件。原因在于两者携带的信息量不一样。Hex文件除了数据本身每一行还带有地址信息Flash写入从哪里开始是固件自己告诉烧录软件的。而Bin文件是纯二进制数据没有任何地址标记烧录前你必须手动告诉工具“我要把这段数据放到哪个地址”。如果你写错起始地址轻则程序跑飞重则覆盖中断向量表直接变砖。所以FlyMCU虽然支持Bin但界面里普遍推荐选Hex。ST-LINK Utility也支持Hex和Bin但它的核心能力是调试器级别的访问还能读芯片数据。这一点后面专门对比。3. FlyMCU实操全流程接线、配置、烧录、验证一步不缺3.1 硬件准备清单与连接表先列一个最小清单这些都是几块钱到几十块钱的东西一块STM32最小系统板这里以最常见的F103C8T6为例一个USB转TTL模块CH340或者CP2102都行四根杜邦线电脑上装好CH340驱动模块的驱动FlyMCU软件网上搜“FlyMCU下载”就有绿色免安装接线要特别注意串口收发是交叉的不能直接对接同名引脚。USB转TTL模块STM32最小系统板TXDPA10USART1_RXRXDPA9USART1_TXGNDGND3.3V 或 5V3.3V给板子供电看模块能不能提供足够电流之所以必须接PA9和PA10是因为STM32的出厂ISP引导程序只监听USART1你把串口接到USART2上是没反应的。很多初学者图方便直接接到板子上的UART2引脚结果怎么弄都连不上。供电方面如果板子本身已有电源只接TXD、RXD、GND三根线就行串口模块和板子必须共地这是串口通信的基本前提。3.2 Keil工程里必须提前打开的一个开关生成HEX文件很多人在FlyMCU里找不到要烧录的文件因为Keil默认是不生成Hex文件的。你需要先打开一个开关。在Keil里点击Options for Target魔术棒图标切到Output选项卡勾选Create HEX File。然后重新编译一次编译完成后在你工程的Listings同级目录下也就是Objects文件夹里会多出一个后缀为.hex的文件。这个文件就是FlyMCU要烧录的目标。有个小细节如果你用Keil5且工程里有多个Target比如Debug和Release记得先选中你要用的Target再编译别搞混了。输出的Hex文件名一般和Target名一致比如STM32F103C8.hex。确认字大的好方法直接用记事本打开Hex文件可以看到以冒号开头的一行行文本里面全是十六进制字符。如果打开是空文件或者报错很可能是芯片没选对或者代码有编译错误。3.3 FlyMCU界面逐项配置芯片型号、串口、波特率、选项字节打开FlyMCU界面其实不大但每一项都有讲究。我这里按从上到下的顺序帮你过一遍。首先是芯片型号软件界面上有一个“MCU Type”下拉框。F103C8T6对应选择STM32F1系列中的相应型号或者直接选“STM32F10X Flash”。如果你选错了FlyMCU握手时读到的芯片ID对不上会直接报“打开串口失败”或者“无法识别芯片”。然后是串口选择也就是COM口。把USB转TTL插上电脑后去设备管理器里看端口COM和LPT下面多出来的是几号口。CH340一般显示USB-SERIAL CH340COM号常见的是COM3、COM4这个号每台电脑不一定一样别凭记忆选。波特率这里软件默认会有一个类似“115200”的推荐值。实操中我建议第一次用57600尤其是使用国产兼容芯片或者线材比较长时57600对信号质量要求低一些握手更稳。等确认能正常烧录了再调高增加速度。“编程前重装文件”这个选项就是重复烧录同一个Hex时先复位再写入建议勾上。“校验”选项一定要勾烧完自动比一遍Flash内容和Hex是否一致等于给你加了一道保险。选项字节区域一般不用动除非你真的清楚自己在改什么。后面我会专门讲读保护这个坑。3.4 正式烧录手动跳线和一键半自动两种玩法手动跳线模式是这样的先把BOOT0跳线帽调到1置高BOOT1保持在0然后点击FlyMCU的“开始编程”之后再给板上电或按复位键。这个顺序很关键先点开始再上电是为了让bootloader在一开始就能收到FlyMCU发出的同步序列。如果先上电再点开始bootloader早就进入等待状态可能因为超时已经退出了。整个烧录过程在日志窗口能看到一行行提示连接芯片成功、擦除Flash、写入、校验、运行。烧录完成后把板子断电把BOOT0跳线帽跳回0再重新上电程序就开始正常跑了。一键半自动模式是懒人福音。前提是你的USB转TTL模块带DTR和RTS输出而且接线时把模块的RTS接到BOOT0、DTR接到NRST复位脚。然后在FlyMCU里勾选“DTR低电平复位”和“RTS高电平进BootLoader”这样软件通过串口线的电平变化自动控制复位和BOOT0你只需要点一下开始芯片会自己重启进入bootloader完成烧录全程不用碰跳线帽。我用得最多的是半自动模式因为大多数带USB转TTL的板子已经预留了自动下载电路接好线一劳永逸。3.5 烧完怎么确认固件真的进去了烧录成功只是一半确认程序真的跑起来才算完。方法有三种。第一种看串口日志。如果你的程序初始化了串口并打印信息FlyMCU烧完会提示“运行”并自动复位串口调试助手里应该能看到打印内容。看不到就检查串口助手波特率是否和程序一致。第二种看外设状态。程序里点灯那就看板载LED有没有按预期闪烁。如果不闪先别怀疑芯片烧坏了大概率是BOOT0还停留在1程序根本没从Flash启动。第三种用FlyMCU的“读Flash”功能。点击软件的“读取”按钮FlyMCU能把芯片Flash内容读出来和Hex文件对比。不过这个功能在某些芯片上可能不支持所以最可靠的还是直接看程序行为。4. FlyMCU对比ST-LINK Utility六维拆解两台烧录方式的真实差距4.1 ST-LINK Utility解决的是另一类问题有人问FlyMCU既然这么方便那ST-LINK Utility是不是可以扔了答案是不能因为它们解决的问题根本不是一个维度。ST-LINK Utility是意法半导体官方推出的烧录工具必须配合ST-Link调试器使用。它通过SWD接口访问芯片不是串口所以它天然拥有调试器级别的控制能力。虽然官方已经停止更新、把接力棒交给了STM32CubeProgrammer但很多老工程师手里还留着它因为顺手。Power架构上ST-LINK Utility更像是一个芯片级的管理员能读取整个Flash区域、能修改选项字节、能设置读保护、能擦除全部Flash。这些操作对调板子、救砖、批量初始化来说是不可或缺的。FlyMCU在这些方向上很薄弱甚至部分功能根本没有。4.2 核心功能对比表我根据自己的使用经验把两边的关键差异整理成一张表这样选型时一眼就能看明白。功能维度FlyMCU串口烧录ST-LINK Utility硬件依赖USB转TTL模块约几块钱ST-Link调试器约几十块连接接口USART1串口SWD/JTAG调试口在线调试不支持不支持调试靠Keil但Utility有部分指令级工具读芯片Flash基本不可用支持可导出Hex/Bin修改选项字节部分支持完整支持读保护设置无法有效绕过支持设置和解除整片擦除支持支持程序自动运行支持支持适合场景快速刷固件、学习芯片维护、救砖、量产初始化这张表最扎眼的一栏是“读芯片Flash”和“修改选项字节”这也是ST-LINK Utility最不可替代的地方。4.3 哪些场景FlyMCU绝对替代不了ST-LINK Utility第一个场景是芯片锁死抢救。有人不小心在代码里开启了读保护或者把Flash的RDP等级调到了Level 1这时候正常的SWD连接会被芯片拒绝Keil下载直接报错FlyMCU也束手无策。而ST-LINK Utility有“connect under reset”模式也就是在复位瞬间拉低连接趁着芯片还没跳入用户程序空隙抢到控制权然后修改选项字节把读保护等级降回Level 0。这一步是FlyMCU做不到的。第二个场景是读备份数据。有些设备出厂前会往Flash里存序列号或校准参数你想把整个Flash读出来分析必须用ST-LINK Utility。通过串口ISP做这种数据搬移一是没接口二是会触发擦除根本不可行。第三个场景是改选项字节配置。比如调整硬件看门狗设置、修改BOOT位、设置Flash读保护级别这些都是ST-LINK Utility的看家本领。FlyMCU界面里虽然也有选项字节区域但功能十分有限而且操作风险高我不建议用它改。4.4 我的推荐工作流Keil编译 FlyMCU写入 ST-LINK Utility兜底我现在普通项目的工作流非常固定Keil只负责写代码和编译生成Hex后直接用FlyMCU从串口烧录。这个流程对日常开发和调试完全够用速度快、操作轻。只有当遇到三种情况时我才会拿出ST-LINK Utility第一芯片被读保护或者意外锁住了第二需要读回芯片里的固件做对比第三需要修改选项字节。平时它就躺在工具箱里吃灰但对一个合格的嵌入式工程师来说工具箱里不能没有它。如果你是纯新手预算紧张我建议先买一个USB转TTL模块玩转FlyMCU把编译、烧录、运行这条路走通。之后再考虑入手ST-Link用来学习调试和掌握ST-LINK Utility。这样学习曲线很平滑而且每一分钱都花在刀刃上。5. 踩坑实录从“连接超时”到“芯片锁死”的抢救方案5.1 连不上的第一课先检查BOOT0别急着重装驱动我见过太多人在FlyMCU连不上时第一反应是重装CH340驱动、换USB线、甚至重装系统。其实80%的“连接超时”都是同一个原因BOOT0没有拉高。芯片正常运行时跑的是用户Flash程序串口上没有任何ISP固件在监听你发多少同步序列都没人理。解决方法特别简单把BOOT0跳线帽跳到1按一下复位确保芯片从System Memory启动。如果板子上没有跳线帽就用杜邦线把BOOT0引脚直接接到3.3V再复位。检查BOOT0之前顺序应该是确认COM口选对确认接线交叉对TXD接PA10RXD接PA9确认共地。这四个顺序别反一上来就重装驱动是最浪费时间的行为。5.2 波特率、RTS/DTR和CH340的相爱相杀波特率设定看似简单但里面有个隐藏细节。FlyMCU有“最高波特率”和“实际波特率”两个概念软件在握手时通常会用高波特率试探如果芯片的晶振频偏比较大高波特率下双方时钟不同步就会失败。现象是点开始编程后日志一直提示“连接芯片超时”但偶尔又能成功一次。遇到这种抽风式连接别怀疑人生直接把波特率降到57600甚至38400试试。特别是那些用国产兼容芯片替代STM32的板子ISP固件对波特率的容忍度和原厂不太一样低速更可靠。另外CH340模块大多带DTR/RTS输出如果你没有接RTS到BOOT0、DTR到复位脚却在FlyMCU里勾了“DTR低电平复位”和“RTS高电平进BootLoader”也会出现诡异现象点一下开始板子自己复位了但没进bootloader连接失败。这个勾选必须和你的实际硬件接线匹配不是所有板子都能一键下载。5.3 Flash读保护激活后FlyMCU为什么突然不理人了有位朋友的项目为了防止固件被直接抄把RDP读保护等级设置成了Level 1。后来固件要升级他用FlyMCU串口烧录发现芯片能握手成功但写到一半报“校验失败”甚至“擦除失败”。这就对上了读保护激活时调试接口和部分Flash操作会被芯片限制。想解除保护用ST-LINK Utility连接进Option Bytes把RDP从Level 1改回Level 0软件会提示执行此操作会擦除整个Flash确认就行。此时Flash里的代码会被清空你需要重新烧录一次固件。所以生产环境里别轻易开高等级读保护否则每次升级都要全片擦除。FlyMCU在遇到读保护时基本只能干瞪眼这就是我强调“ST-LINK Utility兜底”的典型场景。5.4 把“锁死”的芯片救活的完整操作链说到“锁死”有的新手以为芯片彻底废了其实绝大多数情况下都能救回来。操作链如下第一步把BOOT0拉高让芯片上电时从System Memory启动跳开用户Flash程序。这里要说明Boot引脚电平在复位瞬间被采样如果你不在复位瞬间改变BOOT0芯片还是按原来的启动方式跑所以改完BOOT0后必须手动复位一次。第二步把ST-Link的SWDIO接到PA13SWCLK接到PA14GND接GND3.3V接3.3V若板子没独立供电。打开ST-LINK Utility连接时如果提示“Cannot connect”就勾选Settings里的Connect under reset选项也就是在复位期间强制建立连接。第三步连上后进入Option Bytes把读保护等级调回Level 0软件提示会擦除Full Flash选是。擦除完成后芯片回到出厂般的干净状态。第四步断开ST-LINK Utility把BOOT0跳回0再用FlyMCU或者Keil重新烧录固件。这套流程我操作过不下十次成功率几乎100%前提是芯片本身没烧坏。真正的硬件损坏要靠替换法排查不是软件能解决的。5.5 国产兼容芯片GD32/APM32烧录时的特殊注意我用过的国产兼容STM32芯片不少GD32、APM32、CKS32都在项目里踩过坑。串口烧录这一块它们的原则是兼容STM32F1的ISP协议但魔鬼在细节里。首先是波特率。国产芯片的ISP固件通常对高波特率支持不如原厂稳定我碰到过在115200下GD32F103握手成功率明显低于原厂的情况。所以遇到国产芯片第一反应就是把波特率降到57600能避开很多坑。其次是芯片ID识别。FlyMCU识别芯片型号是通过读ID号来匹配的某些国产芯片的ID号与原厂不完全一致或者复用了一些特殊ID导致软件识别成另一个型号。这时你可以在FlyMCU里手动选择兼容型号但要小心选错型号会导致写入地址错误程序跑不起来。第三是选项字节的兼容性。不同厂家的选项字节定义有些微差异原厂工具和第三方工具对国产芯片的选项字节操作支持程度也不一样。如果只是串口烧录普通程序基本没影响但一旦涉及修改读保护等高级操作建议使用芯片厂商各自官方的工具别用ST-LINK Utility硬来。除了这些国产芯片还有一个共性问题上电复位时间可能和原厂略有差异。表现为FlyMCU点开始后偶尔第一次握手失败再点一次就成了。这不是坏事说明协议兼容性有瑕疵解决办法就是多试一次或者把“编程前重装文件”选项关掉手动控制时机。写在最后的一个小建议玩STM32的关键不是把某个工具用得出神入化而是知道什么场景下该用哪个工具。FlyMCU和ST-LINK Utility一个便宜、轻量、随用随走另一个强大、底层、能救急。你完全不必在它们之间二选一组合使用才是最高效的。我自己这几年攒下来的习惯是新板子到手先看一眼BOOT0跳线帽的位置然后USB转TTL插上FlyMCU烧一个点灯程序验证硬件正常之后才考虑Keil的调试功能。这个习惯帮我避开了大量“板子坏了吗”的假故障。希望这篇内容也能让你少走这些弯路。
返回列表