ARTICLE · INTELLIGENCE

战地情报 · 详情页

来自尧图项目组的一线实战观察与深度解析

STM32无ST-LINK烧录指南:USB DFU模式原理与实操

STM32无ST-LINK烧录指南:USB DFU模式原理与实操 做STM32开发最常见的痛点是手边没有ST-LINK偏偏固件非要更新不可。其实只要你的板子带原生USB口一根普通的USB数据线就能通过DFU模式完成烧录完全绕开ST-LINK。这个方案我实测过很多次踩过不少坑尤其是驱动识别和BOOT引脚设置这两块。今天把这套流程完整写出来换个环境、换块板子照样能用。这篇文章适合这么几类人手头只有板子和USB线、临时找不到调试器的同学想给产品做USB固件升级、但不想每次拆机插SWD的工程师以及刚入门STM32、想搞明白BOOT引脚和程序下载机制的新手。我会把DFU的原理、准备、实操步骤、常见问题全部讲透读完你就能自己上手。1. DFU模式是怎么回事为什么不用ST-LINK也能烧1.1 理解DFU芯片出厂时自带的一段“固件搬运工”很多人第一次听说DFU第一反应是“这是什么高大上的协议”。其实理解起来非常简单DFU全称Device Firmware Upgrade是USB协议里定义的一种标准设备固件升级方式。STM32芯片出厂时在内部一块专门区域System Memory系统存储区固化了一段不可擦除的引导程序。这段程序的任务只有一个通过USB接口接收电脑发来的新固件然后写入用户程序所在的主Flash区。说人话就是STM32出厂自带了一个“USB下载器”只是这个下载器不在盒子外面而是藏在芯片内部。平时我们用ST-LINK给芯片烧程序ST-LINK走的是SWD接口相当于从外面“闯进”芯片下载。而DFU模式是让芯片自己跑一段引导代码这段代码把USB传来的固件数据写进内部Flash。前者是外部烧录器后者是内部自收自存。DFU模式有几个明确的特点第一它不需要额外的烧录器硬件有一根USB线就行第二它不能在线调试没法打断点、看变量功能上是纯粹的“下载器”第三它烧写的速度一般比ST-LINK慢一些但胜在方便第四它烧写进去的程序默认从主Flash的0x08000000地址启动不用手动修改启动地址。1.2 为什么要走DFU哪些场景最划算我推荐DFU模式并不是说要完全抛弃ST-LINK。ST-LINK能干很多DFU干不了的事比如在线仿真、变量观察、断点调试。但实际项目里总有那么几种情况DFU是最优解。最典型的场景就是你出差或者去实验室调板子只带了板子和线调试器落在办公室了。这时候固件里有个小Bug要验证又没法等到回去再改DFU就是救命稻草。第二个场景是产品升级。产品已经封装好、贴片完甚至已经发给客户了要更新固件。总不能让人家拆机接ST-LINK吧如果产品上有USB口通过DFU模式升级是最省事的方案之一这也是很多量产设备的实际选择。第三个场景是电路板SWD接口被程序误配置占用了。比如你一不小心把PA13/PA14SWDIO/SWCLK复用成了普通GPIOST-LINK就连不上了。这时只要芯片支持USB DFU就能通过DFU模式先把错误程序覆盖掉把SWD口“救回来”。这个场景我遇到过不止一次真的是救急神器。但要注意一点DFU说到底只是“下载”不能替代调试。如果你在开发阶段需要频繁单步调试、查看变量变化ST-LINK依然是必须的。DFU更适合应急下载、批量升级、程序救砖这类的实际使用场景。1.3 先确认你的板子适不适用这个方案DFU模式不是所有STM32都支持也不是所有带USB口的板子都适合这里必须先说清楚否则你跟着操作到一半会发现根本进不了DFU模式会非常沮丧。首先芯片本身必须带USB外设且系统存储区里有DFU引导程序。绝大多数带USB的STM32型号出厂都内置了DFU bootloader比如最常见的STM32F103系列、F401系列、F407系列、F411系列等。不带USB外设的型号比如STM32F103C8T6是带USB的但如果换成某些精简封装的芯片就要查一下型号的选型手册确认。其次也是大家最容易踩坑的地方板子的USB口必须是从MCU的USB引脚直接引出而不是通过USB转串口芯片引出。市面上大量STM32F103C8T6蓝色最小系统板板载一个USB口但那个USB口接的是CH340G串口芯片你插上去电脑识别到的是“USB转串口”不是STM32的USB设备。这块芯片虽然本身有USB功能但PA11/PA12并没有连接到USB座上所以走不了DFU。要硬走也可以自己飞线把PA11/PA12引到USB座上但一般新手不建议这么折腾。适合DFU的板子长什么样比较典型的就是STM32F401CCU6/F411CEU6黑色核心板、STM32F407最小系统板、野火/正点原子的探索者系列这些板子的USB口直接连到MCU的USB D/D-引脚上。如果你的板子手册上写“USB Device接口”或者“USB Slave接口”那大概率就是原生USB口可以走DFU。我列一个简单的对照表方便你判断手头的板子能不能用这个方案板子类型板载USB口连接方式是否支持USB DFUF103C8T6蓝色板PA11/PA12未引出USB口接CH340串口芯片不支持默认状态F103C8T6蓝色板已飞线引出PA11/PA12USB口直接连MCU支持F401CCU6/F411CEU6黑色板USB口直接连MCU支持F407探索者/核心板USB Device口直接连MCU支持自制带USB头的核心板USB口直接连MCU支持判断方法其实很简单把USB口旁边的芯片型号拍下来查一下如果USB口旁边是CH340、CP2102这类串口芯片那基本没戏如果USB口直连到MCU的引脚走线那大概率可以。2. 烧录前的准备硬件、软件和固件格式2.1 硬件清单其实真的不多DFU烧录的硬件要求很低我整理一下需要的东西第一一块MCU支持USB DFU且板子上有原生USB口的STM32板子。这是前提前面已经说过怎么判断了。第二一根USB数据线注意是数据线不是只能充电的电源线。这个细节非常容易忽略很多线材看着一模一样但内部只有电源线没有数据线插上后根本就没有USB枚举动作。我建议你多备两根线最好用那种标着“USB 2.0 High-Speed”的线别用“快充线”——快充线很多是纯电源线。第三跳线帽或者杜邦线用来设置BOOT0引脚状态。部分板子带了BOOT0按键那就更省事。另外提一个经验连接电脑时优先用USB 2.0口直插主机后面板不要用USB Hub尤其是那种多个设备共用的Hub。DFU枚举阶段对USB信号稳定性要求挺高Hub会引入延迟和干扰我之前用好几个Hub试过经常出现枚举失败或者下载中断的问题直插后稳多了。2.2 软件准备只装一个STM32CubeProgrammer就够软件方面我推荐就是ST官方的STM32CubeProgrammer现在最新的版本是V2.x。为什么要用这个因为老一代的ST-LINK Utility不支持DFU模式它只能配合ST-LINK或J-Link这类调试器使用。很多新手一开始不了解装了ST-LINK Utility发现怎么都连不上USB DFU设备折腾半天。STM32CubeProgrammer是ST新一代的下载调试工具一个软件就能同时支持ST-LINK、DFU、串口ISP三种下载方式界面又直观建议直接用它。STM32CubeProgrammer是个免费软件去ST官网或GitHub上就有下载ST官方网址随意搜索即可。下载后正常安装即可。DFU驱动也需要说明。Windows系统下STM32进入DFU模式后不会像普通U盘那样自动显示盘符也不会自动识别成“STM32 BOOTLOADER”设备很多时候系统只会弹一个“设备安装不成功”或者干脆没反应。原因就是欠缺DFU驱动。好消息是STM32CubeProgrammer安装时会在安装目录下带上驱动通常在安装路径里的Drivers/DFU或Drivers/DFU/STSW-STM32080_目录下里面有个dpinst_amd64.exe或dpinst_x64.exe。右键管理员身份运行几秒钟就能把驱动装好。这里插一个驱动相关的细节Win10和Win11系统下如果你插上设备后看到设备管理器里出现一个带黄色感叹号的“STM32 BOOTLOADER”或“Unknown device”不要慌右键这个设备选择“更新驱动程序”然后选择“浏览我的电脑以查找驱动程序”再指定到STM32CubeProgrammer安装目录下的Drivers/DFU目录Windows就会自动匹配安装。装好之后设备管理器里会正常显示“STM32 BOOTLOADER”或者“STM Device in DFU Mode”此时驱动这块就算通了。2.3 固件文件hex和bin到底用哪个烧录程序总得有固件文件。STM32工程编译之后一般有两个格式可以用hex和bin。Keil MDK默认可以配置生成hex文件。操作很简单在Keil工具栏点“Options for Target”——“Output”标签页——勾选“Create HEX File”。这样每次编译后在输出目录里就会有一个.hex文件。这个文件里包含了地址信息STM32CubeProgrammer读出来后会自动放到正确的位置所以对于新手我建议直接用hex文件不容易错。bin文件是纯二进制数据不带地址信息烧写时需要自己填写起始地址通常是0x08000000。bin文件通常体积比hex更小在某些OTA升级场景里用得更多。如果你用gcc arm-none-eabi编译默认生成的是elf文件需要转换成bin或hex。ELF转HEX用arm-none-eabi-objcopy -O ihex xxx.elf xxx.hex转bin用arm-none-eabi-objcopy -O binary xxx.elf xxx.bin。DFU模式下hex和bin都能烧差别只在于地址。我早期用DFU烧了一张bin文件结果没填起始地址直接烧到了“错误地址”程序当然跑不起来。现在我的习惯是优先用hex省心。3. 让STM32进入DFU模式BOOT引脚设置与USB连接3.1 BOOT0/BOOT1怎么拨理解启动模式的关键STM32芯片内部有几种启动方式通过BOOT引脚的电平来决定上电后从哪段代码开始运行。这一点是整个DFU流程中最关键、也最容易被忽略的部分。以最常见的STM32F103为例芯片复位后根据BOOT0和BOOT1引脚的电平组合决定从哪里取一条指令执行BOOT0 0从主Flash启动也就是跑0x08000000地址处的用户程序这是正常模式。BOOT0 1BOOT1 0从系统存储器启动而这个系统存储器里放的就是出厂固化的DFU引导代码。BOOT0 1BOOT1 1从内部SRAM启动这个模式平时用得很少。所以要进入DFU模式核心操作就是把BOOT0拉高置为1同时确保BOOT1为低置为0。这里要注意有些板子只有BOOT0引脚跳线没有BOOT1引脚BOOT1已经在板上被默认拉低了那么只需处理BOOT0即可。如果板子同时有BOOT0和BOOT1两个引脚一定都要检查尤其是DIY板子BOOT1悬空的话很可能引入随机电平导致进不了系统存储器。很多STM32F103系列板卡上BOOT0旁会有一个跳线帽短接是“1”拔掉是“0”。F401CCU6/F411CEU6这类黑色核心板也一样通常BOOT0跳线帽短接为1。有的板子引出了BOOT0按键按住再上电就是拉高。准备DFU时先把跳线帽跳到“1”或者按住BOOT按键。3.2 上电与复位的正确顺序硬件上电和复位的顺序也决定了你能不能稳定进入DFU模式。我经常看到新手直接把BOOT0跳成1就插USB结果电脑毫无反应以为是板子坏了。其实多数情况下是复位没做好。正确的操作顺序应该是这样的断开USB线把BOOT0引脚设置为1BOOT1保持为0。用USB数据线连接电脑与板子。上电瞬间因为BOOT0为1芯片会从系统存储区启动。如果板子上有NRST复位键按一下就更是“板上钉钉”了。按下复位键会强制芯片从系统存储区的开头重新执行引导代码。等2秒左右打开电脑的设备管理器查看通用串行总线设备里是否出现了“STM32 BOOTLOADER”或者“STM Device in DFU Mode”。为什么要强调复位因为有些情况下芯片上一次的电平状态会很“顽固”。比如之前烧录的程序已经把USB引脚配置成了GPIO模式即使你改了BOOT0重新上电时某些内部状态未必会干净复位。按一下NRST能确保CPU从系统存储区全新建栈、启动DFU引导程序才能真正跑起来否则可能就是“假死”状态电脑啥也识别不到。另外提醒一下USB线插好后不要反复热插拔。DFU识别失败的板子有时候插拔两次还是稳定识别有时候第三次才识别其实不是坏了是USB信号不稳定。耐心等几秒即可反复插拔反而容易触发Windows的异常设备状态累积最后要重启电脑才能恢复。3.3 驱动安装的细节为什么设备管理器里总有个感叹号插上USB线、BOOT0设置为1、复位完成之后正常情况是这样的第一步Windows右下角弹出“设备连接”的提示音。第二步设备管理器里出现一个新的USB设备。如果驱动没装好显示为“STM32 BOOTLOADER”或者“未知USB设备”旁边有一个黄色感叹号。第三步右键该设备更新驱动指定到STM32CubeProgrammer安装目录下的Drivers/DFU路径安装完成后感叹号消失显示“STM32 BOOTLOADER”。如果设备管理器里一点变化都没有那问题可能出在几个方面USB线是不是数据线换一根试一下这是最经常出问题的点。BOOT0是否真的拉高了用万用表量一下引脚电平更保险。板子上有没有独立供电有些板子要同时接USB和外部供电才能正常启动只有USB供电可能电流不足导致DFU引导程序无法稳定运行。电脑USB口是不是有省电模式Windows的“USB选择性暂停”有时会干扰枚举到电源选项里关掉它。安装驱动时有两个注意事项。第一必须以管理员身份运行driver安装程序否则会提示权限不足。第二安装完驱动后最好重新插拔一次USB线让Windows重新枚举一次设备确保驱动生效。我个人实际测过Win10、Win11、Win7三个系统Win11下偶发驱动签名问题如果安装失败要到“系统设置——恢复——高级启动——禁用驱动程序强制签名”后再安装。Win7最麻烦的是系统可能没装全补丁建议优先装Win10环境。4. 实操烧录STM32CubeProgrammer完整操作流程4.1 打开工具并连接DFU设备第一次打开STM32CubeProgrammer界面右边会有一排连接方式的图标包括ST-LINK、ST-LINK Server、USB、UART等。这里我们要点“USB”然后在Mode下拉框里选择“DFU”。如果下拉菜单里没有DFU选项说明你的软件版本太老升级到新版本即可。点击“Connect”按钮之后软件会扫描USB上的DFU设备。连接成功的标志是左侧的Target memory区域能读取到芯片的Flash大小上方能看到芯片型号比如STM32F401CCU6或者STM32F407VET6下面还能读到Device ID、Revision ID以及Unique ID。如果以上信息都出来了说明DFU链路完全打通了。如果点击Connect后报错最常见的错误提示是“No STM32 target found”或者“Error: DFU ... No STM32 target found”。这种报错不用慌按后面的排查章节处理就行。一个额外的提示如果电脑上同时插着多个DFU设备我没见过几个但确实存在可以在URL栏里直接指定设备编号比如usb://usb1、usb://usb2。命令行模式下这个功能尤其有用批量下载时可以精确指定端口。4.2 选择固件并下载连上DFU设备后中间区域会显示当前目标Flash的信息。接下来就非常简单了点击中间的“Open file”按钮选择一个hex或bin文件。如果选择了hex文件软件会自动解析文件里的地址信息然后在你点击“Download”按钮后把程序烧写到对应位置。如果是bin文件需要在“Address”栏里手动填写起始地址默认是0x08000000一般不用改。点击“Download”后界面下方的Log区会滚动打印烧录过程比如“Erasing sector 0 0x08000000 done”、“Download in progress”之类。当进度条走到100%提示“Download verified successfully”或者“Programming completed”就说明烧录成功了。注意烧录过程中千万不要拔USB线否则可能出现Flash部分写入、半区擦除的尴尬状态要让板子重新恢复出厂DFU状态都比较麻烦。我遇到过朋友烧录到一半拔线结果板子直接变砖后来又是进入DFU重刷才救回来。4.3 复位运行为什么明明烧好了却不跑烧录完成之后不要急着欢呼。此时芯片还停留在“DFU引导程序”里如果你重新上电依然会进入系统存储器启动而不是用户程序。要让它真正运行你烧的固件还要做关键一步把BOOT0跳线帽恢复到0。具体操作断开USB线把BOOT0跳线帽从1拨回0再重新插上USB线供电或者按一下复位键。此时芯片会从主Flash的0x08000000启动也就是你刚烧进去的用户程序。如果这一步漏了现象非常典型板子插上电电源指示灯亮但程序就是不跑你甚至都怀疑是烧录没烧对。其实程序已经在Flash里了只是没被启动。我在这里栽过好多次跟头特别提醒各位。要验证烧录是否成功可以观察开发板上的LED灯是否闪起来、串口有没有打印输出、或者用手头的其它外设确认。如果程序本身用到了USB比如USB虚拟串口、HID设备插上USB线后电脑还会出现对应的新USB设备这也能侧面验证固件在正常工作。4.4 用命令行烧录适合批量和自动化的进阶操作STM32CubeProgrammer不只是图形界面它还带一个命令行工具叫STM32_Programmer_CLI。这个工具对自动化生产、批量烧录很有用也可以写到脚本里做CI/CD集成。烧录一条指令就够了STM32_Programmer_CLI -c portusb1 -d firmware.hex其中-c portusb1指定连接USB DFU设备-d firmware.hex指定固件文件。如果电脑只接了一个DFU设备usb1通常就是它。不确定的话可以先运行STM32_Programmer_CLI --help查看所有参数。命令行还有个很有用的选项-ob可以用来操作选项字节比如设置读保护级别。如果产品上市后不想被别人把固件读走可以在固件烧完后再通过命令行设置RDP级别为1保护Flash内容。命令行模式看起来零碎但用到批量生产的时候就体会出优势了。产线上不用人手点界面脚本跑一遍效率翻倍。5. 没有ST-LINK还能这样烧串口ISP与自制Bootloader的思路5.1 串口ISP用USB转TTL也能下载其实“没有ST-LINK”的应急方案不止DFU一种。如果你手头连原生USB口的板子都没有但有USB转TTL模块比如CH340小板、CP2102模块也还有一个选择串口ISP下载。STM32出厂系统存储区里的引导程序除了USB DFU之外还同时支持串口下载。比如STM32F103是通过USART1的TX/RX引脚接收数据配合上位机软件早期的Flash Loader Demonstrator、MCUISP、或者STM32CubeProgrammer的UART模式就能把固件烧进去。操作上也是把BOOT0拉高BOOT1拉低让芯片从系统存储器启动不过这时候总线是USART1而不是USB。串口ISP的优点是硬件门槛更低一块几块钱的CH340模块就能搞定缺点是速度比较慢几十KB的固件可能要好几分钟而且要通过串口芯片的TXD/RXD去接MCU的RX/TX对连线方向有要求交叉连接接反了没反应。DFU相比之下是纯USB线直连没有这些连线烦恼。但是要注意串口ISP使用的USART1引脚PA9/PA10不是所有板子都引出来了有些小板子甚至没有排针那还得自己飞线就又麻烦了。所以到底选DFU还是ISP完全取决于你板子的物理条件。我的建议是原生USB口优先DFU优先没有原生USB时才考虑串口ISP。5.2 自制BootloaderDFU思路的延伸如果你项目用的是没有USB外设的芯片比如STM32F103C8T6的非USB型号、或者STM32G030系列这种低成本芯片连DFU都用不了怎么办其实DFU的核心思路——让一小段固定程序接收数据、写入Flash——完全是可以自己实现的。这也是热词里“STM32 OTA”的真正基础。思路是这样的在Flash的0x08000000地址烧一个用户自带的引导程序Bootloader然后在0x08008000地址放真正的应用App。芯片上电先跑BootloaderBootloader通过串口、SPI、以太网甚至你自己的私有协议接收新固件写入App区域最后再跳到0x08008000执行App。App升级时只需要更新自己Bootloader永远不坏。这个方案的好处是不再依赖原厂系统存储区协议可以自己定传输渠道可以自己选OTA升级就是这么来的。坏处是第一次必须用ST-LINK把这个Bootloader烧进去后续升级才能脱离ST-LINK。所以自制Bootloader是更深一层的能力适合产品形态定制化的项目。如果你只为了应急烧录DFU已经够了如果你要做产品量产升级、远程升级自制Bootloader值得深入了解。DFU教会你的“写在Flash里的引导程序去接收新固件”这个思路在自制Bootloader里完全是通用的。5.3 为什么原厂DFU最省事别忘了ST官方布局对比上面几种方案原厂DFU有显而易见的优点不需要额外硬件不需要自己写引导程序只要BOOT0设置对、驱动装好直接就能用。而且ST官方从系统存储区那段固件开始就把DFU协议做成了标准USB类协议电脑端的驱动和工具也都有官方支持稳定性远比自己造的轮子好。但对于芯片不带USB的型号或者要传输私有协议数据的场景原厂DFU就使不上劲了。所以我的建议是能用原厂DFU就用原厂DFU花个半天学会DFU流程比捣鼓一堆第三方工具省事太多。当你以后做产品升级方案时再考虑要不要自己写Bootloader。6. 常见问题与排查实录6.1 设备管理器完全没有反应现象插上USB线电脑一点提示都没有设备管理器也没有新设备。排查顺序先换USB线大概率是拿成了只有电源没有数据的线再检查BOOT0引脚的跳线帽是否接触良好跳线帽松了或者插反了都会导致启动模式不对然后检查板子是否有独立电源有些板子USB供电电流不足芯片根本不开机最后尝试按住NRST复位键边按边插USB线时序更稳定。如果换了线、确认了BOOT还是没反应就把USB线插到电脑后置直连接口再试一次。USB Hub和前置面板的接口经常因为供电不足导致枚举失败这个原因我遇到过好几次。6.2 设备管理器出现感叹号驱动装不上现象出现“STM32 BOOTLOADER”或“Unknown Device”但始终有黄色感叹号。原因多半是驱动文件路径不对或者权限不足。确认STM32CubeProgrammer安装目录下的Drivers/DFU目录是否存在先运行目录里的dpinst_amd64.exe用管理员身份运行。如果手动指定驱动目录也装不上试试Win10/11的“禁用驱动程序强制签名”模式重启后再装一次。再次强调装完驱动后要重新插拔USB线让系统重新枚举。6.3 Connect失败“No STM32 target found”现象STM32CubeProgrammer里点Connect日志直接报找不到目标。检查BOOT0是否为1这个是第一优先级。检查设备管理器里有没有“STM32 BOOTLOADER”这个设备没有说明驱动或枚举有问题。检查软件右上角Mode是不是选了DFU别选成UART或者ST-LINK。检查固件是否还在下载中如果有其他软件打开了DFU设备Windows下DFU设备同一时间只能被一个进程访问。6.4 烧录成功但程序不运行现象进度条走完100%烧录成功但板子就是没有现象。最可能的原因就是BOOT0没拨回0。烧录成功后芯片还在系统存储器里跑要从主Flash启动用户程序必须把BOOT0恢复为0并复位。其次看看自己是不是烧了bin文件却没填起始地址结果程序跑在错误的位置。还有一个容易忽略的地方程序里用到的时钟、外设初始化是否正确但这是程序本身的问题跟烧录无关可以先用点灯例程验证DFU流程。6.5 烧录到一半卡住或者报错中断现象烧录过程走到某个百分比就不动了或者报“Cannot communicate with device”。大概率是USB信号不稳或者是电脑在烧录过程中给USB口断电了。换个USB口直插关掉Windows的USB省电模式检查线材质量。还有可能是固件文件太大Flash空间不足。STM32F103C8T6有64KB Flash但DFU引导程序本身占据一部分实际可用空间会小于标称值。烧之前先看一下固件大小和芯片Flash容量。如果固件确实超出容量就要裁剪程序或者换大Flash的芯片。6.6 排查顺序总结我把排查顺序整理成一句话先看BOOT0再看USB线再看驱动最后看固件地址。这四步层层递进基本能覆盖95%以上DFU烧录失败的问题。不要一上来就怀疑芯片坏了——STM32芯片硬件损坏的概率极低绝大多数都是设置或环境问题。现象可能原因解决办法设备管理器没有新设备线材不支持数据、BOOT0没设对、供电不足换数据线、确认BOOT0为1、换USB口直插感叹号驱动异常驱动未正确安装管理员运行dpinst或手动指定驱动目录Connect找不到目标BOOT0不对、软件模式选错检查BOOT0、确认DFU模式、重新插拔烧录成功但没运行BOOT0没拨回0、bin地址不对BOOT0恢复0并复位、hex优先、核对地址烧录中卡住USB信号不稳、Flash空间不足换USB口、关省电模式、检查固件大小6.7 几个容易被忽略的细节用DFU模式烧录时我建议关掉杀毒软件或防火墙尤其是360、电脑管家这类它们偶尔会把STM32CubeProgrammer和DFU驱动进程当作未知程序拦截导致连接时直接被拒。不一定要卸载临时退出即可等烧完再开回来。尽量避免同时打开多个下载工具。有些人习惯开着STM32CubeProgrammer又开着ST-LINK Utility两个软件抢同一个USB设备结果谁都连不上。先关掉其他工具只用STM32CubeProgrammer一个连接DFU设备。如果以上办法全都试过了还是不行最后可以用串口ISP做备选方案实在不行再考虑用ST-LINK去把DFU引导程序“救活”。不夸张地说原厂固化的DFU引导程序一般不会坏绝大多数问题都是外围设置和驱动问题所以耐心排查总能解决。7. 一个快速验收DFU流程的小实验方法很简单先通过DFU给STM32烧入一个点灯程序观察单片机工作正常再重新进入DFU模式烧入一个不同的点灯程序比如换个闪烁频率观察运行效果差异。这个实验能一次性把“烧录流程是否正确”和“BOOT引脚切换是否熟练”两件事都验证掉。我自己在实验室带新人时第一课也是让他们走一遍这个流程。很多新人第一次用ST-LINK烧录很熟练但一上DFU就懵根本原因是没有动手做过几遍对BOOT引脚的理解停留在“别人说拉高就拉高”的层面。这个实验做完印象会非常深刻。注意点灯程序要选择最简单的GPIO输出例程不要加操作系统和复杂外设。程序里如果初始化了USB外设反而可能影响DFU启动——不过DFU是在用户程序运行之前加载的倒也不会冲突但为了验证简洁还是建议用纯净的GPIO点灯。这个实验做完你就能比较有底气地应对“没有ST-LINK”的烧录场景了。
RELATED READING

延伸阅读

更多一线实战笔记与深度复盘,助您持续精进