刚接触STM32的人,遇到的第一道坎往往不是语法,而是烧录。Keil里编译显示0 Error 0 Warning,点下载却提示找不到目标设备,这种体验我太熟悉了。尤其当你手里只有一块最小系统板和一根USB转TTL线,没有ST-Link、也没有J-Link的时候,固件怎么进芯片就成了很现实的问题。
CoFlash就是解决这个场景的工具。它配合STM32芯片自带的ISP引导程序,通过串口把编译好的hex文件直接写进Flash,不需要额外买仿真器,支持擦除、写入、校验、读回对比,对入门玩家和想快速验证功能的人来说相当顺手。这篇文章我按从零到一的手把手来写:先说清楚它背后的原理,再讲硬件接线,然后走一遍软件操作的完整流程,最后把容易翻车的坑一次列出来。
1. CoFlash是什么:不接仿真器也能烧固件的实用方案
1.1 系统存储器Bootloader与ISP烧录原理
很多人第一次看到CoFlash这个工具时会有点懵:它没有调试功能,也没有仿真界面,连界面设计都很朴素,但它能完成一个非常核心的动作——把固件写进STM32的Flash。
为什么它能做到?关键不在CoFlash本身,而在STM32出厂时内置了一段引导程序。STM32芯片内部有一块独立的系统存储器区域,不同型号位置略有差异,比如F103系列通常在0x1FFFF000附近。芯片出厂时,这块区域由厂商预烧录了一段Bootloader,专门负责通过串口接收上位机发来的数据,再把数据写入用户Flash。这段引导程序就是STM32的ISP功能,全称In-System Programming,在系统编程。
启动时STM32会检查BOOT0和BOOT1引脚的电平状态,决定从哪里取指令:
- BOOT0=0,BOOT1任意:从用户Flash启动,也就是正常运行我们自己写的程序。
- BOOT0=1,BOOT1=0:从系统存储器启动,进入Bootloader模式,等待串口下载。
- BOOT0=1,BOOT1=1:从SRAM启动,一般是调试用。
CoFlash做的事情,就是通过串口和这段Bootloader对话。它按照ST定义的串口协议发送握手信号、擦除命令、写入命令、校验命令,Bootloader每收到一条有效指令都会回一个应答字节。两边一来一回,固件就这么从电脑进到芯片里了。
这就像芯片自己带了一个“出厂引导员”,CoFlash只是在门外喊话,引导员帮我们把行李搬进房间。CoFlash本身没有魔法,它只是把协议封装成了图形界面,让你不用手动敲串口命令。
1.2 CoFlash在STM32开发流程中的定位
一个完整的STM32开发流程通常是:写代码、编译、烧录、调试。ST官方主推的路径是ST-Link配合Keil或者STM32CubeIDE,一条USB线搞定下载和在线调试。这个方案很好,但对刚入门的人有一个成本问题:ST-Link需要额外购买,哪怕是最便宜的兼容版也要几十块钱,如果需要正规的,一百多也很正常。
如果你手里只有USB转TTL模块,原本是用来做串口调试的那一种,CoFlash就能派上用场。它和ST-Link这类工具的核心区别在于:
- 烧录通道不同:ST-Link用SWD或JTAG接口,CoFlash用串口。
- 调试能力不同:ST-Link支持在线仿真、断点、变量查看,CoFlash只负责把固件写进去。
- 成本不同:USB转TTL模块往往已经是开发标配,不需要额外开销。
所以CoFlash适合这些人:手里暂时没有仿真器但想赶紧验证程序的学生或爱好者、批量烧录时不想每个板子都挂ST-Link的生产场景、以及板子已经焊好但还没来得及引出SWD接口的硬件调试阶段。
它解决的本质问题,是“如何用最少的硬件投入,把编译好的固件可靠地送进芯片”。
1.3 CoFlash与常见烧录工具横向对比
我把实际接触过的几类烧录工具放在一起对比过,这样你可以根据自己的情况选合适的:
| 工具/方式 | 硬件要求 | 调试能力 | 适合场景 | 常见痛点 |
|---|---|---|---|---|
| CoFlash(串口ISP) | USB转TTL,3根线 | 无 | 快速烧录、小批量 | 每次要切换BOOT引脚 |
| Flash Loader Demonstrator(ST官方串口工具) | USB转TTL,3根线 | 无 | ST官方备选方案 | 界面老旧,F4/F7支持弱 |
| ST-Link Utility | ST-Link(SWD接口) | 可读Flash、配置选项字节 | 整片擦除、量产、保护设置 | 不支持在线调试 |
| Keil MDK + ST-Link | ST-Link | 完整在线调试 | 日常开发调试 | 需要额外硬件 |
| J-Flash + J-Link | J-Link | 无,但速度极快 | 高速量产下载 | 价格高 |
从表格能看出来,CoFlash虽然没有调试能力,但在“把固件写进去”这件事上效率不低。尤其是对小批量烧录,准备一台电脑和一个串口模块,就能反复烧不同板子。
2. 烧录前的硬件准备与接线细节
2.1 目标板与串口模块清单
在动手之前,先确认一下手里的东西齐不齐。以最常见的STM32F103C8T6蓝色板为例,你需要准备:
- STM32F103C8T6最小系统板或者自己焊的核心板一块。
- USB转TTL模块一个,CH340或者CP2102都可以,FT232更稳。
- 杜邦线至少3根。
- 电脑上安装好对应串口芯片的驱动,设备管理器里能看到COM口。
USB转TTL模块选型上有两个细节要注意。第一是电平,STM32的IO是3.3V电平,串口模块如果是5V的TTL电平,直接怼上去长期用有风险。CH340和CP2102的模块一般有3.3V和5V跳线,记得拨到3.3V。第二是驱动,CH340在Windows 10以上系统通常免驱,但有的精简版系统还是会缺,装一下芯片厂商的驱动就好,CP2102同理。
2.2 BOOT0和BOOT1引脚的正确设置
这是最容易出错的第一步。很多新手第一次烧录失败,不是线接错,而是BOOT引脚没设对。
以F103为例,BOOT0和BOOT1通常会通过跳线帽或拨码开关引出。进入串口ISP下载模式,你要让BOOT0=1、BOOT1=0。BOOT0拉高,BOOT1保持默认低电平。这个组合的含义是“上电后从系统存储器启动”,也就是执行芯片出厂自带的Bootloader。
具体操作顺序有讲究:
- 拔掉目标板电源,确保完全断电。
- 把BOOT0跳线帽从0拨到1。
- 接好串口模块的TXD、RXD、GND三根线。
- 给目标板上电。
先设置BOOT再上电,这个顺序很关键。如果已经上电再拨BOOT0,部分芯片不会立即生效,需要按一次复位或者重新上电才会重新检测启动引脚。最稳妥的方式就是断电、设引脚、再上电。
2.3 TXD与RXD交叉连接
串口通信的基本规则是交叉连接:发送接接收,接收接发送。用CoFlash烧录时,STM32的USART1引脚是PA9和PA10,其中PA9是TX发送,PA10是RX接收。
- STM32的PA9(USART1_TX)接串口模块的RXD。
- STM32的PA10(USART1_RX)接串口模块的TXD。
- 两边的GND必须接在一起。
这里必须强调共地。串口信号是相对地电平的,如果两边GND不连,电平参考点不一致,收到的数据大概率是乱码或者完全没反应。有的串口模块在电脑USB供电,目标板用外部USB供电,看似各自都有电,但信号电平没有公共参考点,通信一样会失败。
如果你用的是F103C8T6蓝色板,板上已经带了USB转串口芯片,那就更省事了,直接插USB线,板上的串口1已经和板载CH340连好,唯一要做的只是设置BOOT0。
2.4 抗干扰与供电检查
烧录过程中如果经常出现擦除失败或者写入校验不一致,先别急着怪CoFlash,检查一下供电。STM32在擦写Flash时会有比较大的瞬时电流,如果供电线太细或者USB口供电不足,电压跌落会导致Bootloader工作异常。
建议:
- 使用尽量粗短的电源线和地线,USB转TTL模块上的3.3V输出一般只能给一些小电流负载用,完整跑起整个板子最好通过USB口或者稳压模块独立供电。
- 如果板子外接了电机、继电器、大功率LED这类负载,烧录时先把负载断开,等烧录完成再恢复。
- 台式机后置USB口比前置面板的供电稳定,这一点实测比很多人想象的更重要。
3. CoFlash软件配置与固件烧录全流程实操
3.1 打开CoFlash并识别COM口
硬件接好之后,把USB转TTL模块插到电脑上,打开设备管理器,展开“端口”,记下对应的COM编号。比如COM3、COM5之类,每台电脑不一样,以实际为准。
打开CoFlash之后,操作界面很直白,主要就是端口选择、芯片选择、文件选择、操作按钮这几个区域。第一步选择刚才记下的COM口。注意如果电脑插了多个串口设备,不要选错,否则连接的时候会一直报超时。
然后选择芯片型号。我以STM32F103C8T6为例,在型号列表里选对应的系列,CoFlash会自动匹配该芯片的Flash大小、页大小、扇区结构这类参数。这一步不能乱选。F103C8T6是64KB Flash,如果你选成F103RCT6,容量和页大小都对不上,擦除和写入会乱套。选错型号最典型的故障是擦除时报告地址越界,或者写入后校验失败。
3.2 加载hex文件还是bin文件
编译产物的格式有两种:hex和bin。CoFlash两种都支持,但处理方式完全不同。
- hex文件是文本格式,每一行里自带地址信息,CoFlash能从中解析出每条数据该写到Flash的哪个地址。所以选hex文件时,不需要手动填起始地址,工具会自动从0x08000000开始排布。
- bin文件是纯粹的二进制镜像,没有任何地址信息。选bin文件时必须手动指定起始地址,STM32的Flash起始地址是0x08000000,默认填这个就行。
从Keil MDK生成hex文件的方法是:在Keil里打开工程,点击Options for Target图标,切到Output选项卡,勾选Create HEX File,然后重新编译一次。编译完成后,工程目录下的Objects文件夹里会生成一个与工程同名的.hex文件。
加载文件后,CoFlash一般会显示文件大小、起始地址、结束地址等信息。检查一下解析出来的地址范围,F103C8T6是64KB Flash,地址范围0x08000000到0x0800FFFF。如果hex文件里的地址超过了这个范围,要么是芯片型号选错了,要么是程序中链接脚本配置错误。
3.3 波特率与通信参数的合理设置
串口通信参数中,波特率最重要。STM32的Bootloader在等待上位机连接时,会先以默认波特率同步,常见的是115200。CoFlash里我一般直接把波特率设为115200,成功率最高。
有人为了追求下载速度把波特率调到921600或者更高,实际体验是:短杜邦线、好模块、干净供电的情况下能成,但一旦线长一点、模块质量差一点,就会出现写入中途卡死或者校验失败。烧录本身数据量不大,几KB到几十KB的固件,115200的速度也就是几秒钟的事,真没必要冒险拉高波特率。
其他参数,比如数据位8、停止位1、无校验,通常保持默认即可,STM32 Bootloader使用的就是这套参数。
3.4 完整烧录步骤演示
下面我按一次完整的操作序列走一遍,方便你照着做:
- 先把BOOT0拨到1,目标板断电。
- USB转TTL模块插电脑,ST-Link或其它调试器拔掉,避免资源冲突。
- 目标板上电,此时芯片进入Bootloader模式。
- 打开CoFlash,选择正确的COM口和芯片型号。
- 加载编译好的hex文件,确认地址范围无误。
- 点击连接或者同步按钮,正常状态下CoFlash会在几百毫秒内建立和Bootloader的通信。
- 点击全片擦除,等待擦除完成。
- 点击编程/烧录,工具会写入数据并显示进度条。
- 烧录完成后点击校验,确认Flash里的数据与文件一致。
- 关闭CoFlash,目标板断电,把BOOT0跳回0。
- 重新上电,程序开始运行。
这里每次都要手动切换BOOT0确实有点繁琐,但这就是串口ISP方式的本质。习惯之后流程很快,熟练了从接线到跑起程序也就一分钟左右。
3.5 关于Flash操作顺序的思考
CoFlash的默认操作习惯是擦除、写入、校验三步分开,而不是一键全自动。分开操作看似多点了两下,其实有一个好处:你能清楚地看到每一步是否通过。
擦除步骤检验的是通信链路是否可靠。如果擦除每次都能顺利完成,说明串口连接、波特率、电源都没问题。写入步骤检验的是传输过程是否稳定,偶尔失败可能与线材干扰有关。校验步骤则是最终确认,校验通过基本可以确认固件已经正确写入。
有的工具把三步合并成一个一键执行按钮,确实方便,但出错后不好定位是哪一步的问题。新手阶段我建议老老实实三步分开走,出了问题能更快判断出原因。
4. 常见问题与排查技巧实录
4.1 系统找不到COM口
插上USB转TTL模块,设备管理器里完全没有新设备,或者显示黄色感叹号。这大概率是驱动问题。
CH340芯片需要安装CH340驱动,CP2102需要安装CP210x驱动,FT232需要FTDI驱动。很多人以为Win10免驱,实际上部分系统版本或者精简版系统仍然会缺。解决办法就是去芯片厂商官网下载对应驱动,或者用驱动工具自动识别安装。
另一种情况是USB线坏了。有的Micro USB线只能充电不能传数据,插上后电脑只会给模块供电,枚举不出串口。换一根短线试试,这个问题比想象中常见。
4.2 点击连接后一直超时
CoFlash点击连接后,一直提示无法同步或者超时。九成原因是以下三件事里面至少有一件做错了:
第一,BOOT0没有正确拉高。检查跳线帽是否真的拨到了1的位置,有的板子跳线帽很松,看起来拨过去了实际接触不良。用万用表量一下BOOT0引脚的对地电压,应该是高电平。
第二,TXD和RXD接反。这是新手最高频的错误,两边都是杜邦线,没有区分颜色,接反之后CoFlash发出去的同步数据芯片收不到,自然超时。
第三,没有共地。TXD、RXD两根线接了,GND忘了接,或者GND接的位置不对。串口通信必须有共地参考点。
处理顺序建议:先确认设备管理器里COM口正常,再确认BOOT跳线,然后用万用表通断档检查杜邦线是否导通,最后核对TX/RX是否交叉连接。
还有一个容易忽略的点:某些USB转TTL模块的TXD引脚空闲时是5V电平,和STM32的3.3V引脚直连虽然一般不会立刻烧坏,但长期使用或者模块质量不好时会影响稳定性。严谨的做法是在TXD串联一个1k电阻再进STM32的RX。
4.3 连接成功但擦除失败
CoFlash能建立连接,说明通信链路是通的。但擦除时报错,可能是以下几种情况:
- 芯片型号选错,导致擦除地址范围超出了实际Flash容量。
- Flash读保护开启了。如果芯片之前被设置过读保护,Bootloader会限制部分操作,擦除和写入都可能失败。这种情况需要先用ST-Link配合STM32 ST-LINK Utility把读保护等级降为0,或者使用官方Flash Loader Demonstrator尝试解除保护。
- 供电不稳,擦除操作瞬间电流较大,电压跌落导致芯片复位。
芯片写保护也可能导致类似问题。解决办法是在支持选项字节操作的烧录工具中关闭写保护,或者直接使用ST-Link Utility做一次全片擦除,把保护位一起清掉。
4.4 烧录成功但重新上电不运行
这个问题的典型表现是:CoFlash提示写入成功、校验也通过,但断电重新上电后,程序没跑起来,灯不闪,串口没输出。这种情况先看BOOT0,确认是否已经跳回0,让芯片从用户Flash启动。
第二个排查点是看程序中是否正确设置了启动文件。如果是自己从零建的工程,没有添加startup_stm32f10x_md.s启动文件,或者启动文件芯片型号不匹配,会导致程序根本没进入main函数。另外检查一下Flash Download选项里的编程算法是不是选对了。
还有一种情况是程序本身的硬件初始化问题,比如外部晶振不起振、复位电路异常,导致代码卡在启动阶段。碰到这种情况,可以先烧录一个最简单的点灯程序测试,排除硬件问题。
4.5 常见问题速查表
| 现象 | 可能原因 | 处理办法 |
|---|---|---|
| 设备管理器无COM口 | 驱动缺失或USB线不通 | 装驱动、换USB线 |
| 连接超时 | BOOT0没拉高、TX/RX接反、未共地 | 逐项检查硬件接线 |
| 连接成功但擦除失败 | 芯片型号错、读保护开启 | 核对型号、解除保护 |
| 烧录成功但程序不跑 | BOOT0未恢复、启动文件缺失 | 跳回BOOT0、检查启动配置 |
| 校验失败 | 线材过长、波特率过高、供电弱 | 降低波特率、缩短杜邦线、改善供电 |
| 写入中途卡死 | 串口数据线干扰 | 用手摸一下线、重新连接再试 |
5. 进阶玩法:从单次烧录到一键集成
5.1 在Keil MDK中集成CoFlash一键下载
如果你已经习惯用Keil写代码,每次烧录都要切到CoFlash窗口选文件、点按钮,来回折腾确实影响效率。CoFlash可以做成Keil的外部工具,实现编译完成后自动打开并加载固件。
在Keil中点击Tools菜单,选择Customize Tools Menu,新增一个工具项:
- Command:填写CoFlash主程序的完整路径,比如
D:\Tools\CoFlash\CoFlash.exe。 - Arguments:如果是图形界面工具,不一定支持命令行传参,这一步以实际版本为准。不支持的话就当成快捷方式用,至少省去了翻目录找exe的时间。
- Initial Folder:填CoFlash所在目录。
设置好后,编译完点Tools菜单里的CoFlash就能直接唤起烧录工具。有的版本支持命令行直接传hex路径和COM口,这样体验更接近一键烧录,具体参数可以参考工具的帮助文档。
5.2 用批处理实现自动烧录
如果你的CoFlash版本支持命令行模式,可以写一段批处理,把编译和烧录串起来。假设工具支持类似这样的调用方式:
@echo off CoFlash.exe -port COM5 -baud 115200 -chip STM32F103C8 -file .\Objects\demo.hex -erase -write -verify pause一行命令完成擦除、写入、校验整个流程。配合Keil的After Build选项卡调用这个批处理,编译完成后自动执行烧录,整个过程不用额外点鼠标。
命令行方式尤其适合小批量生产。找一个没有图形界面的老电脑,接上USB转TTL,员工只要按一下空格执行批处理,就能完成一片板子的烧录,不需要培训也不需要理解工具细节。
5.3 批量烧录场景的注意事项
用CoFlash做过20片以上板子的批量烧录之后,我总结了几条实操经验:
- 批量烧录时,优先用bin文件代替hex文件。bin文件是纯二进制流,体积小、解析快,而且不会因为hex文件的地址记录和段记录产生歧义。
- 使用USB HUB同时接多个串口模块时,注意每个模块映射的COM口要固定。在设备管理器里给每个串口模块设置固定的COM号,避免拔插顺序导致串口号变化。
- 每片板子烧录完成后最好做一次校验。CoFlash的校验功能多花一两秒,但能挡住90%的返工问题。
- 插座化的烧录治具有效减少接触不良。做几个弹簧针烧录座,板子放上去就能烧,比每次手动插杜邦线快得多。
5.4 OTA升级思路的铺垫
聊到烧录,顺便说一下OTA。CoFlash通过串口烧录属于传统ISP方案,需要人工介入切换BOOT引脚。而OTA(Over-The-Air)升级的思路是:程序自己具备通过网络、LoRa、蓝牙等方式接收新固件的能力,把新固件写入Flash的另一个区域,然后跳转过去运行。
如果你以后要接触OTA,烧录经验其实是可以复用的。核心思想都是:理解STM32的启动方式、Flash分区、跳转逻辑。串口ISP帮你在“烧录”这个动作上建立概念,OTA只是在“数据从哪里来”这个环节上做了替换,数据的落盘方式、地址规划、校验思路本质上是一样的。
在我实际带新人的项目里,凡是先把串口ISP烧录搞明白的人,后面理解OTA、理解Bootloader跳转都很快。CoFlash虽然是入门工具,但它把STM32启动流程里最基础的一环讲清楚了。
最后说一个我自己的习惯:烧录之前先拿万用表量一遍TXD和RXD,确认没有接反,再量一下BOOT0对地电压是不是高电平。这几个动作加起来不到10秒,但能省下至少半个小时的排查时间。工具本身可以很简单,但把基础动作做规范,后面踩的坑会少很多。