ARTICLE DETAIL

资讯详情

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

STM32串口ISP烧录实战:CoFlash无仿真器烧录固件指南

STM32串口ISP烧录实战:CoFlash无仿真器烧录固件指南 刚接触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引脚的电平状态决定从哪里取指令BOOT00BOOT1任意从用户Flash启动也就是正常运行我们自己写的程序。BOOT01BOOT10从系统存储器启动进入Bootloader模式等待串口下载。BOOT01BOOT11从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串口ISPUSB转TTL3根线无快速烧录、小批量每次要切换BOOT引脚Flash Loader DemonstratorST官方串口工具USB转TTL3根线无ST官方备选方案界面老旧F4/F7支持弱ST-Link UtilityST-LinkSWD接口可读Flash、配置选项字节整片擦除、量产、保护设置不支持在线调试Keil MDK ST-LinkST-Link完整在线调试日常开发调试需要额外硬件J-Flash J-LinkJ-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下载模式你要让BOOT01、BOOT10。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的PA9USART1_TX接串口模块的RXD。STM32的PA10USART1_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引脚。而OTAOver-The-Air升级的思路是程序自己具备通过网络、LoRa、蓝牙等方式接收新固件的能力把新固件写入Flash的另一个区域然后跳转过去运行。如果你以后要接触OTA烧录经验其实是可以复用的。核心思想都是理解STM32的启动方式、Flash分区、跳转逻辑。串口ISP帮你在“烧录”这个动作上建立概念OTA只是在“数据从哪里来”这个环节上做了替换数据的落盘方式、地址规划、校验思路本质上是一样的。在我实际带新人的项目里凡是先把串口ISP烧录搞明白的人后面理解OTA、理解Bootloader跳转都很快。CoFlash虽然是入门工具但它把STM32启动流程里最基础的一环讲清楚了。最后说一个我自己的习惯烧录之前先拿万用表量一遍TXD和RXD确认没有接反再量一下BOOT0对地电压是不是高电平。这几个动作加起来不到10秒但能省下至少半个小时的排查时间。工具本身可以很简单但把基础动作做规范后面踩的坑会少很多。
返回列表