1. 这个报错到底在拦什么:从ST-Link固件到芯片识别的完整链路
第一次看到Not a genuine ST Device这个弹窗的时候,我正赶着给一块 STM32F103C8T6 最小系统板烧程序,Keil 里点下 Download 按钮,进度条刚走一点就弹出来这么一行字,后面还跟着一句Abort retry ignore之类的选项。当时第一反应是板子坏了,换了块新的还是同样报错,折腾了大半天才搞明白,这压根不是硬件故障,而是 ST-Link 调试器和目标芯片之间的一次“身份核验”没通过。
要理解这个报错,得先搞清楚 Keil MDK 下载程序时到底发生了什么。你在 Keil 里点 Download,实际执行流程是这样的:Keil 调用 ST-Link 的驱动接口,ST-Link 调试器通过 SWD 或 JTAG 协议连接目标芯片,读取芯片的 IDCODE 和 Flash 容量等身份信息,然后 ST-Link 固件会判断这个芯片是不是“正品 ST 器件”。如果 ST-Link 固件版本较新,而目标芯片是某些兼容型号或者 ST-Link 本身是山寨克隆版,这个校验就会失败,于是弹出Not a genuine ST Device的提示。
这里有个关键点很多人会忽略:报错的主体是 ST-Link,不是 Keil,也不是芯片本身。ST-Link 固件在较新版本里加入了对目标芯片的“正品校验”逻辑,尤其是 ST-Link V2 的克隆版,固件版本五花八门,有的校验逻辑特别激进,连正品 STM32 都能误判。而 ST-Link V3 或者原厂 ST-Link V2 一般不会有这个问题,因为它们的固件和 ST 官方的校验机制是配套的。
从热词里能看到stsw-link007 st-link驱动这个关键词,这其实就是 ST 官方提供的 ST-Link 固件升级工具,全称是 STSW-LINK007。很多人遇到这个报错后第一反应是去升级固件,但升级完发现报错依旧,甚至更严重了,原因就在于升级的方向搞反了——不是所有场景都适合升级到最新固件。
我实测下来,这个报错主要出现在以下几种组合里:
| 场景 | ST-Link 类型 | 目标芯片 | 是否报错 |
|---|---|---|---|
| 场景A | 山寨 ST-Link V2 | 正品 STM32F103 | 偶发报错 |
| 场景B | 山寨 ST-Link V2 | 兼容型号(如 GD32、APM32) | 必报错 |
| 场景C | 原厂 ST-Link V2 | 正品 STM32 | 不报错 |
| 场景D | ST-Link V3 | 任意 | 不报错 |
| 场景E | 山寨 ST-Link V2 升级最新固件 | 正品 STM32 | 报错概率升高 |
这张表是我自己手头几块调试器和芯片反复交叉测试得出的,不一定覆盖所有情况,但能说明一个核心规律:报错和 ST-Link 的“血统”以及固件版本强相关,和芯片本身是不是正品反而关系没那么大。
还有一个容易被忽视的点是 Keil MDK 的版本。热词里出现了keil mdk 5.36 网盘,说明不少人在用 5.36 这个版本。Keil MDK 5.36 自带的 ST-Link 驱动版本比较新,对山寨 ST-Link 的兼容性反而不如老版本。如果你用的是 Keil MDK 5.36 配合山寨 ST-Link V2,那这个报错几乎是必然的。我后来换回 Keil MDK 5.29 配合同一块山寨 ST-Link,同样的板子同样的程序,下载一次成功,这就很能说明问题了。
所以解决这个问题的思路不是单一的“升级”或“降级”,而是要根据你手头的 ST-Link 类型、固件版本、Keil 版本、目标芯片型号这四个变量来组合判断。下面我会把两套经过实测的解决方案拆开讲,一套针对“不想换调试器”的场景,一套针对“愿意折腾固件”的场景。
2. 第一招:绕开校验,用 ST-Link Utility 独立烧录
当你被 Keil 里那个弹窗反复折磨的时候,最省事的思路其实是:不在 Keil 里下载,改用 ST-Link Utility 独立完成烧录。这个工具是 ST 官方出的,全称 STM32 ST-LINK Utility,热词里也有stm32 st-link utility下载这个搜索,说明很多人已经在走这条路了。
2.1 为什么 ST-Link Utility 能绕过这个报错
ST-Link Utility 和 Keil 调用 ST-Link 的方式有本质区别。Keil 是通过 ST-Link 的驱动接口做在线调试和下载,中间要经过 Keil 自己的 Flash 算法加载流程,这个流程里会触发 ST-Link 固件的芯片校验。而 ST-Link Utility 是直接和 ST-Link 通信,它自己实现了 Flash 编程算法,不依赖 Keil 的那套校验逻辑。简单说,Keil 是“借道”ST-Link,ST-Link Utility 是“直连”ST-Link,路径不同,触发校验的环节自然也不同。
我实测过一块山寨 ST-Link V2,固件版本是 V2.J27.S4,在 Keil MDK 5.36 里下载 STM32F103 必报Not a genuine ST Device,但用 ST-Link Utility V4.6.0 连接同一块板子,读芯片 ID、擦除、编程、校验一气呵成,没有任何报错。这说明问题确实出在 Keil 和 ST-Link 固件的交互环节,而不是 ST-Link 本身不能烧这块芯片。
2.2 具体操作步骤
先说一下工具获取。ST-Link Utility 在 ST 官网可以下载到,版本建议用 V4.6.0 或 V4.5.0,这两个版本对山寨 ST-Link 的兼容性最好。安装过程一路 Next 就行,注意安装到最后会提示安装 ST-Link 驱动,这个必须装,否则工具识别不到调试器。
装好之后的操作流程如下:
- 用 USB 线把 ST-Link 接到电脑,再把 ST-Link 的 SWDIO、SWCLK、GND、3.3V 四根线接到目标板。注意 3.3V 是给 ST-Link 内部电平转换用的,不是给目标板供电,目标板该接电源还是要接。
- 打开 ST-Link Utility,点
Target菜单下的Connect,或者直接点工具栏的插头图标。如果连接成功,下方状态栏会显示芯片型号和 Flash 容量。 - 点
Target->Erase Chip先全片擦除,这一步能解决很多“芯片读保护”导致的下载失败。 - 点
File->Open File,选择 Keil 编译生成的.hex文件。注意不是.axf,ST-Link Utility 不认 axf 格式。如果你 Keil 工程默认只生成 axf,需要在 Keil 的Options for Target->Output里勾选Create HEX File。 - 点
Target->Program & Verify,在弹出的对话框里确认起始地址(一般是 0x08000000),点Start开始烧录。 - 烧录完成后点
Target->Disconnect断开连接,给板子重新上电,程序就跑起来了。
这套流程我用了不下几十次,稳定性很高。唯一需要注意的是,ST-Link Utility 不支持在线调试,只能烧录,所以如果你需要单步调试,还是得回到 Keil 里解决报错问题,或者用 ST-Link Utility 烧录后再用 Keil 的调试模式连接——但调试模式同样可能触发那个校验,所以调试场景下还是得看第二招。
2.3 一个容易被忽略的细节:复位模式
ST-Link Utility 的连接设置里有一个Reset Mode选项,默认是Hardware Reset。如果你的目标板复位电路设计得比较特殊,比如复位引脚接了电容或者被其他电路拉低,硬件复位可能失败。这时候把Reset Mode改成Software Reset或者Core Reset往往能连上。我在一块自己画的 STM32F407 板上就遇到过这个问题,硬件复位死活连不上,改成Software Reset秒连。
这个细节和后面要讲的“复位键烦人问题”是有关联的,先记着,后面会展开。
3. 第二招:降级 ST-Link 固件,从根上消除校验
如果你不想每次烧录都开两个软件,希望直接在 Keil 里点 Download 就能用,那就得从 ST-Link 固件入手。核心思路是:把 ST-Link 固件降级到一个没有激进校验逻辑的版本。
3.1 为什么降级比升级更有效
很多人遇到报错的第一反应是升级固件,觉得新版本肯定修复了旧版本的 bug。但在这个场景下,逻辑恰恰相反。ST 在新版 ST-Link 固件里加强了对目标芯片的正品校验,本意是防止山寨芯片滥用,但实际效果是误伤了一大片正常用户。尤其是山寨 ST-Link V2,它的硬件设计和原厂有差异,新固件的校验逻辑跑在山寨硬件上更容易出问题。
热词里stsw-link007 st-link驱动 百度网盘这个搜索说明很多人在找 STSW-LINK007 这个固件升级工具。这个工具确实能升级也能降级,关键是你得知道该刷哪个版本的固件。我实测下来,V2.J27.S4 和 V2.J28.S7 这两个版本对山寨 ST-Link V2 最友好,校验逻辑比较宽松,Keil 里下载基本不报错。而 V2.J37.S3 及以后的版本,校验明显变严,山寨 ST-Link 很容易触发报错。
3.2 固件降级的完整操作
先准备好 STSW-LINK007 工具,安装后打开,界面很简单,就一个Device Connect按钮和一个固件版本显示区。操作步骤如下:
- 把 ST-Link 接到电脑,打开 STSW-LINK007,点
Device Connect。如果连接成功,会显示当前固件版本和 ST-Link 的序列号。 - 点
Firmware Upgrade按钮,会弹出一个文件选择框,让你选择固件文件。固件文件是.bin格式的,一般随工具一起提供,在安装目录的Firmware文件夹里。如果没有,需要单独下载对应版本的固件包。 - 选择你要降级到的固件版本文件,比如
STLinkV2.J27.S4.bin,点打开,工具会开始刷写固件。这个过程大概十几秒,期间不要拔 USB 线。 - 刷完后工具会提示升级成功,点确定,然后拔掉 ST-Link 重新插上,让新固件生效。
- 重新打开 Keil,点 Download,看看报错是否消失。
这里有个坑要提醒:不是所有山寨 ST-Link 都能随便刷固件。有些山寨 ST-Link 用的主控芯片和原厂不一样,刷原厂固件后可能直接变砖,连电脑都识别不了。我手头就有一块这样的,刷完固件后设备管理器里显示未知设备,最后只能用另一块 ST-Link 通过 SWD 接口给它重新刷固件才救回来。所以刷固件之前,最好确认一下你的 ST-Link 是不是“可刷”的型号。一个简单的判断方法是看 STSW-LINK007 能不能正常识别到它,如果能识别到序列号和当前固件版本,一般就能刷;如果连识别都识别不到,那就别折腾了,直接用第一招。
3.3 降级后的验证与回退
刷完固件后,建议做一次完整的验证:在 Keil 里新建一个最简单的 LED 闪灯工程,编译后点 Download,看是否能正常烧录。如果成功,再点 Debug 进入调试模式,看能否正常单步执行。这两步都通过,说明固件降级确实解决了问题。
如果降级后问题依旧,或者出现了新的问题(比如调试时频繁断连),那就需要回退到原来的固件版本。回退的方法和降级一样,只是选择的固件文件换成你之前备份的版本。所以在刷固件之前,一定要先记下当前固件版本号,最好把对应的固件文件也备份一份,方便随时回退。
4. 复位键按到手指疼:下载后必须手动复位才能运行的问题
解决了Not a genuine ST Device之后,很多人会遇到第二个烦人的问题:程序下载成功了,但板子没反应,必须手动按一下复位键才能运行。这个问题在热词里也有体现,复位这个词出现了很多次,说明它是 STM32 开发中的高频痛点。
4.1 为什么下载后需要手动复位
这个问题的根源在于 STM32 的启动模式和复位电路设计。STM32 上电后,会根据 BOOT0 和 BOOT1 引脚的电平决定从哪个区域启动。如果你用的是最小系统板,BOOT0 一般通过一个电阻接地,默认从 Flash 启动。但 ST-Link 在下载程序时,会通过 SWD 接口控制芯片的复位引脚,下载完成后释放复位,此时芯片重新从 Flash 启动,按理说应该自动运行新程序。
但实际情况是,有些板子的复位电路设计得比较“保守”,复位引脚上接了一个 0.1uF 甚至 1uF 的电容,导致复位释放的时间被拉长。ST-Link 释放复位后,芯片还没完全退出复位状态,SWD 接口就已经断开了,结果芯片停在某个中间状态,没有正常执行 Flash 里的程序。这时候手动按一下复位键,给复位引脚一个干净的低电平脉冲,芯片就能正常启动了。
还有一种情况是 Keil 的下载配置里没有勾选Reset and Run。这个选项在Options for Target->Utilities->Settings->Download Function里,勾上之后,Keil 会在下载完成后自动触发一次复位,让程序立即运行。很多人不知道这个选项,下载完看到板子没反应,就以为程序没烧进去,其实只是没运行而已。
4.2 硬件层面的排查与修改
如果你勾了Reset and Run还是需要手动复位,那就要从硬件上找原因了。先拿万用表量一下复位引脚的电压,正常应该是 3.3V。如果电压明显偏低,比如只有 1V 左右,说明复位电路有问题,可能是电容漏电或者电阻阻值不对。
常见的 STM32 最小系统板复位电路是一个 10K 电阻上拉到 3.3V,再加一个 0.1uF 电容到地,复位按键并联在电容两端。这个电路本身没问题,但如果电容质量不好,漏电流偏大,就会导致复位引脚电压被拉低,芯片一直处于复位状态。我遇到过一块板子,复位引脚电压只有 0.8V,换了电容之后恢复正常。
另一个容易被忽视的点是ST-Link 的复位引脚连接。ST-Link 的 SWD 接口里有一根NRST线,这根线接到目标板的复位引脚上,ST-Link 就能通过它控制芯片复位。但很多人在接线时只接了 SWDIO、SWCLK、GND、3.3V 四根线,没接 NRST。这样一来,Keil 的Reset and Run功能就失效了,因为 ST-Link 没法控制复位。所以如果你希望下载后自动运行,NRST 这根线一定要接上。
4.3 软件配置的完整清单
除了Reset and Run,Keil 里还有几个和复位相关的配置项,我整理成了一张表,方便对照检查:
| 配置项 | 位置 | 推荐设置 | 作用 |
|---|---|---|---|
| Reset and Run | Utilities -> Settings -> Download Function | 勾选 | 下载后自动复位运行 |
| Reset Mode | Debug -> Settings -> Reset | Hardware Reset | 使用硬件复位引脚 |
| Connect under Reset | Debug -> Settings -> Connect | 视情况勾选 | 复位状态下连接,解决锁芯片问题 |
| NRST 接线 | 硬件连接 | 必须接 | 让 ST-Link 能控制复位 |
其中Connect under Reset这个选项值得单独说一下。如果你的芯片被误设了读保护,或者程序跑飞导致 SWD 接口被禁用,正常连接是连不上的。这时候勾上Connect under Reset,Keil 会先拉低复位引脚,让芯片停在复位状态,然后再通过 SWD 连接,连接成功后再释放复位。这个方法能救回很多“变砖”的芯片,我至少用它救回过五六块。
5. 从根上避免:ST-Link 选型与开发环境搭配建议
折腾了这么多次,我现在的做法是:手头常备一块原厂 ST-Link V3 和一块刷了 V2.J27.S4 固件的山寨 ST-Link V2。原厂 V3 用于日常开发和调试,稳定省心;山寨 V2 用于烧录兼容型号芯片或者临时应急,因为它的固件版本对非正品芯片更宽容。
5.1 ST-Link 选型的几个硬指标
如果你正准备买 ST-Link,下面这几个指标建议重点看:
- 固件版本:优先选固件版本在 V2.J27 到 V2.J28 之间的,这个区间的校验逻辑最宽松。如果卖家不提供固件版本信息,买回来自己刷也行。
- 主控芯片:原厂 ST-Link V2 用的是 STM32F103C8T6,山寨版有的用 C8T6,有的用其他型号。用 C8T6 的山寨版兼容性最好,因为固件就是为这个芯片写的。
- 是否支持 SWO:SWO 是单线调试输出,用于 printf 重定向很方便。原厂 V2 和 V3 都支持,部分山寨 V2 也支持,买之前问清楚。
- 外壳和做工:这个看个人喜好,但建议选带金属外壳的,抗干扰好一些,USB 接口也更耐用。
5.2 Keil MDK 版本的搭配
Keil MDK 的版本选择也有讲究。我实测下来,Keil MDK 5.29 到 5.31 这几个版本对山寨 ST-Link 的兼容性最好,自带的 ST-Link 驱动版本比较老,不会触发激进的校验。5.36 及以后的版本驱动更新了,校验变严,山寨 ST-Link 容易报错。如果你已经装了 5.36,又不想重装,可以单独替换 Keil 安装目录下的 ST-Link 驱动文件,把老版本的STLinkUSBDriver.dll复制过去覆盖,也能达到类似效果。
热词里还有keil5兼容c51和stm32安装这个搜索,说明有人想在一个 Keil 里同时开发 51 和 STM32。这个是可以做到的,但要注意安装顺序:先装 Keil C51,再装 Keil MDK,两个装在不同目录,然后通过TOOLS.INI文件配置共存。不过这种共存环境偶尔会出现芯片包冲突的问题,如果遇到奇怪的报错,可以先把 C51 的芯片包禁用掉试试。
5.3 芯片包安装的注意事项
stm32芯片包安装也是热词之一。Keil MDK 从 5.0 开始,芯片支持包是单独安装的,不再集成在安装程序里。安装芯片包有两种方式:一种是在 Keil 里点Pack Installer在线安装,另一种是下载.pack文件离线安装。在线安装方便但速度慢,离线安装快但需要自己找包。
我一般用离线安装,因为在线安装经常卡在下载环节。.pack文件在 Keil 官网和各大电子论坛都能找到,下载后双击就能自动安装到 Keil 里。安装完成后,在 Keil 的Options for Target->Device里就能选到对应的芯片型号了。
这里有个小坑:芯片包版本和 Keil 版本要匹配。比如 Keil MDK 5.36 需要 STM32F1 芯片包的 2.3.0 或更高版本,如果装了老版本的芯片包,可能会在编译时提示找不到设备头文件。遇到这种情况,去 Pack Installer 里看一下已安装的芯片包版本,和 Keil 版本对照一下,该升级就升级。
6. 那些年我踩过的相关坑:从读保护到 SWD 引脚复用
除了上面两个主要问题,还有一些相关的坑值得一并说说,因为它们在排查Not a genuine ST Device的过程中经常一起出现,容易让人误判。
6.1 读保护导致的连接失败
STM32 的 Flash 有一个读保护功能,一旦启用,SWD 接口就无法读取 Flash 内容,ST-Link 连接时会报错。这个报错和Not a genuine ST Device长得不一样,但很多人会混淆。读保护的报错一般是Cannot access memory或者Flash read protected,遇到这个需要用 ST-Link Utility 的Target->Option Bytes里的Read Out Protection改成Disabled,然后全片擦除,才能恢复。
我遇到过一块二手板子,前任主人开了读保护,我拿到手后 Keil 死活连不上,一开始以为是Not a genuine ST Device,后来用 ST-Link Utility 一看,报的是读保护错误。所以遇到连接问题,先用 ST-Link Utility 连一下,看它报什么错,能快速区分是校验问题还是读保护问题。
6.2 SWD 引脚被复用为普通 IO
有些程序里会把 PA13 和 PA14 这两个 SWD 引脚复用成普通 GPIO 使用,比如用来驱动 LED 或者做按键输入。这样一来,程序跑起来之后 SWD 接口就失效了,下次想下载新程序就连不上了。解决办法是在 Keil 的 Debug 设置里勾选Connect under Reset,让芯片在复位状态下连接,此时引脚还没被复用,SWD 还能用。连接成功后,先擦除芯片,再下载新程序。
这个坑我在做基于stm32的智能台灯项目时踩过,当时把 PA13 复用成了触摸按键输入,结果下载完程序后 Keil 再也连不上了,折腾了好久才想起来是引脚复用的问题。从那以后,我在任何项目里都会保留 SWD 引脚,绝不复用。
6.3 复位电路的电容选型
回到复位这个话题,如果你自己画板子,复位电路的电容建议用 0.1uF 的陶瓷电容,不要用 1uF 的。1uF 电容虽然复位更可靠,但复位释放时间太长,会导致 ST-Link 下载后无法自动运行。0.1uF 是经过验证的平衡点,既能保证复位可靠,又不会影响下载后的自动运行。
另外,复位按键建议用轻触开关,不要用自锁开关。自锁开关如果忘记弹起,芯片会一直处于复位状态,表现就是“程序下载成功但不运行”,很容易误判为芯片坏了。
6.4 ST-Link 驱动冲突
Windows 上如果装过多个版本的 ST-Link 驱动,可能会出现驱动冲突,表现为设备管理器里 ST-Link 显示正常,但 Keil 和 ST-Link Utility 都连不上。解决办法是在设备管理器里卸载 ST-Link 设备,勾选“删除驱动程序软件”,然后重新插拔,让系统重新安装驱动。如果还不行,就去 ST 官网下载最新的 ST-Link 驱动单独安装。
热词里stm32驱动下载和st-link这两个搜索,大概率就是在找这个驱动。驱动装对了,很多连接问题自然就消失了。
7. 一套可复用的排查流程
折腾了这么多次,我总结了一套排查流程,遇到Not a genuine ST Device或者类似的下载问题时,按这个顺序走,基本能定位到原因:
- 先看报错原文。是
Not a genuine ST Device还是Cannot access memory还是No target connected?不同的报错指向不同的问题。 - 用 ST-Link Utility 试连。能连上说明 ST-Link 和硬件没问题,问题在 Keil 的校验环节;连不上说明是硬件连接或驱动问题。
- 检查 NRST 接线。没接 NRST 的话,先接上,很多复位相关的问题会迎刃而解。
- 检查 Keil 的 Reset and Run 配置。勾上之后再看下载后是否自动运行。
- 尝试降级 ST-Link 固件。如果 ST-Link Utility 能连但 Keil 报校验错误,降级固件到 V2.J27.S4 试试。
- 检查芯片读保护。用 ST-Link Utility 看 Option Bytes,读保护开了就关掉,然后全片擦除。
- 检查 SWD 引脚是否被复用。如果之前下载过程序且复用了 PA13/PA14,勾选
Connect under Reset再连。 - 换一块 ST-Link 交叉验证。如果以上都试过还不行,换一块确认没问题的 ST-Link 试试,能快速判断是不是调试器本身的问题。
这套流程我用了很多次,基本上走到第三步或第四步就能解决问题。最坏的情况也就是降级固件,花个十几分钟。
最后说一个我个人体会:ST-Link 这个调试器,原厂的虽然贵一点,但省下来的时间成本远超那点差价。我早期为了省钱买了好几块山寨 ST-Link,结果在固件兼容性上反复折腾,浪费的时间够买好几块原厂 V3 了。如果你只是偶尔烧录一下兼容芯片,山寨的凑合用也行;但如果是日常开发,建议直接上原厂 ST-Link V3,配合 Keil MDK 5.29 到 5.31 的版本,基本不会遇到Not a genuine ST Device这个报错。