说个很常见的场景开发板刚到手里ST-LINK还在快递路上或者借来的调试器被别人拿去用了手头只剩一根USB线。这时候想给STM32烧个点灯程序练练手很多人第一反应是“完了没调试器下不了程序了”。其实不用慌STM32出厂时内部就带了一个Bootloader我们可以通过DFU模式直接用USB线把程序烧进去完全不需要ST-LINK这种额外硬件。这篇文章我就把这个过程完整拆开讲一遍从DFU的原理、硬件准备、软件操作到踩坑排查一步一步带你把程序烧进去。适合手头没有ST-LINK、只有USB线和一块带USB接口的STM32板子的朋友也适合想把“DFU烧录”这个技能彻底搞明白的初学者。整个过程不需要焊接、不需要飞线只要你会用跳线帽十来分钟就能搞定。1. 为什么没有ST-LINK也能烧DFU模式原理拆解1.1 DFU到底是什么DFU的全称是Device Firmware Upgrade翻译过来就是“设备固件升级”。本质上它是USB协议里定义的一种专门用于升级设备固件的标准。而STM32在出厂时芯片内部一个叫“系统存储器System Memory”的独立区域里已经预烧了一段官方Bootloader程序。这段Bootloader支持通过USB、USART等方式接收上位机发来的固件数据然后写入到芯片的用户Flash区。这个过程和手机刷机很像。手机系统坏了只要还能进Recovery模式就能通过数据线连电脑重新刷入系统。STM32的DFU模式就相当于它的Recovery模式芯片里跑的程序再乱Bootloader都在一个独立区域不受影响。只要把启动方式切到Bootloader电脑就能通过USB线和它通信把新的固件灌进去。我当年第一次接触这个功能时觉得挺神奇一根普通的USB数据线就能绕过调试器直接操作芯片内部的Flash。实际上它并没有绕过什么只是换了一条通道。平时我们用ST-LINK走的是SWD接口通过调试协议读写芯片而DFU走的是USB接口通过USB DFU协议和出厂Bootloader通信。两条路都能修改Flash里的用户程序只是入口不同罢了。1.2 启动模式与BOOT引脚烧录的前提要理解DFU烧录为什么能生效绕不开STM32的启动模式。STM32芯片上电后CPU会去读取BOOT0和BOOT1这两个引脚的电平状态然后决定从哪个地址开始执行代码。以最常见的STM32F103系列为例启动模式对照关系如下启动模式BOOT0BOOT1说明主Flash启动0任意正常运行用户程序也就是我们平时烧录的代码系统存储器启动10运行出厂固化的Bootloader即DFU/串口ISP入口SRAM启动11从SRAM启动多用于调试绝大多数开发板在这两个引脚上都预留了跳线帽或者拨码开关。把BOOT0跳到高电平“1”BOOT1保持在低电平“0”然后给板子重新上电芯片就会从系统存储器启动进入出厂Bootloader。此时如果芯片支持USB DFU引导电脑上就会枚举出一个叫“STM32 BOOTLOADER”的USB设备。第一次理解这个流程时我最大的感触是原来烧录程序的主动权一直在芯片自己手里调试器只是替我们省了切换BOOT引脚的麻烦。而DFU模式本质上是在“没有外力”的情况下利用芯片出厂自带的引导程序实现固件的自我更新。只要硬件设计上保留了USB接口和BOOT引脚烧录这扇门就永远是开着的。1.3 适用条件你的板子能不能用DFUDFU模式虽然好用但不是所有STM32都能用USB线直接烧。我把它需要满足的条件列成一个清单你照着检查一遍就知道自己的板子行不行。芯片必须自带USB外设。STM32F103、F105、F107、F2、F4、F7、L4等系列大多都有USB接口但像STM32F030F4P6、F051这些低端型号不带USB外设就不能走USB DFU通道只能考虑串口ISP或者SWD。板子上USB口的D和D-必须连接到芯片的PA11和PA12部分型号映射到其他引脚。如果你手里是一块带USB口的开发板比如常见的STM32F103C8T6核心板、F407核心板基本都是连好的。但有些板子上的USB口只是用来给板子供电两根数据线根本没接到芯片上这种就没法用USB DFU。BOOT0引脚必须方便操作。绝大多数核心板都做了跳线帽或者拨码开关。如果板子没有引出来你能用杜邦线手动接高也行。电脑系统要能装ST官方的驱动。Windows系统下第一次插入DFU设备如果不装驱动设备管理器里只会显示一个“未知设备”后面我会专门讲驱动怎么装。只要以上条件都满足恭喜你没有ST-LINK也可以愉快地烧程序了。如果不满足也别灰心后面“常见问题”里我会说说还有什么替代方案。2. 烧录前的准备工作2.1 硬件检查清单正式开工之前先把硬件环境确认好不然后面出了问题容易一头雾水。一块STM32开发板最好是常见的最小系统板或者核心板。我自己常用来演示的是STM32F103C8T6蓝色Pill板它的USB口直接连到了PA11和PA12板上有BOOT0跳线帽操作起来非常方便。一根能传数据的USB线。注意不是所有USB线都能传数据。很多网上买的小电器附带的充电线里面的D和D-根本没接插上去只能充电设备管理器里什么都不会出现。如果你插上板子后毫无反应第一步就是换一根线试试这个坑我踩过太多次了。一个跳线帽或者杜邦线。核心板上通常只有一个BOOT0跳线帽把它从“0”拨到“1”就能进DFU。电脑一台Windows系统最省心。macOS和Linux也能用命令行工具或开源工具做DFU烧录但设置门槛高一些新手建议还是先拿Windows练手。还有一点容易被忽略进入DFU模式前把板子上的其他外设连接尽量断开。特别是如果板子上同时接了显示屏、传感器这类耗电模块USB供电可能不太稳导致DFU枚举失败。我习惯只保留USB线连接主板其他外围全部拔掉等烧完再插回去。2.2 驱动安装别让电脑“不认识”你的板子把BOOT0拨到1用USB线插上电脑这时候Windows系统一般会有两种反应要么提示“安装驱动程序”设备管理器里出现“STM32 BOOTLOADER”要么显示一个带黄色感叹号的“未知设备”。如果是后者就是驱动没装上。其实在STM32的开发工具链里驱动经常是“赠品”。安装STM32CubeProgrammer或者老牌的STM32 ST-LINK Utility时安装包会一并装好ST的USB驱动。如果你电脑上从来没装过ST的任何工具我建议直接装STM32CubeProgrammer它现在是官方的主力烧录工具新老用户通吃以后配合ST-LINK也能用。有时候驱动装到一半提示失败或者设备始终显示未知设备大概率是Windows的驱动签名策略卡住了。Win10以上的系统有一个“禁用驱动程序强制签名”的启动选项步骤是设置 - 更新和安全 - 恢复 - 高级启动 - 立即重新启动然后选择“疑难解答 - 高级选项 - 启动设置 - 重启”开机后按数字键7选择禁用驱动签名。进了系统再重新安装驱动一般就能解决。如果你的系统比较新或者官方驱动怎么都装不上还有一个民间偏方用Zadig工具给DFU设备安装WinUSB驱动。Zadig是个开源驱动安装工具它会列出当前连接的所有USB设备找到“STM32 BOOTLOADER”之后把驱动替换成WinUSB。实测下来这个方法在Win11上很稳能直接让STM32CubeProgrammer识别到设备。不过要注意用Zadig替换驱动之后再使用其他ST工具时如果识别不到设备就需要把驱动换回来所以推荐新手优先用官方驱动。2.3 软件选型不同工具的适用场景DFU烧录有好几个软件可选我分别说说它们的定位和优劣这样你就能根据自己情况选。STM32CubeProgrammer官方新一代烧录工具功能最全面。支持ST-LINK、USB DFU、UART、SWD等多通道下载界面直观直接选hex或bin文件就能烧。新手无脑选这个我推荐它作为首选。DfuSeDemo DfuFileMgr这是ST早期的DFU专用工具老工程师应该都不陌生。它的特点是非常轻量只要驱动装好打开就能用。但它只接受dfu格式的文件不是直接读取hex需要先用DfuFileMgr把hex转换成dfu多一层步骤。STM32 ST-LINK Utility名字里带ST-LINK但它的主要用途其实是配合ST-LINK仿真器用的并不适合我们“没有ST-LINK”的场景。网上搜这个工具的人很多可能因为大家习惯了ST官方工具都以St-LINK命名这里提醒一下别搞混。J-Flash这是SEGGER家的工具功能很强但它依赖J-Link硬件。你手里连ST-LINK都没有的话大概率也没有J-Link所以这里也不展开。工具不用贪多我的建议是新手上路只用STM32CubeProgrammer一个就够能覆盖从DFU到ST-LINK的整个烧录需求。DfuSeDemo可以作为备胎以后遇到老设备或者想折腾一下转换流程再拿出来玩。3. 保姆级实操一根USB线完成烧录3.1 先用Keil生成hex文件DFU烧录需要准备一个程序固件最常见的就是在Keil工程里编译生成的hex文件。如果你已经有现成的hex跳过这一步也行。但如果你是新建的工程一定记得检查一下Keil里有没有勾选生成hex的选项。打开Keil工程点击菜单栏的“Options for Target”切到“Output”选项卡在“Create HEX File”前面打勾然后点确定。重新编译一次编译完成后去工程的Objects或者Listings文件夹下找后缀为.hex的文件。没有看到的话就在Keil的Build Output窗口看一下输出路径里面会写着生成的hex文件具体在哪。这里有个细节Keil默认生成的hex文件是Intel HEX格式里面包含地址信息烧录工具能自动识别下载地址。如果你的固件是用GCC或者其他工具链生成的bin文件就需要在烧录时手动指定起始地址一般程序放在0x08000000开头。我建议新手先用hex格式省事很多。3.2 进入DFU模式并连接电脑硬件操作很简单但顺序很关键我一般按这个流程来板子断电拔掉所有USB线和电源。把BOOT0跳线帽从“0”侧拨到“1”侧也就是高电平状态。BOOT1如果板上有跳线帽保持在“0”侧不动即可。用USB线把板子连到电脑。插上后Windows会有设备插入的提示音。打开设备管理器展开“通用串行总线设备”或者“端口”看到“STM32 BOOTLOADER”就说明成功进入DFU模式了。如果看到的是未知设备参考上一节的驱动安装方法处理。这里我特别提醒一个容易翻车的操作不要让板子还接着外部电源再去拨BOOT0跳线帽。虽然多数情况下热切换也没事但有些板子的电源设计不够完善带电操作容易引起意外复位或者枚举失败治根的办法就是断电后再改跳线一劳永逸。3.3 用STM32CubeProgrammer完成烧录STM32CubeProgrammer是ST官方出的多合一烧录工具界面经过多个版本迭代现在对DFU模式的支持已经非常成熟了。下载安装包之后一路默认安装就行安装过程会顺便装好所需的USB驱动。打开软件进入主界面后左侧会有一排连接方式默认选中的是“ST-LINK”。我们要把它切换成“USB”此时下面的端口下拉框里会列出检测到的DFU设备如果没有自动出现点一下旁边的刷新按钮。如果端口下拉框里是空的且确认驱动已经装好就把USB线重新插拔一次再刷新。连接参数保持默认即可当前界面里的“Port”显示的是USB DFU通道不需要手动设置波特率也不用选串口号。然后点击右上角的“Connect”按钮软件会去枚举设备并读取芯片信息。连接成功后左侧的“Memory and File”区域会显示芯片的Flash起始地址和大小常见F103C8T6显示0x08000000起始、64KB大小F407VE显示1MB容量。如果这个区域空白说明连接没成功回到驱动排查那一步。接下来点击左侧的“Erase Programming”图标或者顶部的下载按钮在“Download”区域点击文件选择框旁边的文件夹图标选中你要烧录的hex文件。软件会自动识别hex文件里的起始地址无需手动填写。然后确认“Verify programming”复选框是勾选状态这会在烧录完成后自动对比Flash内容和文件内容防止写入出错。最后点击“Start Programming”进度条开始滚动整个过程从擦除到写入再到校验十几秒就能完成底部日志区会输出“Download verified successfully”之类的提示。下载完成后不要急着拔线先把BOOT0跳线帽拨回“0”侧然后按一下板子上的复位键没有复位键就直接断电再上电。此时芯片从主Flash启动你的程序就开始运行了。如果你烧的是点灯程序能看到板载LED在闪烁那一刻相当有成就感。3.4 用DfuSeDemo完成烧录备选方案既然标题里提到了DFU模式那就绕不开ST家祖传的DfuSe工具。虽然现在用CubeProgrammer更顺手但DfuSe在很多老教程和老工程师的记忆里还是默认选择会用它也算一个技能点。首先准备好dfu文件。DfuSe工具包里有两个程序DfuFileMgr负责把hex转成dfuDfuSeDemo负责烧录。打开DfuFileMgr在“I want to”区域选择“Generate a DFU file from an existing hex file”然后在“Hex or S19 file”里选中你的hex文件“Output”里设置生成dfu文件的路径。Generator Parameters里默认选项不用动点击“Generate”就会生成一个同名的.dfu文件。然后打开DfuSeDemo前提是DFU设备已经被电脑识别且驱动是ST官方的版本。软件界面最上面“Available USB Devices”列表里会显示“STM32 BOOTLOADER”选中它。点击右边的“Choose”按钮加载刚才生成的dfu文件下面一行“Target”会显示“STM32...Internal Flash”点击“Upgrade”开始下载。下载过程中软件会先擦除Flash再写入数据最后自动校验。看到“Download operation successful”就说明烧录成功。DfuSeDemo相比CubeProgrammer多了一步hex转dfu的操作而且dfu文件格式比较老现在很多新工具已经不支持了。但如果你在做一个需要量产或者给客户升级固件的项目dfu格式因为自带目标地址和设备标识分发起来更不容易出错这也是它没有被完全淘汰的原因。3.5 烧录成功后必须要做的事程序烧进去、LED亮了整个流程看起来就结束了。但我每次都会多做两件事这里也分享给大家第一把BOOT0跳线帽拨回“0”侧确保以后上电都是从主Flash启动。如果忘了拨回去下次插上USB上电又会进DFU模式程序不跑你还会以为板子坏了。这个坑我自己就踩过还一度以为芯片被烧了。第二用STM32CubeProgrammer断开连接后重新插拔一次USB线或者手动复位板子确认设备管理器里没有再出现“STM32 BOOTLOADER”。这样能确保当前状态是正常的用户程序运行状态而不是Bootloader状态。DFU烧录不太适合高频调试每烧一次就要拨跳线、重启、等枚举效率比SWD调试器低不少。但它的价值在于“应急”和“救砖”。当你的调试器不在手边或者芯片被写成了砖DFU往往是在没有任何额外硬件的情况下唯一能救回来的通道。4. 常见问题与排查实录DFU烧录过程中会遇到一些很典型的坑我把自己踩过的和帮别人排过的问题都整理在下面按“现象 - 可能原因 - 处理方法”的思路列成表格方便你对着排查。现象可能原因处理方法插入USB后设备管理器完全没反应USB线只支持充电没有数据传输USB口接触不良换一根确定能传数据的线换一个USB口最好是主机后面的USB 2.0口设备管理器出现黄色感叹号的“未知设备”ST驱动未安装或驱动签名被系统拦截安装STM32CubeProgrammer重新插拔或者用Zadig把驱动换成WinUSBDfuSeDemo提示“Cannot open device”设备没有进入DFU模式驱动和软件不匹配检查BOOT0是否为1且已重新上电确认设备管理器枚举名是“STM32 BOOTLOADER”STM32CubeProgrammer一直卡在“Connecting”连接方式选成了ST-LINK设备端口下拉框没选对在左上角选择“USB”下拉框中选中DFU设备再Connect下载进度条走到一半报错USB供电不足下载过程中线被碰松Flash写保护开启换一个供电更稳的USB口不要用前置USB口检查芯片读保护等级必要时执行“Full chip erase”解除保护校验失败提示地址错误文件选成了bin格式且起始地址不对hex文件本身有问题优先使用hex文件软件会自动识别地址用DfuFileMgr重新转换一次dfu文件烧录成功但程序没有运行BOOT0还在“1”位置没有复位程序本身有问题把BOOT0拨回“0”并按复位在Keil里重新编译查错再烧一次4.1 设备枚举不上的排查顺序如果你遇到了设备识别问题别慌按这个顺序一步步来绝大多数都能解决第一步排除线的问题。换一根你确定能传数据的USB线比如手机的原装数据线重新插拔。第二步排除接口问题。不要用机箱前面的USB口那个口供电不稳且常接触不良优先用主机背面的USB 2.0接口。第三步重新上电。把USB线拔掉BOOT0拨回0等待几秒再拨到1重新插线。确保芯片是在BOOT0为高的情况下上电的因为Bootloader只在启动那一刻读取引脚状态。第四步查驱动。打开设备管理器看有没有“STM32 BOOTLOADER”或者未知设备。有未知设备就装驱动有STM32设备但你的软件连不上就卸载设备再重新扫描硬件改动。这四步走完95%以上的枚举问题都能解决。如果还不行检查一下板子的USB座子是否虚焊或者看看核心板上有没有焊接问题导致PA11和PA12没通到USB口。4.2 下载失败最常见的四个原因DFU下载失败问题多半不在硬件而是集中在以下几个方面文件格式选错。DfuSe只认dfu格式直接给它hex文件肯定报错。CubeProgrammer支持hex和bin但如果你用bin一定记得起始地址要填0x08000000。芯片Flash保护。有些板子出厂时可能被人设置了读保护DFU连接时CubeProgrammer会弹窗提示保护等级。这时需要在“Option Bytes”页面把Level改成Level 0但要注意解除保护会执行全片擦除相当于清空Flash。下载地址错误。hex文件自带了地址信息很少会出问题。但如果你用DfuFileMgr转换的时候勾错了Target生成的dfu可能指向0x08000000以外的区域下载时就会校验失败。重新转换一次目标选Internal Flash。下载过程中断电。DFU写入是整片擦除再写入如果在擦除完成后断电Flash是空的下次上电程序自然跑不起来。这种情况下重新再烧一次就行Bootloader区域是独立的不会被擦掉所以就算写失败了还能再进DFU重来这也是DFU模式让人安心的地方。4.3 救砖经验DFU是最后一根救命稻草最后说一说DFU模式最让我欣赏的一个能力救砖。很多刚入门的朋友不小心把SWD引脚禁用掉比如在程序里把PA13、PA14配置成了GPIO输出导致ST-LINK再也连不上或者配置错了时钟树芯片一上电就死机。遇到这种情况常规的SWD烧录已经没法操作了整个人会很慌。但只要你的板子支持USB DFU把BOOT0拉高重新上电芯片就会从系统存储器启动用户程序里所有的错误配置都不会被执行。这时候用CubeProgrammer USB连接把正常程序重新烧进去芯片就满血复活了。我第一次“变砖”时根本不知道有这一手折腾了一晚上还专门跑去找别人借了个J-Link。后来明白了DFU这个逻辑才发现当初只要一根USB线加一个跳线帽就能自救。所以我现在的习惯是拿到新板子先不用调试器直接把DFU流程跑一遍确认板子的Bootloader通路是好的再开始后面更复杂的开发。这个习惯帮我省了不少事也让我对每一块板子的“底牌”心里有数。说到底DFU模式是STM32出厂送给你的一条保险通道。ST-LINK是工具DFU是退路两者不是替代关系而是互补关系。工具可以没有但退路一定要会用。希望这篇教程能让你在没有ST-LINK的时候也能凭着一条USB线把程序烧进去更希望你能在以后遇到芯片“变砖”的时候想起还有DFU这条路可以走。
企业数字化 ERP 产品动态
相关推荐
咪咕盒子MG100/MG101刷机全攻略:卡顿修复、固件短接与救砖详解 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/9/24 13:10:53
车载以太网中间件选型:SOME/IP、MQTT与DDS的对比与实战 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/9/24 13:10:53
COT控制模式详解:从原理到实战,解决降压电源环路补偿与瞬态响应 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/9/24 13:10:47
同城小程序源码实战:多城市部署与二次开发全指南 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/9/24 13:37:44
Cytoscape.js breadthfirst 布局完全指南:基于 BFS 的层次化树图布局算法与参数详解 数据可视化 【免费下载链接】cytoscape.js Graph theory (network) library for visualisation and analysis 项目地址: https://gitcode.com/gh_mirrors/cy/cytoscape.js 点击查看 免费下载 导读:breadthfirst 是 Cytoscape.js 内置的八种布局之一&… · 2026/9/24 13:37:44
开源掌机DIY工作坊:从硬件选型到系统烧录的完整指南 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/9/24 13:37:44
ManageEngine卓豪-多域环境推荐用什么 AD 域管理工具? 熟悉AD域管理的运维人员都清楚,单域场景下,系统自带的ADUC图形工具足以满足日常操作,复杂场景依靠PowerShell脚本就能兜底。但企业业务持续扩张、分子公司独立部署、企业并购整合,都会催生多域、多林的复杂AD架构。
不同于单域管… · 2026/9/24 13:37:38
【Dv2Admin】CRUD时间范围区间周选择组件 在编程开发中,日期选择器是非常常见的组件,特别是在需要对时间进行严格管理的场景中,正确地配置起始时间和结束时间显得尤为重要。默认情况下,el-date-picker 的日期选择器以周日为一周的开始,这与某些用户的时间管理习惯可能不符,尤其在涉及国际项目时。
为了满足多样化… · 2026/9/24 13:37:38
palera1n 完整指南:如何用 checkm8 越狱工具让 A8–A11 老设备快速越狱 palera1n 完整指南:如何用 checkm8 越狱工具让 A8–A11 老设备快速越狱 【免费下载链接】palera1n Jailbreak for A8 through A11, T2 devices, on iOS/iPadOS/tvOS 15.0, bridgeOS 5.0 and higher. 项目地址: https://gitcode.com/GitHub_Trending/pa/palera1n … · 2026/9/24 13:37:32
基于YOLOv8的渔船作业监控系统:从环境搭建到边缘部署全流程 简介:这是一套面向计算机、人工智能、自动化等专业学生与教师的毕业设计级项目资源,围绕YOLOv8实现渔船作业监控系统,可用于毕设、课程设计、大作业或项目立项演示。压缩包共97个文件,约24.21MB,以70个Python源码文件为… · 2026/9/24 0:00:13
1D-CNN时间序列建模实战:从Conv1d原理到工业落地 简介:面向时间序列数据建模的一维卷积神经网络完整实现,适合深度学习入门者及需要快速验证时序模型的研究者,能够从音频、文本、传感器或股价等序列中挖掘局部特征与时间依赖。压缩包体积很小,只有3KB,内含3个Python脚… · 2026/9/24 0:00:26
柔软的L:汉语语流中被忽视的舌肌张力控制 1. 这个“L”不是字母表里的L,而是舌尖上的L最近在几个方言群和语音教学社群里,反复看到有人发一句:“也说字母L:柔软的长舌”。初看以为是英语发音课笔记,点开才发现全是方言爱好者、播音系学生、语言康复师甚至戏曲演… · 2026/9/24 0:00:44