☰
虚拟机搭建Keil与JLink:STM32开发环境隔离与调试指南
2026/10/1 16:31:59 网站建设 项目流程

先说一个很多人问我的问题:好好的电脑,为什么非要在虚拟机里装 Keil 和 JLink?直接在 Windows 上装一套不好吗?带着这个疑问来的人,一般是遇到了这几类情况:要么主力机是 Mac,公司给的却是 Windows 开发环境;要么公司在统一管理电脑,不方便往自己的开发机里乱装工具链;要么就是想搭一套可随时复制、不污染宿主机的嵌入式开发环境。这篇博文就是来把这个过程完整捋一遍的,从创建虚拟机到 Keil MDK 安装、JLink 驱动配置、SWD 接线烧录,再到我踩过的各种坑,一步一步讲清楚,确保你能在虚拟机里把 STM32 这类芯片正常烧录和调试起来。

我选择虚拟机方案,最核心的价值就是“隔离”。Keil、Pack 包、JLink 驱动这些工具,看起来安安静静的,实际上会写注册表、装各种服务、改系统环境变量,装多了以后宿主机越来越慢,卸载还不一定能卸干净。在虚拟机里关起门来随便造,坏了直接把虚拟磁盘删掉,一分钟还原,比折腾宿主机省心太多。这篇内容适合有嵌入式基础、但想在虚拟机环境里重新搭开发环境的人,也适合刚开始学 STM32、手头只有一台 Mac 或 Linux 电脑、又不得不用 Keil 的新手。

1. 为什么选择虚拟机方案,以及虚拟机平台怎么选

1.1 虚拟机方案解决的痛点

在你说“虚拟机会不会很卡”“USB 能不能识别”之前,我先说一下为什么值得折腾。

很多嵌入式开发的坑,归根结底是环境问题。Keil 的旧版本工程在打开时会自动去下载对应版本的 Pack,如果 Keil 版本太新,老工程里的设备描述文件可能不一致;JLink 驱动版本太新,某些老芯片反而连不上;今天装的某个运行库,明天又被另一个软件覆盖。这些问题在裸机 Windows 上特别常见,一旦环境坏了,查起来非常浪费时间。

虚拟机给了一套“快照”机制:在你安装完 Keil、JLink、STM32CubeMX、串口驱动,跑通一次完整的编译烧录流程之后,给虚拟机打个快照。以后不管怎么折腾,出了问题恢复到快照,20 秒回到一个干净的、可用的环境。这个优势,用实体机是没法比拟的。

另外,虚拟机还解决了多版本共存问题。Keil MDK 和 Keil C51 可以装在同一台机器上,但不同年份的 MDK 版本如果同时存在,容易互相打架。在虚拟机里,你需要 ARM 开发就开一个 Win10 虚拟机装 MDK5,需要 8051 开发就开另一个虚拟机装 C51,两个环境完全隔离,想用哪套就启动哪套,互相不影响。

1.2 VMware Workstation 和 VirtualBox 怎么选

我把两款主流虚拟机都试过一遍,直接给结论:如果你对性能有要求、希望 USB 直通稳定,首选 VMware Workstation Pro;如果想完全免费、不想折腾授权,VirtualBox 也完全够用。

VMware Workstation Pro 目前个人使用已经免费,这个优势非常大。USB 直通的兼容性比 VirtualBox 好很多,特别是 JLink 这种 HID/USB 复合设备,VMware 基本是插上就能识别到,VirtualBox 有时候需要手动添加 USB 过滤规则,稍微多几步。

VirtualBox 的强项是免费开源、跨平台,装完扩展包之后 USB 2.0/3.0 支持也还可以。但我的实际体验是,在 VirtualBox 里使用 JLink 时偶尔会出现“USB device busy”或者设备识别失败的问题,需要重启虚拟机或重新插拔 JLink。如果你只是偶尔烧录一次,VirtualBox 可以接受;如果你要长时间调试、频繁下载程序,强烈建议上 VMware Workstation Pro。

另外提醒一句,不管你用哪款虚拟机软件,宿主机是 Windows 还是 macOS/Linux,都不要开启系统自带的 Hyper-V 与虚拟机嵌套同时使用,这会导致 VM 里访问 USB 时出现各种莫名其妙的卡顿。

2. 创建虚拟机的关键步骤和参数设置

2.1 虚拟机配置参数直接抄

这部分是标准的,照着设置即可。我建议虚拟机的操作系统选择 Windows 10 x64,不要选 Windows 11,因为 Win11 对硬件要求更多,在虚拟机里跑 Keil 这种轻量 IDE 没必要用最新系统,Win10 的资源占用更小,工具链兼容性也更好。

关键参数建议如下:

配置项推荐值说明
CPU 核心数4 核编译多文件工程时提升明显
内存8 GBKeil 本身不大,但加上浏览器、调试器等足够
虚拟磁盘60 GB 或 80 GBKeil、Pack、工程文件会占不少空间
网络类型NAT 即可下载软件、注册 License 用
USB 控制器USB 3.1JLink 新版都支持 USB 3.0 向下兼容
固件类型BIOS与老版本破解激活工具兼容性更好

有个容易被忽略的细节:创建虚拟机时选择“稍后安装操作系统”,这样可以手动调整硬件参数,避免默认配置太低。等虚拟机创建好后再挂载 Windows 镜像文件,系统安装过程不受影响。

2.2 安装 VMware Tools 和基础环境

Windows 系统装好后,第一步一定是安装 VMware Tools。这个步骤非常关键,没有 VMware Tools,虚拟机屏幕分辨率只能维持在 1024x768,USB 直通、文件拖拽、剪贴板共享都会受限。

在 VMware 菜单栏选择“虚拟机 - 安装 VMware Tools”,之后在虚拟机光驱里运行 setup,重启虚拟机即可。安装完 Tools 后,我建议先将分辨率调整到 1920x1080 或更高,方便后续看 Keil 的调试界面。

然后还需要安装两个东西:一个是微软常用运行库合集(Visual C++ Redistributable),另一个是 .NET Framework 4.8 或更新版本。Keil MDK 和 JLink 驱动在安装时不会自动帮你装这些依赖,缺了会出现安装到一半报错,或者打开 Keil 时提示缺少 DLL。

安装完以上基础环境后,先给虚拟机做一个“干净系统”快照。这个快照会是你以后所有折腾的安全网,万一后面环境弄坏了,恢复到这个节点相当于重装一次系统。

3. 在虚拟机内部署 Keil MDK 与 8051 开发环境

3.1 下载、安装时的选型思路

Keil 这个品牌下产品线比较杂,很多新手分不清自己该装哪个。这里先厘清概念:你如果是开发 STM32 这类 ARM Cortex-M 内核的芯片,装的是 Keil MDK-ARM(现在叫 Keil MDK,安装包文件名一般是 MDK5.xx);你如果是开发 8051 单片机,装的是 Keil C51。两者可以共存于同一个系统,但安装顺序最好先装 MDK 再装 C51,否则启动 Keil 时会有 IDE 关联混乱的问题。

下载渠道一定要认准官方,我平时都是直接访问 Arm Keil 官网的下载页面,不要从第三方下载站拿安装包。第三方打包的安装包经常捆绑流氓软件,有的还会替换成旧版本,导致后面各种疑难杂症。

安装时记得右键“以管理员身份运行”。安装路径我建议直接默认,不要改成中文路径,也不要装在 Program Files (x86) 之外的地方,否则 Pack 包的默认路径和编译器路径会出现不匹配。

Keil MDK 安装界面中,分别在安装完软件本体后,会自动弹出 Pack Installer,你需要在线下载与自己芯片对应的器件 Pack。比如 STM32F1 系列就搜索 STM32F1xx 的 Device Family Pack。这里网络必须通畅,如果在线下载慢,可以直接去 Keil 官网的 Pack 页面下载 .pack 离线安装包,双击即可导入。

3.2 License 激活

Keil MDK 免费版有容量限制(代码不超过 32KB,且不支持某些调试功能),做学习用可以,但正式开发建议使用正版授权。激活的方式是:先打开 Keil uVision5,点击“File - License Management”,把右侧显示的 CID 复制下来,然后到正版授权页面申请激活码。

这里特地提醒一句,网上很多人提到的“注册机”之类的东西,我强烈不建议碰。一方面,来源不明的 keygen 大概率被杀毒软件报毒,还存在后门风险,专门针对开发机下手;另一方面,开发工具本身承担着保证代码安全的责任,没必要为了省一点授权费把自己的工程和成果暴露在风险里。正规途径是联系 Arm 原厂或者代理商申请评估 License,很多芯片原厂(比如国内的 GD32、华大、极海等)也会为开发者提供专用的 Keil License,合法、安全、稳定。

激活成功后,License Management 对话框里会显示当前授权的产品名(比如 MDK-ARM Professional)和到期时间。如果是授权到 2029 年或更久,说明激活成功,可以正常用了。

3.3 安装完成后的验证

装好之后,先别急着建工程,花一分钟验证环境是否正常。新建一个文件夹,比如叫 test_gpio,然后在 Keil 里新建一个简单的 main.c 函数,只操作几个 GPIO 口,编译一次,确保编译器能正确执行、没有报工具链找不到的错误。

如果编译时提示“Target not created”或“Arm Compiler not installed”,多半是 MDK 安装时没有把 AC5/AC6 编译器安装完整,或者 License 没生效。此时重新打开 Pack Installer,检查 Toolchain 列表,把编译器对应的组件补装一下。

在验证完编译后,还可以检查一下打包好工程后能否正常生成 .hex 文件。在 Options - Output 里勾选 Create HEX File,编译后到 Listings 或 Output 目录确认有没有生成 hex 文件,这个文件是后面烧录要用到的关键产物。

4. JLink 驱动的安装与目标板连接

4.1 安装 SEGGER J-Link 驱动

JLink 不是 Keil 的附属品,它是一套独立的调试烧录工具链。你从硬件上买了 JLink 仿真器,还需要在系统里装对应版本的驱动和上位机软件,才能在 Keil 里调用它来给芯片下载程序。

JLink 的官方软件包叫做“J-Link Software and Documentation Pack”,去 SEGGER 官网下载,注意选择 Windows 版本。安装时同样右键管理员运行,默认安装即可。安装完成后,设备管理器里应该能看到“J-Link”设备,并且不会出现黄色感叹号。

这里有个版本兼容性问题值得特别注意:JLink 软件包不是越新越好。如果你用的是某些国产 MCU、老款 NXP 芯片、或者芯片的 Flash 算法比较特殊,新版 JLink 反而可能连接不上,提示“Cannot connect to target”或“Unsupported device”。遇到这种情况,建议下载一个修改版的 JLink 版本,以匹配你的目标芯片。当然,官方原版驱动始终是最安全、最值得优先尝试的方案,只有在确认兼容性问题时才考虑换用旧版本。

4.2 USB 设备如何从宿主机直通到虚拟机

这一步是整篇内容的核心,也是很多人失败的地方。VJLink 插到宿主机 USB 口后,默认是被宿主机操作系统捕获的,虚拟机系统里根本看不到这个设备。你需要手动把 USB 设备“移交”给虚拟机。

在 VMware Workstation 中,操作路径是:虚拟机运行时,点击菜单栏的“虚拟机 - 可移动设备 - SEGGER JLink - 连接(断开与主机的连接)”,这样 JLink 就从宿主机切换到了虚拟机。如果是 VirtualBox,需要先在“设置 - USB 设备”中添加一个 JLink 对应的过滤规则,插入后选择“连接到虚拟机”。

切换完成后,在虚拟机里打开设备管理器,看到“J-Link”出现在“通用串行总线控制器”或“通用串行总线设备”分类下,说明 USB 直通成功。

这里有一个非常容易踩的坑:如果你在 VMware 的“可移动设备”菜单里没有看到 JLink,多半是因为虚拟机设置中 USB 控制器类型选错了。比如你用 USB 3.0 的 J-Link,但虚拟机设成了 USB 2.0,系统可能会识别失败。直接把 USB 控制器改成“USB 3.1”,并把“与虚拟机共享蓝牙设备”关掉,重新插拔 JLink 再试。

另一个坑是物理 USB 口直插主板的兼容性。如果你把 JLink 插在扩展坞或前置 USB 口上,可能出现电压不稳或 USB 控制器冲突。我建议把 JLink 直接插在主机背面 USB 口上,然后重新连接。

4.3 JLink 接线要点:SWD 接口定义

JLink 与目标板的物理连接,最常见的是 SWD 模式,只需要四根线。这里把接口定义整理成表格,方便你对着接线,别接错了。

J-Link 引脚号信号名对应目标板引脚说明
1VTref目标板电源 VCC一般接 3.3V,用来检测目标板电压
3SWDIO / TMSSWDIO数据线,双向
5SWCLK / TCKSWCLK时钟线
7SWO / TDOSWO调试追踪输出,可选
9SWDIO / TDI不接在 SWD 模式下不用
13SWO可选部分调试功能需要
4GNDGND必须共地
19NRSTRESET可选,但推荐接上

特别提醒:VTref 这根线,很多新手以为是给目标板供电用的,其实不是。J-Link 的 VTref 只是用来检测目标板电源电压,不会给目标板供电。如果你不接 VTref,JLink 会提示“Cannot measure target voltage”,连接就会失败。所以目标板必须自己上电,同时把 VCC 线与 JLink 的 VTref 脚接起来。

SWD 模式下,最少可以只接 SWDIO、SWCLK、GND、VTref 四根线。但如果目标芯片处于低功耗模式,或者调试时容易跑飞,最好把 NRST 也接上,方便调试器强制复位芯片。

5. 在 Keil 中配置 JLink 并完成烧录调试

5.1 Keil 工程里的三项关键配置

在 Keil 中打开你的工程,依次点击“Options for Target”选项卡(快捷键 Alt+F7),里面有几项配置直接决定 JLink 能不能烧录成功。

第一项在 Debug 选项卡里,点击右侧的“Use”按钮,在下拉框里选择“J-LINK / J-TRACE Cortex”。然后点击旁边的 Settings,在 Debug 子页里把 Port 选择为 SW,Max Clock 根据目标板情况选择。如果连接不稳定,把时钟速度从默认 4MHz 降到 1MHz 或 500kHz。这里特别提醒一句,不要勾选“Use CoreSight”之类的选项,除非你确定你的芯片支持,否则会导致连接失败。

第二项在 Utilities 选项卡里,点击“Settings”里面有 Flash Download 的配置,需要添加你所用芯片对应的 Flash 算法。比如 STM32F103C8T6,要添加“STM32F10x Med-density 128K Flash”,点击 Add 按钮把它加入编程算法列表。如果不添加,烧录时会提示“No Algorithm found”或“Flash Download failed - Target DLL has been cancelled”。

第三项在 Output 选项卡中,勾选“Create HEX File”,这样每次编译都会自动生成可以在 JLink 命令行烧录的 hex 文件。如果后续要用 J-Flash 或命令行批量烧录,这个文件是必须的。

5.2 第一次烧录的实际操作流程

配置好工程后,先编译一次,确保 0 Error,然后再进入烧录环节。在 Keil 里点击“LOAD”按钮(或按 F8),Keil 就会调用 JLink 连接目标芯片并下载程序。

我第一次在虚拟机上点 LOAD 时,屏幕卡了好几秒,然后提示“Cannot connect to target”。这个问题的排查顺序很重要:先看目标板电源是否正常,再看 JLink 的 VTref 是否检测到电压,然后检查 SWD 接线是否松动或接反,最后用 JLink Commander 手动测试连接。

打开 SEGGER JLink Commander(安装驱动后自带)的方法:启动后输入设备型号,比如 STM32F103C8,然后选择连接方式 SWD,再输入连接速度 4000。如果它输出“Connected successfully”,说明硬件链路没问题,问题出在 Keil 配置上。如果它提示“Cannot connect to target”,大概率是接线、供电或者芯片被读保护锁住了。

芯片被锁是另一个常见问题。遇到“Cannot connect to target”且接线无误时,可以在 JLink Commander 里执行“unlock Kinetis”或者对应芯片的 unlock 命令,但更通用的做法是直接使用“erase”命令对整个芯片做全片擦除。擦除会清掉 Flash 里的程序,但会解除读保护,之后就能正常烧录了。这个操作对学习板来说损失不大,但如果是产品板上数据很重要,先备份再擦除。

5.3 虚拟机上调试的注意事项

在虚拟机上调试和实体机最大的区别,就是 USB 链路多了一层虚拟化转发。实际使用中,只要 JLink 已成功连接,调试窗口里的变量观察、断点、单步执行与实体机没有差别。

不过有一点要注意:虚拟机的 USB 转发对实时性有一定影响。尤其是在调试时开启数据观察点,或者使用 ETM 跟踪时,大量数据通过 USB 从目标板传到虚拟机,可能会有延迟。解决办法是尽量用 SWD 模式而不是 JTAG 模式,SWD 占用的引脚少,传输效率也更高;同时把 JLink 的采样时钟降到合理范围。如果你只是进行常规的变量查看和断点调试,完全感觉不到延迟。

调试技巧方面,Keil 的调试器有一个非常实用的功能:在 Debug 界面的 Watch 窗口里,可以右键添加结构体变量,选择展开,就能看到结构体内部所有成员的值。很多新手不知道这个,只会盯着 SFR 窗口看寄存器,效率很低。在虚拟机里操作这个界面时,如果觉得响应慢,把断点的“Breakpoint Manager”里多余的断点删掉,能明显提升仿真速度。

6. 虚拟机环境下常见问题与排查速查表

6.1 高频问题汇总

我在虚拟机环境里反复折腾过各种问题,下面这张表是遇到频率最高的问题和处理方法,建议保存下来直接对照使用。

问题现象常见原因处理方式
虚拟机识别不到 JLinkUSB 控制权还在宿主机,或 USB 控制器类型不对在 VMware 菜单“可移动设备”中手动连接;设置 USB 3.1 重新插拔
驱动安装后设备管理器感叹号驱动版本与系统不匹配,或安装时未用管理员权限卸载后右键管理员重装;下载新版 JLink 驱动
Keil 打开报错缺少 DLL运行库缺失安装 Visual C++ Redistributable 与 .NET Framework
JLink 提示“Cannot connect to target”接线、供电、芯片锁死、目标芯片不识别检查 SWD 接线与 VTref;JLink Commander 手动连接;执行 erase 解锁
编译失败提示找不到编译器MDK 安装不完整或 License 未激活重装 MDK,检查 License Management 状态
虚拟机上 Keil 很卡虚拟机分配资源不足,或未安装 VMware Tools分配 4 核 + 8GB 内存;装 VMware Tools;关闭动画效果
复制虚拟机到另一台电脑打不开虚拟机快照路径变化或授权变化打开 .vmx 文件前用“我复制它”;重新激活 Keil License
JLink 提示检测到 Clone 或盗版使用了非正版仿真器尽量使用正版 JLink,盗版设备可能导致调试不稳定

6.2 几颗踩过的雷,单独拿出来说

第一个是 Keil 的汉化包问题。我看到网上流传各种 Keil uVision5 汉化包,说实话不建议装。Keil 本身是英文界面,菜单和选项都是固定的关键词,你用英文版的去搜问题,网上答案一搜一大把;一旦汉化,菜单文字和教程截图对应不上,遇到问题反而更难受。虚拟机环境本来就为了干净,没必要引入汉化包这种来路不明的东西。

第二个是虚拟机的性能优化。默认创建虚拟机时,显卡显存只有 128MB,Keil 的编辑器和调试界面虽然不重,但如果你同时开着浏览器查资料、开 PDF 看数据手册,虚拟机内存很容易吃紧。可以在虚拟机的显示设置里把 3D 加速打开,显存调到 2GB。另外,虚拟机的 CPU 设置里开启“虚拟化 Intel VT-x/EPT 或 AMD-V/RVI”,这个对编译速度影响明显。

第三个是关于 JLink 固件升级。每次安装新版 JLink 驱动,SEGGER 软件都会提示是否要升级仿真器固件。如果你用的 JLink 比较老,或者手里是一个兼容型号,不要轻易升级固件。固件升级是不可逆的,升级完如果兼容性变差,很难降级。我建议在虚拟机里安装驱动时,勾选“Don't ask again for this version”,能避免不必要的固件更新弹窗。

6.3 最后的实用建议

根据我个人的实际体验,如果你经常在多个设备之间换着调试,建议给虚拟机装一个串口调试工具,比如 PuTTY 或 SecureCRT,与 JLink 配合使用。JLink 负责烧录和调试,串口负责看日志,两个工具搭配,开发效率会高很多。

另外,在虚拟机里安装完 Keil 和 JLink 后,第一时间打个快照,命名“keil+jlink基础环境”。以后任何一次折腾导致环境出问题,直接回到这个快照,省去重装系统的几个小时。快照的另一个好处是,换电脑时只需要复制这个虚拟机的文件到新机器,双击 .vmx 就能打开一个现成的开发环境,真正做到“环境随身走”。

虚拟机装 Keil 和 JLink 这件事,第一次弄会有些繁琐,但只要把 USB 直通、驱动安装、工程配置这几个环节理顺,后面再维护起来就非常省心。至少对我来说,现在不管换哪台电脑、用哪个系统,只要把虚拟机文件拿过去,插上 JLink 就能马上进入开发状态,这个体验是实体机给不了的。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询