ARTICLE DETAIL

资讯详情

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

Keil5安装了Pack包却选不到Device?详解排查全流程

Keil5安装了Pack包却选不到Device?详解排查全流程 keil5安装了pack包但是还是不能选择device这句话我在嵌入式交流群里几乎每周都要看到两三次碰到的多半是刚从51单片机转到STM32或者第一次拿GD32这类国产器件做开发的新手。不少人看着Pack Installer里明晃晃的Installed发愣转身在新建工程的Device窗口里翻来翻去却找不到芯片型号最后甚至开始怀疑是不是安装包本身坏了。我今天就把这个问题从头到尾讲透pack的组织逻辑、安装路径、版本匹配、再到最终烧录用到的Flash算法全流程拆一遍。你可以把这篇当一份从零开始排查Keil5选不到Device的操作手册一步步跟着做基本都能解决。1. 先搞清楚pack、device和芯片之间的关系1.1 为什么Keil5要把芯片支持包拆成独立的packKeil MDK从4代升级到5代之后芯片支持方式有个很大的变化。MDK4时代芯片支持是直接跟着软件安装包走的你装一个MDK4完事以后想要支持新芯片只能等整个软件升级。MDK5改成了pack分发机制也就是说uVision只是一个IDE骨架编译器是ARMCC或AC6而芯片相关的一切都打包在一个个独立的小包里由Pack Installer统一管理。这里可以用个生活类比MDK4像买车自带全车备件MDK5像买车只给框架具体型号的零部件得按需领取。好处是软件主体干净、不同芯片的支持互不干扰坏处就是新手对pack体系不熟悉不知道到底该装哪个包也不知道装完是不是真的生效。所以装了pack却选不了device这个问题的本质往往不是软件坏了而是pack的安装、版本和路径三者之一出了问题。1.2 一个Device Family Pack里到底装了什么很多人以为pack就是一个让Device列表多几行字的小补丁其实它的内容比想象中多得多。一个完整可用的DFPDevice Family Pack设备系列包至少包含这些东西设备描述文件.pdscXML格式记录了芯片系列所有型号的名称、内核、内存映射、烧写算法引用、SVD文件路径等。Device列表里的下拉数据基本就是从这里来的。Flash算法文件.flm烧录器把固件写入芯片内部Flash时需要用到的驱动程序。烧录能不能成功很大程度上取决于这个文件是否正确加载。SVD文件调试时外设寄存器窗口的说明调试功能的重要依赖。CMSIS组件和头文件包括CMSIS-Core、Device头文件、启动文件模板等编译工程时的基础依赖。部分厂商还会在pack里附带自己的外设库、例程模板方便直接点选。所以如果你装的不是完整的DFP而只是某个软件组件包比如中间件之类的那Device窗口当然不会出现芯片型号。这也是很多人搞错的地方以为装了pack实际上装的不是那个芯片系列的DFP。1.3 三个自查动作五分钟定位问题类型遇到选不了device先别急着重装软件先做三个基础检查。第一个检查打开Pack Installer看目标pack的状态。Pack Installer左侧是厂商树右侧有一个状态列显示Installed、Downloaded Only、Update available等。如果你看到的是Downloaded Only说明这个包只是下载到了本地压根没有安装只有显示Installed绿色勾才表示系统认为它已经装好了。很多人把下载过当成了已安装这是最常见的误区。第二个检查新建工程时在Select Device窗口右上角搜索框输入芯片型号关键词看能不能搜到。如果搜不到切换到左下角的Software Packs标签页看这个标签下能不能找到厂商包。能找到说明pack其实在只是你所在的是Device标签页没有自动切换找不到才会进入深一层排查。第三个检查打开Help菜单下的About uVision记录版本号和License信息。MDK版本太老的话新版pack会拒绝安装License如果是评估模式或者已经过期也会出现各种奇怪表现比如编译有2K或32K限制、Pack Installer功能不完整。这些问题先记录下来后面排查时能省不少事。2. 版本对不上80%的选不了都出在这里2.1 C51版和MDK-ARM版被混用两个版本的Keil5长得很像这个问题真的是重灾区。Keil官方同时维护着两套uVision5一套是C51版用于8051内核的单片机一套是MDK-ARM版也就是我们通常说的MDK用于ARM内核的单片机。两个版本的IDE界面几乎一模一样图标也差不多甚至桌面快捷方式的名字都可能都是Keil uVision5。问题来了如果你电脑里同时装了C51版和MDK版然后你打开的是C51版去新建工程想找STM32或GD32那是根本找不到的因为C51版的pack体系里根本没有ARM内核的数据。我遇到过一位同学的案例他确实安装了STM32F4的packPack Installer也显示正常但无论怎么新建工程都进不去Device列表。远程一看他开的是C51版的快捷方式而且他自己都没注意到同一台机器上还装着另一个MDK版的uVision。怎么区分最可靠的办法是打开Help菜单的About看版本标题。C51版本显示的是C51 Version x.xxMDK版本显示的是MDK Version x.xx / uVision x.xx。如果你的目标芯片是STM32、GD32这类ARM内核一定要用MDK版打开工程。2.2 旧版MDK想装新版pack这是第二常见的坑。pack不是随便装都能装的每个pack都对MDK版本有最低要求。很多厂商在发布新版pack时会明确标注比如Requires MDK 5.36 or later。如果你的Keil还是5.23这种老版本双击新版pack文件的时候Pack Installer要么直接提示不支持要么干脆没反应。解决方向也很简单要么升级MDK到足够新的版本要么去官网找旧版本的pack下载。还有一个隐含问题是MDK自身的Pack机制在5.38版本之后做过一次大改动Pack Installer变成了独立服务默认安装目录也改了。老版本MDK可能无法正确读取新版pack写入的状态信息所以表现成装了也白装的情况。如果你看到Pack Installer里的状态和实际行为完全对不上先怀疑版本差异。从2023年以后业界普遍使用的MDK版本已经到5.36以上新出的pack基本都要求这个起步线。所以遇到pack包不支持安装怎么办这类问题第一反应应该是查MDK版本而不是反复重下pack。2.3 厂商不对pack不能代替另一个很典型的场景手里拿的是GD32F407ZGT6网上搜教程刚好是STM32F407ZGT6的于是顺手把STM32F4xx的DFP装了结果在Device窗口里怎么搜都搜不到GD32。虽然GD32F4系列和STM32F4系列在硬件上兼容连引脚定义都差不多但两者的设备ID、外设寄存器细节、Flash算法都不完全一样所以pack绝对不能互相冒充。pack的命名通常有规律厂商名.系列名_DFP比如gigadevice.GD32F4xx_DFP、Keil.STM32F4xx_DFP。你在Device窗口搜不到芯片时先去Pack Installer左侧的厂商树里确认是不是装了对应厂商的包。如果你用STM32的pack去找GD32那肯定找不到。同理APM32、MM32、HC32这些国产芯片也各有各的pack别因为内核都是Cortex-M就觉得通用。这里再提醒一点同品牌的pack也有型号范围之分。比如STM32F1系列你要装STM32F1xx_DFPSTM32F4系列要装STM32F4xx_DFP两者不能混用装了F4的包去找F103也找不到。2.4 License与授权因素导致的现象还有一类情况要单独拎出来说。Pack的安装和Device选择本身并不完全依赖License但是uVision的综合表现、编译烧录能力、Pack Installer的完整性都和License有关。如果你的MDK没有正确激活使用的是评估模式那最容易看到的几个现象是代码量一到限制就编译失败、Pack Installer部分功能不可用、或者各种界面行为异常。网上有些人反馈C51的2K限制怎么解除这其实就是评估模式的限制代码超过2KB就编译不过去。所以如果你排查了半天pack都正常却还在选不到device、烧录失败之间反复横跳认真查一下你的License状态。正确的做法是走正规授权通道不要用来路不明的注册机或补齐工具虽然能临时解决眼前问题但后面维护环境时会遇到更多奇怪的问题。3. 装好了却不生效路径、权限和Pack Installer的坑3.1 pack实际装在哪个目录很多人在这一步就懵了我明明安装成功了pack跑哪去了不同版本的MDKpack默认安装位置并不一样。老版本5.37以前通常会在Keil安装目录下的ARM\PACK子目录比如C:\Keil_v5\ARM\PACK新版5.38以后则改到了用户目录下的AppData\Local\Arm\Packs类似C:\Users\你的用户名\AppData\Local\Arm\Packs。如果pack被装到了Pack Installer不管理的目录里那它当然不会出现在Device窗口中。怎么确认当前目录对不对打开Pack Installer在右上角找到设置按钮里面会有CMSIS Pack的安装位置和下载文件夹。仔细看一下如果发现目录不对把pack卸载重装或者在装的时候手动指定正确路径。另外注意如果你用的是网上整合的绿色版、汉化版、一键安装版pack目录可能被改得乱七八糟。这类版本的pack机制往往不完整建议装回官方原版MDK再按自己的需要装pack反而省时间。3.2 目录结构错误Pack的目录结构是有严格规范的PACK根目录下是厂商名/包名/版本号三级结构比如C:\Keil_v5\ARM\PACK\GigaDevice\GD32F4xx_DFP\1.0.6。如果你手动把.pack文件解压后随便放到了一个文件夹里或者解压后的层级少了一层两层Pack Installer会识别不了甚至报错损坏的包。有人喜欢直接把.pack文件丢进ARM\PACK目录里以为这样就算装了其实不对。Pack Installer识别的是已经解压好的目录结构不是.pack压缩包本体。如果你的.pack文件双击后没反应想手动解压一定要保持厂商/包名/版本号这个层级不能乱放。3.3 Windows权限、杀毒软件和受控文件夹这一条太容易被忽略了。安装pack的过程本质上是要往PACK目录写入一系列文件包括FLM烧写算法、SVD寄存器描述、动态链接组件等。如果你的Windows系统开启了用户账户控制UAC下的受控文件夹访问或者电脑里装了360、腾讯电脑管家、火绒、甚至Windows Defender这类杀毒软件它们很有可能在后台默默拦截这些写入操作。具体表现是什么双击.pack后PackUnzip程序跑了一两秒就关闭看起来像没反应安装进度条一直卡着不动或者Pack Installer提示安装成功但Device窗口里就是找不到芯片。更有甚者过了几天你发现某个FLM文件被杀毒软件隔离了烧录时报No Flash Algorithm found。处理方式不复杂临时退出杀毒软件或者把Keil的安装目录和PACK目录加入杀毒软件信任区再重新安装pack检查Windows安全中心的受控文件夹访问设置把uVision和Pack Installer加入允许列表最后用管理员身份运行uVision和Pack Installer。做完这三步很多装着装着就没了的问题就消失了。3.4 Pack Installer缓存不刷新有一种很经典的假安装现象Pack Installer里显示的是Installed但新建工程时Device窗口就是一片空白。这个大概率是安装pack之后没有完全退出uVision并重新打开。Pack Installer的包列表和Device数据库是启动时加载的安装过程中不会热更新你不重启它就不认账。建议做法关掉所有uVision窗口包括Pack Installer确认进程全部退出再重新打开。等左侧Pack列表加载完成后再新建工程进入Device窗口看看有没有芯片。如果重启之后还是不行就到PACK目录下把残留的download缓存文件.download后缀和临时文件删掉再在Pack Installer里重新执行一次Install。在某些5.38以下的MDK版本里Pack Installer偶尔会有状态不同步的问题重新安装一次通常能解决。3.5 离线安装pack的两种可靠方法很多时候pack包已经从官网下载下来了但双击就是没反应或者提示不支持安装。遇到这种情况有两种可靠的离线安装方法。方法一是用MDK自带的PackUnzip工具。在Keil MDK安装目录下通常能在ARM子目录里找到PackUnzip.exe选中你的.pack文件指定PACK根目录它会按规范自动解压。新版MDK的Pack Installer界面里甚至会直接提供一个Pack Unzip按钮省事不少。这个工具适合处理双击没反应的问题。方法二是把.pack文件改名成.zip用压缩软件解压然后手动放到符合规范的目录结构下。.pack本质上就是一个标准zip压缩包你可以用WinRAR或者7-Zip直接打开。解压后按厂商名/包名/版本号的结构放进PACK目录再重新打开Pack Installer它就能识别。这个方法看着土但在我被Pack Installer坑得没办法的时候用它救过好几次急绝对有效。这里再补充一个细节有些厂商官网下载pack时浏览器可能把.pack文件改名成.bin或者干脆没有扩展名。下载完之后右键查看属性把扩展名改回.pack再处理不然双击的时候Windows不知道拿什么程序打开。4. 从选得到device到烧得进去完整验证当你终于能在Device窗口找到芯片事情还没有全结束。很多人卡在烧录阶段这时候反而可以反向验证前面的pack到底是不是装对了。所以这里把选完芯片之后的验证流程串一遍。4.1 以GD32F407ZGT6为例新建工程验证全程打开MDK注意是MDK-ARM版不是C51版。点击Project菜单下的New uVision Project选择工程保存目录填写工程名。在Select Device窗口左上角的搜索框输入GD32F407如果厂商pack正常下面会列出GD32F407ZGT6等一系列型号。点击OK后弹出的Manage Run-Time Environment窗口可以暂时一个组件都不勾选先直接OK进入工程界面。打开Options for Target在Device选项卡确认芯片型号正确同时看一下右下角的Flash Size等参数。如果显示的是0KB或者明显不对说明pack的数据没有加载完整需要重新安装pack。切到Debug或Utilities选项卡设置好调试器类型和接口比如ST-Link、J-Link或者CMSIS-DAP然后就可以编译下载。很多人在新建工程时还容易困惑一件事Target选项卡里的XTAL晶振频率、IROM1、IRAM1地址等参数变成灰色不可手改。这不是你的软件坏了而是因为选了具体的device型号之后这些参数由pack里的pdsc文件自动带出来了uVision会按芯片型号自动填好内存映射和默认主频。选了具体芯片后有些参数就是锁定的这也是正常现象不是bug。4.2 Flash算法FLM文件缺失怎么办选不到device的问题解决后最常见的烧录报错就是No Flash Algorithm found或者No Algorithm found for address range。这个报错的意思是你选择的编程目标地址范围内找不到对应的Flash烧写算法。排查的时候按顺序做打开Options for Target切到Debug选项卡点右边的Settings按钮再打开Flash Download标签页看Programming Algorithm区域有没有对应的算法。如果算法列表是空的或者不对点击Add按钮从弹出的列表里选择匹配的FLM文件。这个列表的数据来源就是pack目录下的Flash文件夹。如果列表里也没有去PACK目录里找到对应厂商的pack搜索.flm文件看文件是否存在。不存在就重装pack存在就手动添加路径。还要注意一个细节芯片料号选错了也会导致找不到算法。比如你实际用的是512KB Flash的芯片但在Device窗口里选了256KB的型号Flash地址范围不匹配烧录器按地址找不到对应的算法文件就会报这个错。很多人把这个问题归结为pack坏了其实只是选错了料号。4.3 烧录阶段的常见报错与排查如果你用的是ST-Link调试器烧录时报not a genuine ST device这种提示在国产兼容MCU和二手芯片上特别常见。出现这个提示的原因大概有几类目标芯片被设置了读保护RDP等级不是0ST-Link读取不到正常的芯片ID芯片本身不是ST原厂出品ST-Link固件不认识它的ID或者连线虚接导致通信数据错误。解决思路先用STM32CubeProgrammer连接目标板尝试清除读保护检查SWDIO、SWCLK、GND、3.3V这几根线是否接触良好换用原厂ST-Link或改用J-Link、CMSIS-DAP调试器。如果你改用J-Link有时候还需要额外安装SEGGER官方的J-Link pack否则J-Link可能无法识别部分较新的芯片。整体来说烧录报错往往不是pack的问题但pack选错确实会连累到调试器无法正确识别芯片所以排查时还是先把pack状态确认好再去调调试器。5. 高频问题速查与我的几个独家习惯5.1 常见问题速查表现象常见原因推荐处理Pack Installer显示Downloaded Only只下载了包没有安装选中该包点击Install双击.pack没有反应文件关联被改、杀软拦截、PackUnzip异常用PackUnzip解压或改名为.zip手动解压安装pack时报不支持MDK版本低于pack要求升级MDK或下载旧版pack新建工程搜索不到芯片没装DFP、装错厂商pack、打开的是C51版检查Pack Installer状态确认使用MDK版下载对应厂商DFPDevice窗口没有厂商名但Software Packs有包装的是软件组件不是DFP下载对应芯片系列的Device Family Pack烧录提示No Flash AlgorithmFLM缺失、芯片料号选错手动Add .flm重新确认芯片型号烧录提示not a genuine ST device芯片读保护、ID不匹配、调试器固件问题清除读保护检查连线换调试器Pack Installer打不开或闪退VC运行库缺失、汉化版/绿色版异常安装VC运行库重装原版MDK编译提示2K限制License未激活或评估模式走正规渠道激活授权5.2 独家习惯一不要把pack当成越新越好很多工程师的习惯是看到官网有新版本就立刻升级但在pack这件事上新版不一定比旧版好用。有些厂商出过某一个特定版本的pack里面改了Flash算法或者SVD描述反而影响烧录和调试兼容性。我自己就遇到过老工程在新版pack下烧录不稳定换回旧版pack一切正常的情况。MDK支持同一个厂商包同时安装多个版本工程文件会锁定自己依赖的pack版本所以你可以放心保留实践证明没问题的旧版本。新项目再去试新版pack万一踩雷还能回退不至于影响正在维护的旧项目。5.3 独家习惯二国产芯片的pack一定要本地备份很多国产芯片厂商的pack下载链接并不会长期挂在官网上。有些冷门系列你下过一次之后过几个月链接可能就404了或者厂商更新了pack版本旧版本直接下架。如果你没有本地备份几年后要维护老项目时想找当初那个版本的pack可能比登天还难。我自己现在的做法是每下载一个pack就把.pack文件同步保存到专门的工具链网盘目录里旁边放一个txt说明记录芯片型号、pack版本、适用MDK版本、下载时间。这样即使重装系统或者换电脑我都能在一个小时内把整套开发环境复原。这个习惯看着简单长期下来真的能救命。5.4 一套固定排查顺序把所有内容浓缩成我自己的排查顺序你可以直接照着操作打开Help里的About确认自己用的是MDK-ARM版而不是C51版顺手记下版本号。打开Pack Installer确认目标pack状态是Installed而不是Downloaded Only。确认pack版本满足当前MDK版本的要求不满足就升级或换旧版。确认pack目录在Pack Installer设置的PACK路径下目录结构是厂商/包名/版本号规范层级。处理杀毒软件和环境干扰把Keil目录加入信任区临时退出安全类软件。完全退出uVision并重新打开再新建工程。在Device窗口搜索芯片型号。还没解决就重装pack先删掉对应厂商目录里的旧版本再Install。最后检查FLM算法文件必要时手动Add并确认调试器配置。按照这个顺序我处理过的案例里大概九成都能在第五步之前定位到问题。剩下没解决的大多数都出在误用了C51版或者装了错误的厂商pack属于方向性错误。最后再分享一个容易被忽视的细节装完pack后第一次打开Pack Installer它会联网更新软件包索引有时候转圈会转很久看起来像卡住了。如果网络不稳定索引加载不出来Pack Installer里的Available列表会一直空白甚至installed状态也不刷新。这时候你以为是没装成功其实只是索引没跑完。给Pack Installer多一点耐心或者换一个网络稳定的时段操作很多莫名其妙的选不了device会随着索引刷新自动消失。我自己养成的习惯是每次装完环境先让它把在线索引跑完、彻底重启一次再继续干活。希望这篇总结能帮你在Keil5的pack和device之间少绕几趟弯路。
返回列表