
先说一个很多人问我的问题好好的电脑为什么非要在虚拟机里装 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虚拟机屏幕分辨率只能维持在 1024x768USB 直通、文件拖拽、剪贴板共享都会受限。在 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 只是用来检测目标板电源电压不会给目标板供电。如果你不接 VTrefJLink 会提示“Cannot measure target voltage”连接就会失败。所以目标板必须自己上电同时把 VCC 线与 JLink 的 VTref 脚接起来。SWD 模式下最少可以只接 SWDIO、SWCLK、GND、VTref 四根线。但如果目标芯片处于低功耗模式或者调试时容易跑飞最好把 NRST 也接上方便调试器强制复位芯片。5. 在 Keil 中配置 JLink 并完成烧录调试5.1 Keil 工程里的三项关键配置在 Keil 中打开你的工程依次点击“Options for Target”选项卡快捷键 AltF7里面有几项配置直接决定 JLink 能不能烧录成功。第一项在 Debug 选项卡里点击右侧的“Use”按钮在下拉框里选择“J-LINK / J-TRACE Cortex”。然后点击旁边的 Settings在 Debug 子页里把 Port 选择为 SWMax 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”按钮或按 F8Keil 就会调用 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 FrameworkJLink 提示“Cannot connect to target”接线、供电、芯片锁死、目标芯片不识别检查 SWD 接线与 VTrefJLink Commander 手动连接执行 erase 解锁编译失败提示找不到编译器MDK 安装不完整或 License 未激活重装 MDK检查 License Management 状态虚拟机上 Keil 很卡虚拟机分配资源不足或未安装 VMware Tools分配 4 核 8GB 内存装 VMware Tools关闭动画效果复制虚拟机到另一台电脑打不开虚拟机快照路径变化或授权变化打开 .vmx 文件前用“我复制它”重新激活 Keil LicenseJLink 提示检测到 Clone 或盗版使用了非正版仿真器尽量使用正版 JLink盗版设备可能导致调试不稳定6.2 几颗踩过的雷单独拿出来说第一个是 Keil 的汉化包问题。我看到网上流传各种 Keil uVision5 汉化包说实话不建议装。Keil 本身是英文界面菜单和选项都是固定的关键词你用英文版的去搜问题网上答案一搜一大把一旦汉化菜单文字和教程截图对应不上遇到问题反而更难受。虚拟机环境本来就为了干净没必要引入汉化包这种来路不明的东西。第二个是虚拟机的性能优化。默认创建虚拟机时显卡显存只有 128MBKeil 的编辑器和调试界面虽然不重但如果你同时开着浏览器查资料、开 PDF 看数据手册虚拟机内存很容易吃紧。可以在虚拟机的显示设置里把 3D 加速打开显存调到 2GB。另外虚拟机的 CPU 设置里开启“虚拟化 Intel VT-x/EPT 或 AMD-V/RVI”这个对编译速度影响明显。第三个是关于 JLink 固件升级。每次安装新版 JLink 驱动SEGGER 软件都会提示是否要升级仿真器固件。如果你用的 JLink 比较老或者手里是一个兼容型号不要轻易升级固件。固件升级是不可逆的升级完如果兼容性变差很难降级。我建议在虚拟机里安装驱动时勾选“Dont ask again for this version”能避免不必要的固件更新弹窗。6.3 最后的实用建议根据我个人的实际体验如果你经常在多个设备之间换着调试建议给虚拟机装一个串口调试工具比如 PuTTY 或 SecureCRT与 JLink 配合使用。JLink 负责烧录和调试串口负责看日志两个工具搭配开发效率会高很多。另外在虚拟机里安装完 Keil 和 JLink 后第一时间打个快照命名“keiljlink基础环境”。以后任何一次折腾导致环境出问题直接回到这个快照省去重装系统的几个小时。快照的另一个好处是换电脑时只需要复制这个虚拟机的文件到新机器双击 .vmx 就能打开一个现成的开发环境真正做到“环境随身走”。虚拟机装 Keil 和 JLink 这件事第一次弄会有些繁琐但只要把 USB 直通、驱动安装、工程配置这几个环节理顺后面再维护起来就非常省心。至少对我来说现在不管换哪台电脑、用哪个系统只要把虚拟机文件拿过去插上 JLink 就能马上进入开发状态这个体验是实体机给不了的。