ARTICLE DETAIL

资讯详情

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

STM32烧录全流程详解:从源码到hex文件与ST-Link实战

STM32烧录全流程详解:从源码到hex文件与ST-Link实战 从拿到空板到点亮第一颗LED中间隔着一段“从源码到烧录”的路。很多刚接触STM32的朋友在写代码这步没卡住结果在烧录这步被什么“no target found”“Flash Download failed”“RDDI-DAP Error”折腾到怀疑人生。这篇博客我就把STM32的完整链路讲透了源码怎么组织、编译出了什么文件、烧录工具怎么选怎么用、报错怎么排查一条龙走下来。这篇内容适合两类人看一类是刚入门、手里有块开发板但搞不清Keil、ST-Link、hex文件之间关系的初学者另一类是已经能跑通基础工程、但遇到烧录失败和调试问题就抓瞎的进阶玩家。看完你不仅能跑通还能理解每一步背后的原理以后出问题能自己排查。1. 源码到烧录一条完整的链路1.1 先搞明白STM32项目的组成先说个常见的误区很多新手以为STM32的源码就是main.c里那几百行业务逻辑实际上一个完整的工程远不止这些。以我在实际项目中用的标准工程为例它至少包含四层第一层是启动文件名字类似startup_stm32f103xe.s这是一段汇编代码它的作用是设置栈指针、初始化中断向量表、调用SystemInit初始化时钟、然后跳转到main函数。这段代码在你按下复位键之后、main还没跑起来之前就已经在执行了是整个程序的入口。第二层是系统初始化代码主要是system_stm32f1xx.c负责配置系统时钟树把芯片主频跑到72MHz或者更高的PLL倍频结果。这块很多人会忽略但如果时钟配错了后面所有外设的工作频率全部偏掉串口波特率、定时器周期都会不对。第三层是外设驱动代码也就是你真正写的业务逻辑操作GPIO、串口、SPI、I2C这些接口。可能是寄存器操作可能是标准外设库SPL也可能是我现在更推荐的标准库升级版HAL库。第四层是链接脚本或分散加载文件在Keil里就是那个.sct文件在GCC工具链里是.ld文件。它决定了代码段、数据段、堆栈分别放在Flash和RAM的什么地址。很多人在网上看到“STM32源码”以为就是一个.mai文件其实整套工程把这些部分组合在一起才能编译出可烧录的固件。理解了这层结构后面遇到“编译过了但烧进去不运行”这种问题你就知道该去查哪一层了。1.2 选对开发环境Keil、STM32CubeIDE还是VSCode开发环境的选择直接决定了你后面所有操作的难易程度。目前主流的三条路线我分别说下我的真实感受Keil MDK是新手占比最高、教程最多的选择。它把编辑、编译、烧录集成在一个界面里点击“Download”按钮就能直接通过ST-Link把固件写入芯片。它的缺点是工程配置项比较多尤其是C/C选项里的Define宏、Include路径新手容易漏配编译出来各种undefined标识符的报错。但只要你跑通一个最小工程后面复制模板改就行。STM32CubeIDE是ST官方推荐的免费IDE内置了CubeMX图形化配置工具可以图形化配置引脚、时钟、外设直接生成工程代码。它的优势是省去大量手写初始化代码的功夫调试功能也很强大支持实时变量查看。缺点是下载和安装包较大对老电脑不友好而且不少从Keil转过来的老工程师习惯了Keil的界面反而嫌它“重”。VSCode GCC工具链是进阶玩家的玩法用arm-none-eabi-gcc编译配合Cortex-Debug插件调试好处是编辑体验极佳、Git管理方便、还能用CMake组织工程。坏处是环境配置成本高新手容易在JSON配置和工具链路径上卡半天。我的建议很明确如果目的是快速学习原理、走通流程选Keil MDK教程多、坑少如果目的是做产品开发、追求代码生成效率用STM32CubeIDEVSCode那条路等你有一定基础了再折腾也不迟。1.3 从源码到固件编译、汇编、链接三步走源码到烧录中间那道工序就是编译工具链把文本变成机器码的过程。整个过程拆开来看其实就三步第一步是编译。编译器把每个.c源文件单独处理先做预处理展开宏、包含头文件然后检查语法最后生成对应的汇编代码。这一步输出的是.o文件目标文件。注意这时候每个文件里的函数都还不知道自己最终被放在哪个地址——那是链接的事。第二步是汇编。如果是手写的汇编启动文件会经过汇编器处理成目标文件。不过现在大多数情况下编译器已经把C代码转成汇编又转成机器码了用户根本感知不到这一步。第三步是链接。链接器把所有目标文件、启动文件、库文件整合到一起按照链接脚本指定的地址布局最终生成我们在烧录时需要的可执行文件。这里面有个关键概念编译单位是文件链接单位是工程。所以当你改了一个.c文件Keil默认就只编译这一个文件再重新链接速度很快。这就是增量编译的原理。搞明白这一步你就能理解为什么“只改一个宏定义有时候会导致整个工程全部重新编译”——因为头文件被多个.c文件包含了每个文件都得重新编译一遍。2. 搭建最小工程从空文件夹到点亮LED2.1 用STM32CubeMX快速生成初始化代码手写初始化代码不是不行但效率太低。我现在的标准工作流是这样的先打开STM32CubeMX或者CubeIDE内置的配置器选好芯片型号在Pinout视图里点几下把LED对应的GPIO引脚配置成推挽输出再把时钟树设好点击生成代码一个能编译的最小工程就到手了。这里要注意选择HAL库还是LL库。CubeMX默认生成HAL库代码它的特点是函数封装得层次高比如HAL_GPIO_WritePin上手容易但间接层多、执行效率不是极致。LL库则更贴近寄存器代码简洁、执行快适合对时序敏感的场景。对于新手我建议先用HAL库跑通之后再看LL库源码也不迟。生成代码时CubeMX还会问你选择什么IDE类型MDK-ARM、STM32CubeIDE、或者Makefile。选MDK-ARM会直接生成.uvprojx工程文件用Keil打开就能编译烧录无缝衔接。2.2 启动文件、中断向量表和链接脚本里藏着什么跑通工程之后我强烈建议你花半小时读一遍启动文件。虽然它是汇编但STM32的启动文件结构很简单主要套路就是定义栈顶地址赋给MSP寄存器建立中断向量表第一项是栈顶地址第二项是复位中断入口后面依次是各种外设中断入口复位中断里会做三件事从.data段把初始值拷贝到RAM、把.bss段清零、调用SystemInit配时钟、然后跳到__mainC库函数最终会调用main这个流程配合链接脚本就很好理解了链接脚本指定了Flash从0x08000000开始、RAM从0x20000000开始不同型号略有差异那么启动文件设置的栈顶地址就会落在RAM最高处代码就从0x08000000开始放。为什么要理解这些因为如果你将来要做BootloaderIAP在线升级核心就是操作中断向量表重映射。很多人在做Bootloader时程序跳不过去就是因为对向量表偏移的理解不到位——需要在代码里设置SCB-VTOR寄存器这个操作如果你没读过启动文件永远只能靠网上抄代码。2.3 时钟树配置HSE、PLL到底要设多少时钟是STM32最容易踩坑也最容易忽略的部分。我用一个很现实的说法来描述如果时钟错了程序可能根本跑不起来或者所有外设的速度都不对而且程序本身还能“正常”编译下载不会有任何报错。配置时钟的核心就是走通HSI/HSE到PLL再到系统时钟的路径。以F103系列为例最常见配置是外部8MHz晶振PLL倍频9倍得到72MHz系统主频。在CubeMX里就是选HSE外部晶振然后输入期望主频72MHz工具自动算好PLL参数。但如果你用的是自制的板子晶振不是8M而是12M或25M就必须在CubeMX里把HSE的值改过来否则串口波特率偏到没法用。这里还有个经验HSI内部RC振荡器精度低约±1%温漂更大依赖它跑串口或者CAN这类需要精确时钟的外设时大概率出问题。所以只要板子上有晶振就优先用HSE加PLL这条路。3. 编译产物解析hex、bin、ELF里都是什么3.1 Keil编译完之后生成了哪些文件工程编译成功后你会在Output文件夹里看到一堆东西.axf、.hex、.map、.crf、.o等等。其中最关键的是三个.axf文件是ARM的ELF格式可执行文件包含完整的调试信息、符号表、汇编指令、数据等等。用Keil调试时实际上加载的就是这个文件。它也是烧录时的数据来源之一Keil烧录时会自动从这个文件里抽取下载数据。.hex文件是Intel HEX格式的ASCII文本文件每一行包含地址、数据类型和实际数据。它最大的特点是带有地址信息可以直接把数据放到指定的Flash地址所以它的长度通常比纯数据长因为地址信息占了大量字符。.bin文件是纯二进制镜像没有地址信息只有原始数据。烧录时必须明确指定烧写到Flash的起始地址。优点是体积最小适合量产时的固件分发或者OTA远程升级传输。.map文件是小众但极有用的文件它是链接器的内存映射报告详细记录了每个函数、每个全局变量被分配到了哪个地址、占用多少空间。当我遇到FLASH overflow或者RAM overflow错误时第一反应就是开map文件看是谁占用了大头。3.2 烧录时选hex还是bin区别很大烧录工具通常同时支持hex和bin但两者的用法区别很大。用ST官方工具烧录hex文件时工具直接从文件里读出地址不让你手动指定因此操作简单、不容易出错。而烧录bin文件时工具会问你要写到哪个地址——如果你写成0x00000000而不是0x08000000程序下载进去但芯片一运行就飞了取决于启动模式但多数情况下是错的。我的建议是日常开发调试用hex做量产产线或者OTA升级包时用bin。产线用bin是因为它体积小、烧录速度快而且起始地址是自己定的适合同一颗芯片放两套程序比如Bootloader和App的场景。3.3 编译信息里的Code、RO-data、RW-data怎么读Keil和CubeIDE编译完成之后都会在输出窗口打印一行类似这样的信息Program Size: Code18560 RO-data1152 RW-data216 ZI-data4928我来解释下这四项的含义因为很多人问过“我的Flash和RAM到底用了多少”Code程序指令占的Flash空间RO-data只读数据比如const常量、字符串字面量也放FlashRW-data有初值的全局变量初值存在Flash里但运行时会被拷贝到RAM中ZI-data零初始化数据就是.bss段运行时占用RAM初值为0所以Flash总占用 Code RO-data RW-dataRW-data的初值部分在FlashRAM总占用 RW-data ZI-data运行时。这个计算方式在所有基于ARM Cortex-M的工程里通用看懂这四列你就能精确控制内存占用——这在Flash或RAM吃紧的板子上是保命技能。4. 烧录前必读启动模式、接口连接与工具选型4.1 BOOT0和BOOT1三种启动模式到底怎么选很多人在烧录前完全不看BOOT引脚结果程序下载成功却运行的是旧程序或者下载后一直跑在Bootloader里。这就是启动模式选择的问题。以STM32F103为例芯片上电后根据BOOT0和BOOT1引脚的电平状态决定从哪里取代码开始执行BOOT0BOOT1启动区域0任意从主Flash启动正常程序运行模式10从系统存储器启动也就是芯片出厂预置的Bootloader11从内置SRAM启动调试用正常情况下BOOT0必须接低电平接地这样上电后执行的是你烧进0x08000000的用户程序。如果你想用串口方式给芯片下载代码ISP下载那就把BOOT0拉高、BOOT1拉低让芯片从系统存储器的Bootloader启动然后用串口把程序写进Flash写完再把BOOT0拉回来。注意一个容易翻车的地方用ST-Link的SWD接口烧录时不需要改BOOT引脚因为SWD调试接口权限极高可以直接访问和控制芯片。所以如果你的板子已经引出了SWD接口烧录全程就不用碰BOOT开关——这就是为什么SWD烧录成了大家最爱的方式。4.2 SWD烧录接线四根线还是五根线SWD是ARM内核标配的调试接口STM32上一般接JTAG/SWD复用的那几个引脚常用的是SWDIOPA13和SWCLKPA14。烧录器ST-Link、J-Link、DAP-Link都支持SWD协议。接线是烧录里最少不了的一环。最小接线是四根SWDIO、SWCLK、GND、3.3V其中3.3V用来给目标板供电或作电平参考。如果你不想让烧录器给板子供电也可以不接3.3V但那样要求目标板自己已经上电否则烧录器无法检测到目标。型号不同ST-Link的引脚定义也不同V2版一般印有SWDIO、SWCLK、GND、3.3V、5V、RST等标识按丝印接就行。这里特别提醒SWDIO和SWCLK不能被复用。有些人把这两个引脚当做普通GPIO用了或者外部接了强上拉下拉电阻导致烧录器无法正常访问内核就会报“no target found”。如果遇到这种问题先把这两个引脚对应的外部电路断开或者按住复位再点烧录很多情况下能抢救回来。4.3 烧录工具选型ST-Link、J-Link、串口ISP、USB DFU怎么选市面上烧录工具很多我按实际使用频次排个序工具优点缺点适用场景ST-Link便宜、官方支持好、Keil/CubeIDE原生支持部分山寨版稳定性一般日常调试首推J-Link速度快、兼容芯片多、调试功能强正版贵、山寨版多交叉调试、量产串口ISP只需一根USB转TTL、无需额外硬件速度慢、需要手动控制BOOT引脚应急烧录USB DFU免烧录器、直接用USB下载需要芯片内置Bootloader支持量产维护关于ST-Link我要多说一句。市面上的ST-Link V2山寨版价格很低能用但遇到过电源纹波大的问题烧录不稳定、偶尔报错。为了少折腾我建议直接买正版或者做工好的兼容版多在十几块到三十几块之间多花的钱省下的时间绝对值。J-Link的话对新手来说没必要追求正版因为它的核心功能用Keil调试时不需要用Ozone调试器时才体现得出来。5. 实操四种烧录方式完整跑一遍5.1 方式一ST-Link Keil一键烧录最常用这是我用得最多、也最适合新手起步的方式。接线就不重复了SWD四根线接好然后Keil里的配置分三步第一步点击魔术棒Options for Target在Debug选项卡里选择右侧的ST-Link Debugger再点旁边的Settings确认能识别到芯片IDCODE。如果这里列出的SW Device是空白说明接线有问题或者驱动没装好。第二步切到Utilities选项卡部分Keil版本里叫Flash Download勾选Use Debug Driver然后点击Settings进入Flash Download设置在Programming Algorithm里按芯片Flash型号选对应的算法文件。F103系列一般用STM32F10x Med-density Flash 128K如果你选的算法和芯片不匹配烧录时会报Flash下载失败。第三步点击编译按钮旁边的Download图标或者按F8Keil会先编译再烧录完成后会提示Application running或者烧录进度条走完。这里有个隐蔽但常见的坑如果你的Keil用了不同的AC版本比如AC5和AC6链接脚本和启动文件兼容性表现不一样。AC6对新标准支持好但编译某些老工程会出一堆warning甚至error。我目前最稳定的组合是AC5 标准库工程用HAL库时AC6也问题不大但如果你编译老外设库工程遇到了奇怪错误先切回AC5试试。5.2 方式二STM32CubeProgrammer图形化烧录ST官方现在主推的烧录工具是STM32CubeProgrammer简称STM32CubeProg。它比老款ST-Link Utility功能更全面支持SWD、UART、USB、OTA等多种烧录方式。用SWD烧录的流程是连接ST-Link和板子打开STM32CubeProg在左侧选择ST-Link接口然后点右上角的Connect按钮连上后软件会读取芯片的基本信息型号、Flash大小、UID等确认连接正常后在右边选择要烧录的文件hex或bin填好起始地址bin文件需要hex文件不用点Start Programming进度条走完就烧录完成。我还想安利一个它非常实用的小功能烧录后自动校验Verify。量产时我会勾上这个选项确保每一片烧进去的数据都跟原文件完全一致避免个别芯片Flash写入异常导致出厂货出问题。这个功能对成本敏感、采购散件自己烧录的场景特别重要。另外如果你遇到的是“板子之前写了读保护现在烧不进去”的问题STM32CubeProg里有个Full chip erase和Option Bytes页面可以解除读保护把RDP级别改成AA即可。但要注意解除读保护会触发整片Flash擦除原来的程序会全部丢失操作前记得备份。5.3 方式三J-Link J-Flash烧录J-Link的专用烧录工具叫J-Flash它的特点是速度快、支持命令行很适合产线。使用流程也简单安装J-Link驱动之后打开J-Flash新建工程选择芯片型号比如STM32F103C8连接烧录器打开hex或bin文件按F7或点Program按钮烧录。J-Flash有个让我印象很深的优点连接速度快。同样一块板子用ST-Link在Keil里连接可能等两三秒用J-Flash基本一秒内识别出来。在批量烧录、一拖四烧录器这类场景里时间省得非常明显。命令行用法是高阶技能但真的很香。我在产线维护时经常写一个简单批处理命令来完成自动烧录JFlash.exe -openprjC:\projects\demo.jflash -openC:\firmware\app.hex -connect -auto -exit这条命令的意思是打开工程配置、打开固件、连接烧录器、自动烧录、退出。产线工人只要双击这个bat文件就能完成烧录不需要任何培训。如果你有量产需求强烈建议研究下这个用法。5.4 方式四串口ISP烧录没有ST-Link时的保底方案有时候手头没有ST-Link和J-Link但有一颗板载USB转串口芯片。这时可以用串口ISP来烧录。以F103为例操作步骤是板子断电把BOOT0引脚拉高多数开发板上有跳线帽或拨码开关用USB转TTL模块连接UART1的TX/RX/GND注意交叉连接模块TX接板子RX模块RX接板子TX打开ST官方的Flash Loader Demonstrator或者CubeProgrammer选UART模式板子重新上电软件会自动识别芯片选择要下载的hex文件开始烧录烧录完成后板子断电把BOOT0跳回低电平重新上电运行程序这个方法的痛点是速度很慢尤其是Flash容量大的芯片串口波特率就算提到115200下载几百KB的固件也要等好久。另外它只支持UART1PA9/PA10做ISP如果你的板子这两个引脚正好被占用或没引出这条路就走不通了。所以我一般把它定位成“应急备用方案”。真正开发调试还是烧录器方便得多。6. 烧录报错排查把常见错误一网打尽6.1 “no stm32 target found”怎么破这是出现率最高、劝退新手最多的一条报错信息一般长这样Error: No STM32 target found! If your product embeds Debug Authentication, please perform a DA sequence before any debug operation.后面那句Debug Authentication是较新芯片比如STM32H5、STM32U5系列的安全特性提示但大多数情况下你遇到的并不是安全认证问题而是物理连接问题。我的排查顺序是严格的从硬件到软件一步步来检查接线SWDIO、SWCLK、GND是否一一对应有没有接反。接线错误占了这类问题的八成以上。检查供电目标板有没有单独上电如果使用ST-Link给板子供电3.3V引脚是否正常输出测一下核心板的VCC和GND之间有没有稳定电压。检查复位引脚按住板子上的复位键不放再点烧录如果这时能连上说明是程序把SWD引脚配置成了其他功能需要在程序里禁用或者用Flash整片擦除恢复。检查连接模式在Keil的Settings里把Connect改为under Reset模式这个模式烧录前先把芯片拉进复位状态能绕过很多启动即死机的问题。如果还是不行就降低SWD时钟频率把SW Speed从默认值降到100kHz左右对长线材、高阻抗的板子有奇效。最后还有一个终极大招找一个能正常烧录的板子用它的ST-Link来测试当前线材和设置逐段缩小问题范围。排查工具类问题时替换法永远是最省时间的。6.2 Keil烧录中途报“Flash Download failed”的排查思路这条报错通常出现在点击烧录之后、进度条没走几步就弹出来的时候常见原因是Flash算法不匹配或者芯片写保护被开启。先说算法匹配问题。在Keil的Options → Utilities → Settings → Flash Download里看Programming Algorithm里列出的Flash型号和大小是否和你的芯片一致。比如F103C8T6是中容量Flash 64KB如果你的算法写的是STM32F10x High-density Flash 512K烧录时虽然大概率能跑通但擦除范围会超界偶尔出现怪问题。正确做法是按对应型号选择后点Add把算法加进去Remove掉不匹配的项。再一个就是读保护问题。如果芯片烧录过开启了RDP读保护等级1的代码那么Keil就无法直接擦除和写入Flash。解决方法是用STM32CubeProgrammer连接芯片在Option Bytes里把Readout Protection从Level 1改成Level 0确认执行后会擦除整片。之后再用Keil烧录就正常了。6.3 烧录成功但程序不运行问题可能在启动配置程序下载成功提示application running结果板子一点反应没有。这种问题更容易让新手崩溃因为烧录环节已经通过了问题反而更隐蔽。我的排查顺序是首先确认有没有把代码烧到正确的地址。如果你的工程里设置了IROM从0x08000000开始但选的Flash算法从0x00000000写入程序就根本没落地到应有的位置。Keil工程默认是对的怕的是你从网上下载的模板或者自己改过地址。然后检查BOOT引脚状态。BOOT0应该是低电平。如果BOOT0被拉高芯片上电进的是系统存储器Bootloader根本不会执行你的程序。再检查电源VDD和VSS有没有正确连接复位引脚NRST是不是被拉低了一直处于复位状态。我见过一块板子NRST对地短路程序永远跑不起来的情况。然后看时钟配置如果你的代码配置了外部晶振HSE但板子上没有焊接晶振或者晶振起振失败程序会卡在时钟初始化里main一行都执行不到。CubeMX生成的代码默认HSE失败后会切换到HSI但老工程或者手写初始化不一定会处理这个情况。最后再看终极排查手段——进入Debug调试。用Keil的Debug模式连接芯片在main入口打一个断点全速运行如果断点能命中说明代码在跑如果停在HardFault_Handler说明程序执行中遇到了异常。这个信息量比瞎猜大得多。6.4 烧录第二次就失败检查写保护和Option Bytes还有一种常见现象第一次烧录成功第二次就报错或者同一片芯片其他板子都能烧就是某一片烧不进去。这种一般指向芯片已经开启写保护。STM32的Flash有三种保护等级Level 0无保护、Level 1读保护禁止调试和读Flash、Level 2永久保护无法解除慎用。很多新出厂的芯片会带Level 1的默认配置部分型号产线烧录后特意设置的所以拿到手第一件事就是用CubeProgrammer的Option Bytes页面看一眼RDP等级。如果芯片是Level 1并且你不知道密码实际上STM32也没有密码这个概念就是单纯保护唯一解就是Full chip erase来恢复。注意这会造成芯片程序整体丢失所以如果是回收的旧芯片先确认里面有没有需要保留的东西或者自己的程序。另外在量产阶段有些人会在产线烧录后用代码自动设置写保护防止固件被读出。如果你拿这样的板子回来开发就会遇到“怎么都烧不进去”的情况。这不是板子坏了是保护开启后调试接口被禁用。7. 调试辅助技巧让烧录和排错效率翻倍7.1 “NO debug unit found”或者驱动问题怎么处理换电脑、换接口之后经常遇到Keil提示找不到调试器的问题。这通常不是调试器坏了而是驱动没装对。ST-Link的驱动在ST官方工具链里一般会自动安装但如果系统更新过或者你手动卸载过驱动就可能出现设备管理器里ST-Link显示黄色感叹号的情况。解决办法很简单到ST官网下载最新版本的STM32 ST-LINK Utility或者CubeProgrammer安装后会自动更新或覆盖驱动。还有一个比较隐蔽的问题USB接口供电不足尤其是接了USB Hub的时候ST-Link可能上行能识别但下行不稳定。建议直接插主板USB口不要用前置面板或者Hub。7.2 用RTT或串口打印辅助片上调试片上系统最烦的就是看不见变量。虽然Keil的Debug模式能看但有些场景不方便打断点比如跑马达、跑无线协议栈时打断点会影响时序。这时候我最常用两个方法一个是串口打印。简单粗暴初始化一个UART重定向printf到串口在业务逻辑里加打印信息然后打开串口助手看日志。这是调试复杂Bug时信息密度最高的方式。需要注意的是printf重定向如果使用HAL库要重写fputc用标准库时还可能遇到半主机模式semihosting卡死的问题需要加__use_no_semihosting否则程序会在printf时卡住这是很经典的坑。另一个是SEGGER RTT。如果你用的是J-Link烧录器RTT可以在不占用串口、不影响实时性的前提下把调试日志发送到PC端的RTT Viewer里。它的原理是把数据写到RAM里的一个环形缓冲区然后J-Link通过SWD读取这个缓冲区速度极快、不阻塞CPU。对于实时性要求高的项目RTT基本成了标配。7.3 芯片变砖了先别急着扔试试这几招STM32很少真正变“砖”除非你开启了Level 2保护或者把Flash算法烧到启动区域。大多数“变砖”场景都能救回来第一招按住复位键再点烧录在烧录即将开始的瞬间松开复位。这是让芯片在没有执行用户程序的情况下被连接上ST-Link能抢到控制权。第二招用CubeProgrammer的Under Reset模式连接。如果你用硬件复位都连不上多半是用户程序把SWD引脚复用掉了。Under Reset模式可以绕过这层障碍。第三招设置BOOT01、BOOT10让芯片从系统Bootloader启动。此时芯片不执行用户程序SWD接口大概率能连上然后通过CubeProgrammer把整个Flash擦除把BOOT0跳回来再重新烧录。第四招实在不行换芯片引脚飞线。如果你把SWD的两个引脚完全禁用了并且无法恢复可以飞线接到相邻的SWD备用引脚上但STM32一般没有备用SWD引脚所以核心思路还是要靠前几招。我个人的体会是烧录问题九成都是连接和配置问题真正硬件损坏的概率极低。别慌按上面的顺序一步步排查绝大多数板子都能救回来。干这行谁还没在半夜里用镊子短接Boot引脚救过板子呢。
返回列表