STM32实战:使用ST-LINK Utility烧写bin文件全流程与避坑指南

发布时间:2026/9/25 6:58:03
STM32实战:使用ST-LINK Utility烧写bin文件全流程与避坑指南 拿到这块板子第一次用ST-LINK Utility烧录bin文件的时候我也踩了一堆坑又是装驱动、又是报找不到目标、最后明明是同一个工程烧hex好好的换成bin就黑屏。这份内容就是把当时的排查过程和最终可用的流程完整梳理一遍尤其针对“连接不上”“烧完不跑”这类新手最容易遇到的卡点直接照着做就行。1. 烧录工具选型为什么推荐ST-LINK Utility很多人第一次接触STM32烧录都是从Keil MDK里点那个Download按钮开始的。那时候烧的是hex文件整个流程被Keil封装得明明白白。但到了实际项目里尤其是做产品交接、批量产测、或者从别的同事手里接管一个工程时你拿到手的往往是.bin文件——板子里的原始程序镜像。这时候再用Keil去烧还得先有完整工程非常不方便而ST-LINK Utility就是专门解决这个问题的独立烧录工具。1.1 烧录的底层逻辑先说清楚烧录到底是怎么回事。STM32内部的Flash是一块非易失性存储程序就放在里面上电后CPU从Flash取指令执行。烧录的本质就是把bin或者hex里的机器码通过调试接口比如SWD写入到这片Flash的指定地址。bin和hex最大的区别在于hex文件自带地址信息每一行都记录了自己该写到哪个地址而bin是裸的二进制数据流没有地址信息烧录时必须手动告诉他起始地址。这也是新手经常“烧进去但跑不起来”的根本原因——起始地址填错了。STM32的Flash起始地址一般是0x08000000从该地址开始的第一个字4字节是栈顶指针第二个字是复位中断向量芯片复位后会从复位向量里取出第一条指令的地址开始执行。如果bin文件被写到别的地址芯片上电后加载的栈顶和复位向量全是错的自然跑飞。1.2 工具对比与适用场景市面上能烧STM32的工具不少简单排个序方便选型。工具支持接口是否支持bin适用场景Keil MDKSWD / JTAG需配置后才能生成bin开发调试阶段配合源码单步ST-LINK UtilitySWD / JTAG原生支持界面化操作快速烧录、产测、查看Flash内容STM32CubeProgrammerSWD / UART / USB原生支持功能更全面全系列支持替代Utility的新工具J-FlashSWD / JTAG原生支持有J-LINK调试器时的替代方案MCUISP串口ISP支持bin/hex没有调试器只用串口下载ST-LINK Utility的优势在于轻量、启动快、连接稳定而且对老款ST-LINK/V2兼容性极好。即便ST官方后来主推STM32CubeProgrammerUtility依然适合快速做单片的刷写、读回、擦除。以下全流程就以ST-LINK Utility为主线展开。2. 烧录前准备驱动、硬件连接与bin文件产出烧录这件事八成的失败都发生在正式点击“Program”之前。准备工作没做好后面全是白忙活。2.1 驱动安装设备管理器优先确认ST-LINK调试器插上电脑后正常情况下系统会识别为一个USB设备。区分新版和旧版ST-LINK有简单办法观察设备管理器里的显示名称如果是“STM32 STLink”通常是老版本需要装单独的ST-LINK驱动如果显示“STMicroelectronics STLink Virtual COM Port”且带有串口说明用的新驱动一般CMake或CubeIDE安装时已经自带。驱动装好后Windows会在设备管理器“通用串行总线设备”或“端口”里列出这个设备。我建议在动手之前先去设备管理器瞄一眼如果看到一个带黄色感叹号的未知设备多半是驱动没装上。如果完全没有任何新硬件出现考虑USB线的问题——ST-LINK对数据线要求不高但某些劣质充电线只有电源没有数据会导致供电正常但通信失败。ST-LINK驱动可以从ST官网下载“STSW-LINK009”安装很简单下一步到底即可。装完强烈建议重新插拔一次ST-LINK让系统重新枚举设备。2.2 硬件连接SWD四根线搞定ST-LINK Utility通常使用SWD模式与芯片通信。SWD只需要四根线SWDIO、SWCLK、GND以及供电VCC。很多ST-LINK/V2板上还引出了3.3V输出可以给目标板供电但实际项目中我更建议各供各的减少地环路干扰。接线要注意的点SWDIO接目标板的PA13SWCLK接PA14这两个在绝大多数STM32型号上是固定的但也有极少数板子引到了其他引脚需要看原理图。GND必须共地这是通信稳定的底线。VCC用来让ST-LINK读取目标板电平如果你的目标板是3.3V接到板上的3.3V即可如果是5V系统要接到5V否则ST-LINK可能无法正确判断电平。线长尽量控制在20cm以内SWCLK频率比较高时太长的杜邦线容易引入干扰。接线完成后如果目标板供电正常打开ST-LINK Utility点击“Connect”正常情况下左下角状态栏会显示芯片型号和Flash大小。如果提示“Can not connect to target”先不要怀疑芯片坏了按后面第4节的问题排查步骤走一遍大概率能找到原因。2.3 KEIL MDK工程里一键生成bin文件拿到手的是bin文件可以直接烧但如果是自己的工程最方便的是让Keil在编译后自动把hex转成bin。方法是在Keil的Options for Target里切到User选项卡在After Build/Rebuild的下方“Run #1”里填一行命令fromelf.exe --bin -o $LL.bin #L这行命令的意思是说用fromelf工具把当前工程编译生成的axf文件转换成二进制bin文件输出到工程目录下文件名和工程名一致。L和$L是Keil提供的宏分别表示输出文件的完整路径和文件名前缀命令行里用引号包住是为了防止路径里有空格。填完之后每次编译Build成功Keil都会自动调用fromelf生成bin文件。然后你就能在工程目录下看到和工程同名的.bin文件。需要注意fromelf.exe是Keil安装目录ARM/ARMCC/bin或ARM/ARMCLANG/bin下的工具版本不同路径有差异但绝大多数情况Keil已经把它加入了环境变量直接就能用。如果想验证生成的bin是否正确可以打开“文件资源管理器”右键选择用十六进制编辑器查看文件开头。STM32的bin文件开头应该是栈指针和中断向量表前几个字节一般不是全FF如果是全FF那多半是文件生成有问题或者芯片Flash是空的。这里插一句如果你用的是GCC工具链生成bin的命令是arm-none-eabi-objcopy -O binary参数形式稍有不同但思路一致。2.4 别的生成bin的方式不一定所有人都用Keil简单补充两种STM32CubeIDE工程编译完成后在Debug目录或Release目录下会直接生成elf和bin不需要额外配置。IAR EWARM在Project - Options - Output Converter里勾选Generate additional output格式选Raw binary并设置起始地址即可。格式选好之后IAR每次编译都会生成.bin。实际上IAR这一步比Keil还直观适合新手操作。3. 用ST-LINK Utility烧录bin文件全流程准备工作做完进入真正的烧录环节。整个流程用文字拆开每一步都标注好了操作位置。3.1 安装软件并打开主界面ST-LINK Utility的安装包在ST官网搜“STSW-LINK004”就能下载到。安装过程一路默认即可装完桌面会有快捷方式打开后界面很简洁左侧是Flash内容预览区连接芯片后能直接看到Flash里的十六进制数据。中间是工具按钮区放着一排图标连接、断开、擦除、编程、校验、读取等。右侧是日志输出区所有操作的过程和错误信息都会在这里显示。蓝色按钮是最常用的连接按钮右侧的下载按钮就是烧录入口。3.2 连接目标芯片点击“Target - Connect”或直接点工具栏的连接图标。连接成功后日志区会出现目标芯片的型号和ID同时左侧会显示Flash起始地址范围。如果连接失败日志区会有具体错误信息。有个小习惯连接前先确认ST-LINK和目标板的连接线是稳定插好的再点连接。连续点很多次连接反而容易让ST-LINK进入奇怪状态不如断开USB重新插一次再来。3.3 先擦除还是直接烧录– 擦除的核心逻辑很多人不理解为什么烧录之前还要专门做一次擦除。原因在于STM32的Flash写入有个特性编程只能把1写成0不能把0写成1。要把一个位从0恢复成1唯一的办法就是执行擦除操作把整片或某个扇区恢复成全1状态。ST-LINK Utility的擦除功能在“Target - Erase Chip”或工具栏的擦除图标里。如果只是覆盖旧的应用程序不改动起始地址其实可以不先擦除整片因为编程工具会自动执行“编程前擦除所需扇区”的动作。但为了保险尤其是改bootloader分区或者改了Flash起始地址时我习惯先整体擦除一次避免旧数据残留产生干扰。整片擦除注意如果芯片里有校准数据、MAC地址、序列号等在固定地址的数据擦除前先读出来备份。别问我怎么知道的这坑我踩过不止一次。3.4 烧录bin文件并设置起始地址点击“Target - Program Verify...”或工具栏的编程图标弹出的对话框里有几个关键字段File Path选择要烧录的bin文件。Start Addressbin文件的起始地址STM32一般填0x08000000。Verify建议勾选烧录完成后会自动读回比较防止“烧进去了但数据是错的”这种隐形故障。烧录时建议默认勾选Reset and run这样烧完芯片自动复位运行省得手动断电上电。选bin文件时如果对话框的“打开”按钮是灰色的大概率是文件类型过滤的问题把文件类型从“hex”改成“All files”所有文件即可。烧录过程中右侧日志区会显示“Programming...”然后进度条走动速度取决于bin文件大小几十KB的应用一般几秒就完成。最后显示“Programming verification completed successfully”就说明烧录成功了。3.5 烧录完成后的确认动作烧录成功后不能光看绿色勾就觉得完事了。我建议做两步验证第一步断开连接把目标板断电重新上电确认程序真的从Flash启动运行了。很多芯片在调试模式下“仿真正常”但断开调试器后程序跑不起来这种问题常见于启动引脚配置错误或复位电路有问题。第二步读回Flash内容做一次对比。在Target - Read Back里将Flash内容保存成hex或bin文件再和原始的bin文件做二进制对比能确认芯片里的数据和本地文件完全一致。这个习惯在批量产测时尤其重要能防住“这台能跑那台不能跑”的诡异现象。3.6 实用技巧读回Flash生成备份ST-LINK Utility的读回来读功能不仅是验证手段还是救砖神器。如果板子上的程序是自己写的但源文件丢了完全可以从芯片里把Flash读出来另存为bin反汇编或是提取里面的常量数据都可以。操作方法连接芯片后点击“Target - Read Back”选择保存路径和格式整个Flash会按地址范围被导出。注意STM32的读保护选项字节如果开了读回来的内容会是全FF这种情况不要慌说明芯片打开了读保护。需要先用“Remove Read Protection”解除读保护再做读取但解除操作本身会触发一次整片擦除。4. 常见连接问题排查实录这一节全部来自实战不是软件帮助文档里的套话。你照着敲的顺序来排查大概率能解决90%以上的连接问题。4.1 Target connection lost: Can not connect to target这是最经典也最让人头皮发麻的报错。第一次遇到我以为是板子坏了后来发现大概率是以下几个原因。最优先级检查的是接线尤其是SWDIO和SWCLK两根线插反了没有——插反一定连不上。其次是GND有没有牢靠地共地有时杜邦线松脱导致地线断开也会报同样的错。还有一种很低级但常见的目标板没上电。ST-LINK的VCC脚虽然能输出3.3V但电流非常有限如果板子上的外设功耗稍大VCC就会被拉垮导致芯片供电不足连接不稳定。还有一种情况是目标芯片进入了休眠或低功耗模式。在这种模式下内核时钟可能停掉SWD调试接口也随之失效。解决办法是让芯片先退出低功耗模式或者按住复位键的同时点击Connect在连接成功的瞬间再松开复位键。这个小技巧叫“Connect under reset”ST-LINK Utility的Target - Settings里有相关选项可以通过复位时序来建立连接。4.2 Error: No ST-LINK detected这个报错说明电脑压根没认到ST-LINK设备或者驱动异常。先去看设备管理器如果设备那行是未知设备或带黄色感叹号重装ST-LINK驱动。如果设备管理器里连设备都没有换根USB线再试很多“ST-LINK没反应”的问题其实是USB线的问题。另外有些ST-LINK/V2板子自带一个状态LED插上USB后LED常亮或闪烁属于正常完全不亮要考虑硬件问题。在旧版的ST-LINK Utility里连接到某些克隆版ST-LINK时会直接报“ST-LINK is not recognized”。这种情况要么换正版ST-LINK要么换用STM32CubeProgrammer后者对克隆版的兼容性稍微好些。4.3 上电连接正常但一按Program就断开这个问题比较隐蔽。表现为连接稳定读Flash正常一旦开始编程日志区立刻报错连接丢失。我遇到过两种典型情况。第一种是USB供电不稳定烧录瞬间电流增大导致电压跌落ST-LINK直接掉线。这种问题在笔记本电脑上特别常见尤其是USB口旁边还插着移动硬盘时。解决办法是给目标板单独供电同时把ST-LINK的供电线断开只用信号线连接。第二种是SWD线太长或质量太差比如超过30cm的杜邦线在高速烧录时数据出错导致连接终止。解决方法是缩短线材、降低SWCLK速率在Target - Settings里调整或者换成带屏蔽的排线。还有一点不要在板子通电的情况下频繁插拔SWD接口容易产生瞬态冲击导致芯片进入异常状态。4.4 芯片读保护导致连接失败或读回数据全FFSTM32如果开启了RDPRead Protection级别1和调试器连接时不会完全断连但Flash内容无法读取烧录也会受限。连接后点击读取日志会提示保护状态读回的内容全是0xFF。遇到这种情况在ST-LINK Utility的Target - Option Bytes里能看到读保护等级。如果想解除保护选择Level 0并点击Apply。注意解除读保护会触发整片Flash擦除也就是所有代码和数据都会清空。所以不要指望“我只是想看看里面是什么”在读保护开启的芯片上这个操作是单向的——要么保留保护要么擦除后解除。量产时如果芯片开启了读保护烧录前先想清楚连一次解除保护就擦一次每次都擦产测效率会很差。大多数产品为了防抄板确实要开读保护但这属于产品量产阶段的问题需要单独规划烧录顺序。4.5 常见问题速查表现象大概率原因处理办法设备管理器无ST-LINKUSB线或驱动问题换数据线重装ST-LINK驱动连接时报ID码不正确接线错或芯片损坏重新核对SWDIO/SWCLK/GND接线连接正常但无法编程读保护开启Option Bytes里解除RDP但会擦除Flash烧录中掉线供电不足、线太长独立供电缩短SWD线降SWCLK速率烧录成功但程序不跑起始地址错/启动配置错核对Start Address是否为0x08000000检查BOOT0引脚读回数据全是0xFF使用了空片或开了读保护区分空片和保护后者需要RDP Level 0解除5. 备选方案与工作流扩展ST-LINK Utility虽然好用但不是唯一选择。不同场景下其他工具的体验和效率可能更合适这里展开说说。5.1 STM32CubeProgrammer官方主推的“全能选手”ST官方已经明确STM32CubeProgrammer是ST-LINK Utility的官方继任者现在新出的STM32型号在Utility里可能根本没有支持文件。CubeProgrammer支持SWD、JTAG、UARTISP、USB DFU、OTA等几乎全部烧录途径还支持命令行模式能集成到自动化产测脚本里。用CubeProgrammer烧bin的命令行示例STM32_Programmer_CLI.exe -c portSWD modeUR -w app.bin 0x08000000 -v -rst这条命令的含义是通过SWD口连接芯片UR模式即under reset连接时拉低复位把app.bin写到0x08000000校验后复位运行。在批处理脚本里加上循环就能一台接一台地烧板子生产效率比鼠标点界面高得多。界面操作也很简单左侧选ST-LINK右侧选bin文件并填地址点Download。和Utility最大的区别是它的界面上能直接查看和修改Option Bytes对读保护、看门狗设置这些操作更友好。5.2 J-Flash熟悉J-LINK神器后你会上瘾如果手头是J-LINK调试器J-Flash是无可替代的。和ST-LINK Utility一样J-Flash也支持bin文件烧录但它的连接配置稍复杂一些需要选芯片型号。连接成功后File - Open data file打开bin文件填入起始地址然后Target - Program就能烧录。J-Flash更强大的一点是它能配置成“Production”模式在命令行下配合J-Link Commander使用适合批量产线的流程控制。但需要说明J-LINK调试器的价格比ST-LINK高不少个人学习和开发没必要非要上J-LINK先把手头的ST-LINK用透再说。5.3 串口ISP方式没有调试器也能烧有些时候手头没有ST-LINK只有一根USB转TTL串口线能不能烧可以。通过BOOT0引脚拉高、BOOT1拉低芯片上电后进入系统Bootloader此时可以用串口接收固件并写入Flash。Windows下常用的工具是STM32CubeProgrammer选择UART模式或者老版的Flash Loader Demonstrator。串口ISP烧录对硬件的要求是必须有UART1PA9、PA10引出且默认波特率一般是115200部分型号支持更高。这个方式的优点是不需要额外调试器缺点是速度慢——一个几百KB的固件可能要等很久而且必须手动操作BOOT引脚量产效率低。开发调试阶段还是建议用SWD。5.4 量产烧录与OTA当“烧录”不再只是插线生产场景下ST-LINK Utility这类桌面工具就不太够用了。量产时常见的选择是离线烧录器先把固件烧进烧录器内部Flash然后给每块板子插上烧录器的探针一键完成擦除、编程、校验完全不依赖电脑。另一种思路是OTA。STM32支持通过修改Flash起始地址和中断向量表偏移来实现引导程序跳转Bootloader放在0x08000000App放在0x08008000App的bin文件里需要用VECT_TAB_OFFSET宏把中断向量表偏移到0x8000。这样既能本地用ST-LINK Utility直接烧App也能通过网络或无线模块远程升级。OTA升级必须考虑失败回滚最简单的做法是App里保存一个版本号标志Bootloader启动后检查该标志如果App校验失败就继续留在Bootloader里等待新固件。这个话题展开又是一篇长文但原理还是建立在今天讲的Flash地址和烧录概念之上。6. 避坑指南与实操心得最后按“踩坑频率”从高到低排个序都是真实发生过的教训。第一个坑是烧录成功但程序不运行。这个坑通常不是烧录本身的问题而是Address没填对。bin文件不像hex自带地址只要烧录的起始地址不是0x08000000上电后芯片从错误的地址取复位向量程序必然跑飞。还有一种情况通过Bootloader跳转启动App时App的中断向量表必须偏移否则外部中断一响应就死机。排查方法是看芯片的PC指针停在哪里如果PC在0x08000000附近反复跳转说明向量表没正确映射如果PC跑飞到了0xFFFFFFFF附近大概率是Flash配置错误。第二个坑是供电问题。ST-LINK能供电不代表该由它供电尤其板上有传感器、OLED、电机驱动这类外设时3.3V LDO瞬间电流是被拉升的。用ST-LINK给整板供电烧录时经常出现电压跌落。我现在的习惯是凡是要长时间调试、烧录的板子一律外部供电ST-LINK只接SWDIO、SWCLK、GND不接VCC。测电压没成本排查掉线问题却要耗时大半天。第三个坑是频率问题。部分克隆版ST-LINK在默认4MHz的SWCLK下不稳定把频率降到1.8MHz甚至更低就能稳定连接。这个选项在Target - Settings里调整平时不需要改但碰到“明明没问题就是连不上”的疑难杂症值得一试。第四个坑是驱动冲突。电脑上如果同时装了Virtual COM Port驱动和老的ST-LINK驱动偶尔会出现设备号冲突导致ST-LINK识别异常。解决办法是卸载后重装新驱动并在设备管理器里删除残留的幽灵设备然后重新扫描硬件。第五个坑擦除后忘记重新烧写Bootloader。很多STM32板子出厂时内部自带Bootloader但当你用ST-LINK Utility整片擦除时Bootloader也被一并抹掉了。如果之后想用串口ISP方式下载程序芯片会毫无反应。解决办法是下载时不要总是用Erase Chip而是用编程选项里的“Erase necessary pages”或者“Erase sectors used by file”保留Bootloader区域不被擦除。按照个人经验前面所有内容里最有价值的一点是无论是ST-LINK Utility还是CubeProgrammer连接问题八成出在硬件接线和供电上而不是软件配置。先把目标板独立供电、用最短的杜邦线、把SWDIO和SWCLK反复核对一遍再打开软件点连接成功率会直线上升。至今我包里常备的还是一根20cm左右的杜邦线和一个ST-LINK/V2不管是给STM32F103C8T6最小系统板烧录还是应急给手头的ESP32模块测试配套固件都可以在几分钟内完成任务。烧录这件事不难难的是理解它背后的机制一旦弄明白了后面用任何工具都只是换个壳子而已。

关于本文作者

来自尧图内容编辑团队

尧图内容编辑团队 内容团队

尧图内容编辑团队

本文由尧图网络内容编辑团队执笔。团队由资深项目经理、前端工程师与设计师组成,所有内容均来自亲手交付的真实项目,先讲清问题、再给出可落地的解法。尧图深耕北京网站建设十年,服务过京华建材集团、智造科技等各行业客户,把一线经验沉淀为可复用的行业观察。

  • 十年建站经验,覆盖建材、制造、服务、文创等
  • 项目经理把关选题与事实准确性
  • 工程师与设计师联合撰写专业细节
  • 统一编辑规范,保证文风与排版一致
  • 每月复盘转化数据,迭代选题方向

延伸阅读

相关资讯与近期热门内容

深度阅读推荐

建站决策前值得细读的三篇

网站改版的5个关键决策
2024-08-12

网站改版的5个关键决策

什么时候该改版、改到什么程度、如何避免流量掉光,京华建材集团改版复盘给出答案。

获取专属建站方案

看完文章,把您的行业与预算告诉我们,免费获取一份量身定制的官网建设方案与报价。

立即免费咨询