ARTICLE DETAIL

资讯详情

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

MDK 5.42安装顺序详解:先装Core再拉芯片包,避免芯片列表为空

MDK 5.42安装顺序详解:先装Core再拉芯片包,避免芯片列表为空 1. 为什么安装顺序这件事值得单独拿出来说装 MDK 这件事看起来就是一路 Next 的事但我见过太多人卡在最后一步软件装完了新建工程选芯片的时候发现列表里空空如也或者只有几个莫名其妙的型号。然后开始怀疑是不是安装包坏了、是不是系统不兼容、是不是要重装系统。实际上十有八九就是一个顺序问题——先装软件本体再拉芯片包这个顺序反了后面全是麻烦。MDK 5.42 这个版本属于 Arm Keil 系列里比较新的一个维护版本。它和早期 Keil 4、Keil C51 那套东西已经完全不是一回事了。现在的 MDK 由两部分组成一个是MDK Core也就是 IDE 本体、编辑器、调试器、编译器工具链另一个是Software Packs芯片支持包业内习惯叫 DFPDevice Family Pack。Core 是骨架Pack 是血肉。骨架没立起来就往里塞血肉塞不进去骨架立好了但没塞血肉那就是个空壳子能打开但干不了活。这篇文章适合几类人看第一次装 MDK 的新手、从 Keil 4 或 C51 迁移过来的老用户、以及那些装完之后发现芯片列表不对、编译报错、Pack Installer 打不开的人。我会把整个安装链路拆开讲包括每一步为什么这么做、哪些地方容易翻车、装完之后怎么验证是不是真的装好了。不是照着官方文档念一遍而是把实际踩过的坑和验证方法都摆出来。关键词里提到的 MDK、Keil、芯片包、安装这四个词基本就是这条链路的全部核心。下面按实际操作顺序展开但重点会放在那些文档里不写、但实际会卡住你的地方。2. 装之前先把这几件事理清楚2.1 MDK Core 和芯片包到底是什么关系很多人对 MDK 的理解还停留在一个软件的层面觉得装完就万事大吉。但 MDK 5.x 之后Arm 把它拆成了两层架构这个设计思路其实和 VS Code 装插件、或者 Python 装第三方库有点像。MDK Core提供的是通用能力代码编辑器、项目管理、编译工具链Arm Compiler 6、调试引擎ULINK、J-Link、ST-Link 的驱动接口、以及 Pack Installer 这个包管理工具。它本身不包含任何具体芯片的信息。芯片包DFP才是告诉 MDKSTM32F103C8T6 有多少 Flash、多少 RAM、寄存器地址在哪、启动文件长什么样、外设怎么配置的东西。没有这个包MDK 就不知道你选的那颗芯片是什么自然也没法编译出正确的代码。所以顺序必须是先让 Core 跑起来Core 里的 Pack Installer 才能去拉 Pack。如果先手动下载了 Pack 文件但 Core 还没装那这个 Pack 文件双击也装不上因为它依赖 Core 里的安装器组件。提示有些教程会让你先下载离线 Pack 包再装软件这个顺序在 MDK 5.x 上是行不通的。离线包的正确用法是 Core 装好之后通过 Pack Installer 的Import功能导入而不是双击安装。2.2 5.42 这个版本号意味着什么MDK 的版本号不是随便跳的。5.42 属于 5.3x 之后的维护分支主要变化集中在几个方面对 Arm Compiler 6 的支持更完善、Pack Installer 的网络请求逻辑有调整、以及对新出的一些 Cortex-M 系列芯片的兼容性更新。版本号里的小数点后第二位42代表的是维护版本不是大版本更新。这意味着它的核心架构和 5.3x 是一致的安装流程也基本一样。但 5.42 在 Pack 拉取这块做了一些改动最明显的就是网络请求失败时的提示更明确了不再像老版本那样默默卡住不动。如果你之前装过 5.36 或更早的版本会发现 5.42 在 Pack Installer 的界面上有细微调整但整体逻辑没变。真正需要注意的是5.42 对操作系统的要求比老版本高了一些Windows 7 虽然还能跑但官方推荐 Windows 10 及以上。2.3 安装前需要准备的环境在动手之前有几件事最好先确认一下能省掉后面很多来回折腾的时间。磁盘空间MDK Core 本体大概 1.5GB 左右但装完之后加上各种 Pack轻松超过 5GB。如果要把 STM32 全系列、GD32、NXP 的包都拉下来10GB 都打不住。建议至少留 20GB 的余量而且路径里不要有中文和空格。网络环境Pack Installer 需要从 Arm 的服务器拉取包列表和包文件。这个过程中如果网络不稳定会出现列表拉取失败或者下载到一半卡住的情况。这不是软件坏了是网络问题。后面会专门讲怎么处理。杀毒软件这个容易被忽略。有些杀毒软件会把 MDK 的编译工具链armcc.exe、armclang.exe误判成可疑程序导致编译时报找不到编译器或者访问被拒绝。装之前最好把 MDK 的安装目录加到杀毒软件的白名单里。旧版本残留如果之前装过 Keil 4 或者老版本的 MDK注册表里会有残留。5.42 的安装程序虽然会尝试清理但有时候清不干净导致新版本装完之后 Pack Installer 行为异常。这种情况建议先用官方卸载工具彻底清理再装新版本。3. 软件本体的安装每一步都在解决什么问题3.1 安装包获取与校验MDK 5.42 的安装包从 Arm 官网获取文件名通常是MDK542.exe这种格式。下载完之后第一件事不是双击而是校验文件完整性。为什么这一步重要因为安装包体积大几百 MB下载过程中如果网络抖动文件可能损坏。损坏的安装包在安装过程中会报各种奇怪的错误比如解压失败文件写入错误让你以为是系统问题实际上是安装包本身不完整。校验方法很简单对比官网提供的 SHA-256 哈希值。Windows 上可以用 PowerShell 执行Get-FileHash -Algorithm SHA256 .\MDK542.exe把输出的哈希值和官网页面上的值对比一致就说明文件没问题。不一致就重新下载别抱侥幸心理。3.2 安装路径的选择逻辑安装程序默认会装到C:\Keil_v5这个路径。我的建议是保持默认或者改到一个纯英文、无空格的短路径比如D:\Keil_v5。为什么不建议装到C:\Program Files\Keil因为 Program Files 目录有额外的权限限制MDK 在运行过程中需要往安装目录写一些临时文件和配置权限不够的时候会报错。而且路径里有空格的话某些老旧的编译脚本会解析出错。另外不要装到中文路径下。这个不是 MDK 独有的问题很多开发工具对中文路径的支持都不好。D:\开发工具\Keil这种路径看起来没问题但实际编译的时候可能因为编码问题导致找不到文件。3.3 安装过程中的几个关键选项安装过程中会弹出几个选项这里逐个说明。Pack 安装选项安装程序会问你要不要顺便安装一些常用的 Pack。我的建议是先不勾选等 Core 装完、验证能正常启动之后再通过 Pack Installer 按需拉取。原因很简单安装程序里带的 Pack 版本可能不是最新的而且一次性装太多会拖慢安装速度出问题也不好定位。ULINK 驱动如果你用的是 ULINK 系列调试器这个要勾上。如果用 J-Link 或 ST-Link可以不勾后面单独装驱动。勾了也不影响只是多装一个驱动。Arm Compiler 版本5.42 默认带的是 Arm Compiler 6。如果你有老项目需要 Arm Compiler 5可以在这里勾选同时安装。但注意AC5 和 AC6 的语法有差异新项目建议直接用 AC6。注册信息安装过程中会要求填写用户信息随便填就行不影响功能。真正影响功能的是后面的 License 激活。3.4 安装完成后的第一件事验证 Core 是否正常装完之后先别急着拉 Pack。打开 MDK看几个地方能正常启动没有报缺少 DLL之类的错误。Help → About里能看到版本号是 5.42。Pack Installer 能打开Project → Manage → Pack Installer。如果 Pack Installer 打不开或者打开后一片空白说明 Core 的安装有问题这时候拉 Pack 也是白拉。常见原因是 .NET Framework 版本不够MDK 5.42 需要 .NET 4.6 以上。Windows 10 一般自带Windows 7 可能需要手动装。注意Pack Installer 第一次打开会比较慢因为它要初始化本地数据库。如果超过一分钟还是空白再考虑是不是有问题。4. 芯片包的拉取网络、版本与离线方案4.1 Pack Installer 的工作机制Pack Installer 本质上是一个包管理器它的工作流程分三步先从 Arm 的服务器拉取一个包索引文件包含所有可用 Pack 的列表和版本信息然后根据你选择的 Pack 去下载对应的包文件最后把包解压到本地目录并注册到 MDK 的数据库里。这个流程里第一步是最容易出问题的。因为包索引文件比较大而且服务器在境外网络请求失败的概率不低。失败的表现通常是Pack Installer 打开后左侧的 Devices 列表是空的或者只显示了一部分状态栏提示Pack list update failed之类的信息。遇到这种情况先别怀疑软件。检查网络连接然后点 Pack Installer 里的Refresh按钮重试。如果反复失败就考虑用离线方案。4.2 在线拉取的实操步骤假设网络正常在线拉取的步骤是这样的打开 Pack InstallerProject → Manage → Pack Installer。等待左侧 Devices 列表加载完成。这个过程可能需要几十秒到几分钟取决于网络速度。在左侧找到你的芯片厂商比如 STMicroelectronics → STM32F1 Series → STM32F103。右侧会显示这个系列对应的 Pack通常叫Keil.STM32F1xx_DFP。点击 Pack 名称旁边的Install按钮。等待下载和安装完成状态变成绿色对勾。安装完成后新建工程时就能在芯片列表里看到对应的型号了。这里有个细节Pack 的版本选择。右侧通常会显示多个版本有最新版也有历史版本。一般情况下选最新版就行但如果你的项目有特定的版本要求比如老项目用的是旧版 HAL 库就要选对应的版本。版本不匹配会导致编译报错比如找不到某个头文件或者函数。4.3 网络请求失败时的排查链路st 服务器拉取芯片固件包列表的时候网络请求失败了——这个提示在热词里出现了说明是高频问题。遇到这个按下面的顺序排查第一步确认是不是全局网络问题。打开浏览器访问一个常用网站看能不能正常打开。如果浏览器也打不开那就是网络本身的问题跟 MDK 无关。第二步确认是不是 Arm 服务器的问题。有时候是 Arm 那边的服务器在维护或者临时故障这种情况只能等或者用离线包。第三步检查防火墙和代理设置。有些公司网络或者校园网会限制对境外服务器的访问。如果是在这种网络环境下在线拉取基本没戏直接走离线方案。第四步检查 Pack Installer 的配置。Pack Installer 里有一个 Settings 选项可以配置代理。如果公司网络需要走代理才能访问外网这里要填上代理地址。但注意代理配置不对反而会导致请求失败所以填之前先确认代理是可用的。第五步清理本地缓存重试。Pack Installer 会在本地缓存包索引文件如果缓存损坏也会导致请求失败。缓存目录通常在C:\Users\你的用户名\AppData\Local\Arm\Packs下面把这个目录清空后重启 Pack Installer它会重新拉取。4.4 离线安装包的获取与导入在线拉取走不通的时候离线包就是救命稻草。离线包的获取方式有几种从 Arm 官网直接下载Arm 的 Pack 下载页面可以单独下载每个 DFP 的 .pack 文件。从芯片厂商官网下载ST、GD、NXP 这些厂商的官网也会提供对应的 Pack 文件。从其他已经装好的机器上拷贝如果同事的电脑上已经装好了可以直接把 Pack 文件拷过来。拿到 .pack 文件之后导入方式是打开 Pack Installer → File → Import → 选择 .pack 文件 → 等待导入完成。导入完成后同样要验证芯片列表里有没有出现对应的型号。如果没有可能是 Pack 文件和 MDK 版本不兼容换一个版本的 Pack 试试。提示离线包的文件名通常长这样Keil.STM32F1xx_DFP.2.4.0.pack文件名里包含了厂商、系列和版本号。导入之前先确认版本号是不是你需要的。4.5 芯片包安装失败的几种典型表现Pack 安装失败的表现不止一种对应的原因也不同。下面用表格整理一下常见情况和处理方式。表现可能原因处理方式芯片列表里找不到型号Pack 没装成功或装到了错误的 MDK 版本下检查 Pack Installer 里对应 Pack 的状态重新安装编译时报找不到头文件Pack 版本和代码不匹配换用代码对应的 Pack 版本Pack Installer 显示已安装但无法使用本地数据库损坏删除 Pack 缓存目录重新导入导入 .pack 文件时报错文件损坏或版本不兼容重新下载或换版本安装过程中卡住不动网络问题或磁盘空间不足检查网络和磁盘空间5. 装完之后怎么验证是真的能用了5.1 新建一个最小工程跑通编译装完 Core 和 Pack 之后最可靠的验证方式是新建一个最小工程编译一遍。步骤Project → New uVision Project选一个路径工程名随便起。在弹出的芯片选择窗口里找到你装的 Pack 对应的芯片型号比如 STM32F103C8。弹出是否添加启动文件的提示选是。在工程里新建一个 main.c写一个空的 main 函数。点击 BuildF7看能不能编译通过。如果能编译通过说明 Core、Pack、编译器工具链都是正常的。如果报错根据错误信息定位问题。常见的错误是找不到 device或者找不到启动文件这通常意味着 Pack 没装好或者芯片型号选错了。5.2 检查 Pack 的实际安装位置Pack 装完之后文件实际放在哪里默认路径是C:\Users\你的用户名\AppData\Local\Arm\Packs。这个目录下会按厂商和系列分文件夹每个 Pack 一个目录。为什么要知道这个路径因为有时候需要手动检查 Pack 里的文件比如看某个头文件是否存在、启动文件是不是对的。另外如果要把 Pack 迁移到另一台机器直接拷贝这个目录下的对应文件夹也是一种方式但不如用 .pack 文件导入规范。5.3 调试器驱动的验证如果你要用 ST-Link 或 J-Link 调试装完 MDK 之后还需要确认调试器驱动是否正常。验证方法把调试器插上打开设备管理器看有没有识别到对应的设备。然后在 MDK 的 Options for Target → Debug 里选择对应的调试器点 Settings看能不能识别到芯片。如果识别不到通常是驱动没装或者版本太老。ST-Link 的驱动可以从 ST 官网下载J-Link 的驱动从 SEGGER 官网下载。装完驱动之后重启 MDK。5.4 一个完整的验证清单为了不遗漏把验证项整理成清单装完之后逐项过一遍MDK 能正常启动About 里版本号正确Pack Installer 能打开设备列表能加载目标芯片的 Pack 显示已安装新建工程时能在列表里找到目标芯片最小工程能编译通过调试器能被识别能连接目标芯片编译输出的 hex 文件能正常生成这份清单全过了说明安装环节没有遗留问题。后面写代码、调试出问题就可以排除安装因素专心查代码和硬件。6. 那些文档里不写但实际会遇到的坑6.1 Keil C51 和 MDK 共存的问题热词里出现了keilc51和mdk同时安装这是个经典问题。C51 和 MDK 是两个不同的工具链C51 针对 8051 系列MDK 针对 ARM 系列。它们可以装在同一台机器上但不能装在同一个目录下。如果装在同一目录会出现工具链冲突表现为编译时报找不到编译器或者两个软件互相覆盖配置文件。正确的做法是装到不同目录比如 C51 装C:\Keil_C51MDK 装C:\Keil_v5。装完之后各自的快捷方式指向各自的目录互不干扰。另外License 也是独立的。C51 的 License 和 MDK 的 License 不通用需要分别激活。6.2 注册机与 License 激活的现实情况热词里出现了keil注册机2032版keil最新注册机这类词。这里必须说清楚使用非官方渠道的 License 激活方式存在法律和安全风险而且随着 MDK 版本更新老的激活方式可能失效。MDK 5.42 的 License 机制比老版本严格。官方提供的是 30 天试用版以及针对不同规模的商业 License。对于个人学习和小型项目Arm 也提供了一些免费或低成本的授权选项。建议通过正规渠道获取授权避免因为 License 问题导致工程无法编译或者法律纠纷。如果只是学习用途试用版在功能上没有限制只是有 32KB 的代码大小限制。对于大多数学习项目来说这个限制基本够用。6.3 杀毒软件导致的编译异常前面提过杀毒软件的问题这里展开说一下具体表现。有些杀毒软件尤其是国产的几款会把 MDK 的编译过程当成可疑行为因为编译器会频繁读写临时文件、调用系统 API。表现是编译到一半突然报错错误信息莫名其妙比如cannot open file或者access denied。处理方式把 MDK 安装目录、工程目录、以及C:\Users\你的用户名\AppData\Local\Temp都加到杀毒软件的白名单里。如果还是不行临时关闭杀毒软件再编译确认是不是它的问题。6.4 路径中的中文和空格引发的连锁反应这个问题看起来小但引发的错误往往很难定位。比如工程路径里有中文编译时可能报找不到源文件但实际上文件就在那里。或者路径里有空格某些 Makefile 脚本解析出错。我的建议是从安装目录到工程目录全程用纯英文、无空格的路径。比如D:\Work\STM32\Project1这种。不要用D:\工作\STM32项目\第一个工程这种路径即使你觉得看起来没问题。6.5 Pack 版本与代码不兼容的排查有时候 Pack 装好了芯片也能选但编译就是报错提示找不到某个函数或者宏定义。这通常是 Pack 版本和代码不匹配导致的。比如代码是基于 HAL 库 1.8 写的但你装的是 2.0 的 PackAPI 有变化自然编译不过。排查方法看代码里的#include的头文件找到对应的库版本然后在 Pack Installer 里换成对应版本的 Pack。或者反过来把代码适配到新版本的库。两种方式都行但不要混用。7. 关于安装这件事的个人经验装 MDK 这件事说简单也简单说麻烦也麻烦。简单在于流程本身不复杂麻烦在于出问题的时候错误信息往往不直接指向根因。我自己的习惯是每次装新版本之前先把旧版本彻底清理干净然后按Core → 验证 → Pack → 验证的顺序走每一步都确认没问题再进行下一步。这样即使出问题也能快速定位是哪一步的毛病。另外Pack 不要一次装太多。很多人喜欢把 STM32 全系列、GD32 全系列都拉下来结果 Pack Installer 加载慢、工程打开慢、还容易出兼容性问题。按需装用到哪个系列装哪个系列这是最稳妥的做法。最后说一个实际中很有用的技巧把装好的 Pack 目录整个备份一份。下次换电脑或者重装系统的时候直接把备份的 Pack 目录拷到对应位置然后在 Pack Installer 里刷新一下大部分情况下能直接识别省去重新下载的时间。这个技巧在网络不好的环境下尤其管用。
返回列表