ARTICLE DETAIL

资讯详情

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

Keil MDK升级实战:DFP包安装与ARMCC5/6编译器共存配置

Keil MDK升级实战:DFP包安装与ARMCC5/6编译器共存配置 嵌入式开发这行有个绕不开的工具就是Keil MDK。不管你用的是STM32、GD32还是其他ARM Cortex-M内核的芯片大概率都跟它打过交道。我用Keil差不多有七八年了从早期的MDK 4.x一路跟到现在的5.4x版本中间踩过的坑可以说能写一本小册子。今天这篇内容我想把最近一次完整的升级经历梳理出来——从卸载旧版本、清理注册表残留到安装新版、解决STM32F4xx_DFP包死活装不上的问题再到ARMCC5和ARMCC6编译器库的共存配置整个流程走一遍。如果你正好遇到DFP包安装失败、编译器版本切换报错、或者升级后旧工程打不开的情况这篇内容应该能帮你省下不少折腾的时间。我会尽量把每一步的操作意图和背后的逻辑讲清楚不只是告诉你“点这里”而是让你明白“为什么要这样点”。适合有一定Keil使用基础、正在做STM32F4系列开发、或者准备升级MDK版本的嵌入式工程师参考。1. 升级前的整体思路与方案选型1.1 为什么要升级以及升级前需要想清楚的事很多人升级Keil MDK是被动的——比如新买的芯片型号旧版本不支持或者同事发来的工程用了新版本的编译器打不开。我这次升级的起因也差不多手头一个STM32F407的项目需要用到较新的HAL库而旧版MDK 5.28里自带的STM32F4xx_DFP版本太老HAL库的某些API对不上。与其在一个个报错里打补丁不如干脆把整个工具链升到新版本。但升级这件事不是简单地“卸载再安装”就完事了。你得先想清楚几个问题旧版本的工程需不需要保持兼容团队里其他人用的什么版本License怎么处理这些问题不想清楚升完级可能连原来的项目都编译不过了。我的建议是升级前先做三件事备份旧版本的安装目录。虽然卸载程序会帮你删掉大部分文件但有些自定义的配置、器件支持包、或者你自己改过的启动文件卸载后可能就找不回来了。直接把整个Keil安装目录复制一份到别的盘花不了多少时间但关键时刻能救命。记录当前使用的编译器版本。打开旧版MDK在Project → Options for Target → Target标签页里看一下当前用的ARM Compiler版本。如果是ARMCC5也就是ARM Compiler 5升级到MDK 5.36之后默认可能变成ARMCC6这俩的语法兼容性有差异后面我会详细说。确认License的迁移方式。Keil MDK的License是跟电脑绑定的升级后需要重新激活。如果你用的是单机License提前把License文件或者激活码找出来如果是浮动License确认服务器地址没变。1.2 版本选择的考量为什么我选了MDK 5.36Keil MDK的版本更新挺频繁的5.36、5.37、5.38、5.39一路出下来每个版本都有一些变化。我最终选了5.36原因有几个。第一5.36对ARMCC5的支持还比较完整。从MDK 5.37开始ARMCC5的默认安装选项被弱化了虽然还能手动装但步骤更繁琐。我手头有几个老项目必须用ARMCC5编译所以5.36是个比较稳妥的平衡点。第二5.36自带的CMSIS版本和STM32F4xx_DFP的兼容性经过大量验证社区里遇到的问题相对少。新版本虽然功能多但有时候会引入一些莫名其妙的兼容性问题对于生产环境来说不太划算。第三5.36的安装包体积适中安装过程也比较稳定。我试过5.38安装过程中卡在DFP下载环节好几次后来换回5.36就顺利多了。当然如果你没有ARMCC5的硬性需求直接上最新版也没问题。关键是要根据自己的项目需求来选而不是盲目追新。1.3 卸载旧版本的正确姿势卸载Keil MDK这件事很多人以为在控制面板里点一下“卸载”就完事了。但实际上Keil的卸载程序并不会清理所有东西尤其是注册表里的残留和用户目录下的配置文件。这些残留可能导致新版本安装后出现各种奇怪的问题比如Pack Installer打不开、器件列表显示不全等。我的做法是分三步走第一步用官方卸载程序卸载主程序。在控制面板 → 程序和功能里找到“Keil MDK-ARM”或者“Keil uVision5”右键卸载。这个过程可能需要几分钟耐心等它跑完。第二步手动清理残留目录。卸载完成后检查以下几个位置是否还有Keil相关的文件夹C:\Keil_v5默认安装目录如果你改过路径就找对应位置C:\Users\你的用户名\AppData\Local\Arm\KeilC:\Users\你的用户名\AppData\Roaming\KeilC:\ProgramData\Keil这些目录里可能残留着Pack缓存、License信息、界面配置等。我一般会把它们全部删掉确保新版本安装时是干净的环境。第三步清理注册表。这一步要小心别乱删。按WinR输入regedit打开注册表编辑器定位到HKEY_CURRENT_USER\Software\Keil和HKEY_LOCAL_MACHINE\SOFTWARE\Keil把这两个项删掉。如果HKEY_LOCAL_MACHINE\SOFTWARE\WOW6432Node\Keil也存在一并删除。注意操作注册表前建议先导出备份万一删错了还能恢复。如果你对注册表不熟悉这一步可以跳过但后续如果遇到安装问题再回来清理也不迟。2. 新版MDK安装与DFP包问题深度解析2.1 MDK 5.36的安装过程与关键选项安装包下载好之后双击运行。安装过程本身不复杂但有几个地方需要注意。安装向导第一步会让你选择安装目录。我习惯用默认的C:\Keil_v5因为很多教程和脚本都默认这个路径换成别的路径有时候会导致一些工具找不到文件。如果你的C盘空间紧张也可以装到其他盘但路径里尽量不要有中文和空格。接下来会让你填写用户信息随便填就行不影响使用。然后就是选择安装组件。这里有个关键点如果你需要ARMCC5编译器一定要在组件列表里勾选“ARM Compiler 5”。从MDK 5.37开始这个选项默认是不勾的5.36虽然默认勾选但也要确认一下。安装过程中会弹出Pack Installer的界面问你要不要在线下载器件支持包。我的建议是先跳过等主程序装完、License激活之后再单独处理DFP包。因为安装程序里的Pack下载经常因为网络问题卡住反而拖慢整个安装进度。安装完成后先别急着打开工程。第一步应该是激活License。打开Keil uVision5在File → License Management里填入你的License信息。如果是评估版会有32KB的代码限制对于STM32F4的项目来说基本不够用所以正式开发还是需要正规License。2.2 STM32F4xx_DFP包安装失败的常见原因DFPDevice Family Pack是Keil MDK从5.0版本开始引入的器件支持包机制。简单来说它把芯片的启动文件、外设寄存器定义、Flash烧录算法、以及一些中间件打包在一起通过Pack Installer来管理。STM32F4xx_DFP就是专门针对STM32F4系列的器件包。这个包安装失败是我见过最多的问题之一。根据我的经验原因主要有以下几类网络问题导致的下载失败。Pack Installer默认从Keil的服务器下载DFP包国内网络访问有时候不太稳定。表现就是进度条卡住不动或者下载到一半报错。这种情况可以尝试手动下载DFP包的离线安装文件.pack格式然后通过Pack Installer的“File → Import”功能导入。旧版本残留导致的冲突。如果之前装过STM32F4xx_DFP的旧版本卸载不干净的话新版本安装时可能会报“Pack already exists”或者版本冲突的错误。这时候需要手动去C:\Keil_v5\ARM\PACK\Keil\STM32F4xx_DFP目录下把旧版本文件夹删掉再重新安装。Pack Installer缓存损坏。Pack Installer自己有一个缓存数据库位于C:\Users\你的用户名\AppData\Local\Arm\Packs。如果这个缓存损坏了会导致Pack列表显示异常或者安装失败。解决办法是关掉Keil把这个目录下的.Web文件夹删掉重新打开Pack Installer让它重建缓存。权限问题。如果Keil安装在C盘而你没有管理员权限Pack Installer可能无法写入文件。解决办法是以管理员身份运行Keil或者在安装时就把Keil装到非系统盘。DFP版本与MDK版本不匹配。每个DFP包都有对应的MDK最低版本要求。比如STM32F4xx_DFP 2.17.0要求MDK 5.36及以上。如果你在MDK 5.28上装这个版本的DFP就会失败。解决办法是查一下DFP的Release Notes确认版本兼容性。2.3 手动安装DFP包的完整操作步骤当在线安装反复失败时手动安装是最可靠的方案。我把整个流程拆解一下第一步下载DFP离线包。在Keil的官方网站上找到STM32F4xx_DFP的页面下载对应版本的.pack文件。文件名一般类似Keil.STM32F4xx_DFP.2.17.0.pack。注意下载的时候看清楚版本号别下错了。第二步关闭Keil uVision。确保所有Keil相关的进程都退出了包括Pack Installer。可以在任务管理器里检查一下有没有残留的进程。第三步清理旧版本。打开C:\Keil_v5\ARM\PACK\Keil\目录如果里面有STM32F4xx_DFP文件夹先把它重命名或者移走。这样做的目的是避免新旧版本冲突。第四步导入.pack文件。重新打开Keil点击菜单栏的Pack Installer图标那个小盒子图标在Pack Installer窗口里选择File → Import然后选中你下载的.pack文件。等待导入完成一般几秒钟到几十秒不等。第五步验证安装结果。导入完成后在Pack Installer的“Packs”标签页里应该能看到STM32F4xx_DFP已经显示为已安装状态。同时在Keil的Project → Manage → Pack Installer里新建工程时应该能在器件列表里找到STM32F4系列的具体型号。实操心得手动导入.pack文件时如果提示“Pack is already installed”说明旧版本没清理干净。这时候不要强行覆盖先去C:\Keil_v5\ARM\PACK\Keil\STM32F4xx_DFP目录下把对应版本的文件夹删掉再重新导入。2.4 DFP、UFP与CMSIS的关系梳理在折腾DFP包的过程中你可能会看到UFP、CMSIS这些名词容易搞混。我简单梳理一下它们的关系。CMSIS是ARM定义的一套软件接口标准全称是Cortex Microcontroller Software Interface Standard。它规定了芯片厂商怎么提供外设驱动、内核怎么访问、DSP库怎么用等等。你可以把它理解成一套“通用语言”让不同厂商的芯片在软件层面有一致的接口。DFP是Device Family Pack器件家族包。它是芯片厂商按照CMSIS标准制作的软件包里面包含了特定系列芯片的启动代码、寄存器定义、系统初始化代码等。STM32F4xx_DFP就是ST公司为STM32F4系列做的DFP包。UFP是Update Family Pack更新包。它通常用于给已安装的DFP打补丁或者更新部分组件。UFP的体量比DFP小安装方式类似。三者之间的关系可以这样理解CMSIS是标准DFP是符合这个标准的完整软件包UFP是对DFP的增量更新。安装的时候先装DFP再根据需要装UFP。3. ARMCC5与ARMCC6编译器库的共存配置3.1 ARMCC5和ARMCC6的核心差异ARM Compiler 5简称ARMCC5和ARM Compiler 6简称ARMCC6是Keil MDK中两个不同代的编译器。ARMCC5基于传统的ARM编译器架构而ARMCC6基于Clang/LLVM架构。这个底层差异带来了很多使用上的不同。最直观的差异是编译速度。ARMCC6的编译速度明显快于ARMCC5尤其是在大型项目上差距可能达到30%以上。但速度快不代表一切ARMCC5在一些老代码的兼容性上更好。语法层面ARMCC6对C标准的支持更严格。比如一些ARMCC5能通过的隐式类型转换、未定义行为在ARMCC6下会直接报错或者警告。我遇到过好几次同一个工程在ARMCC5下编译通过换到ARMCC6就报了一堆错大部分是类型不匹配和函数声明缺失的问题。另一个重要差异是链接脚本的格式。ARMCC5用的是分散加载文件.sctARMCC6虽然也支持.sct但更推荐用GCC风格的链接脚本。如果你在工程里用了自定义的.sct文件切换到ARMCC6时可能需要调整。还有一点是内联汇编的写法。ARMCC5用的是传统的ARM汇编语法ARMCC6用的是GCC风格的内联汇编。如果工程里有大量的内联汇编代码切换编译器的工作量会比较大。3.2 在MDK 5.36中同时配置两个编译器的步骤MDK 5.36的一个好处是它允许你同时安装ARMCC5和ARMCC6并且在工程级别选择用哪个。具体操作如下第一步确认两个编译器都已安装。打开Keil在Project → Manage → Project Items里切换到“Folders/Extensions”标签页看看“ARM Compiler”下拉框里有没有ARMCC5和ARMCC6两个选项。如果没有ARMCC5说明安装时没勾选需要重新运行安装程序补装。第二步在工程中切换编译器。打开你的工程点击Project → Options for Target在Target标签页的“ARM Compiler”下拉框里选择需要的版本。这里选ARMCC5还是ARMCC6取决于你的工程需求。第三步配置ARMCC5的路径。如果下拉框里没有ARMCC5需要手动指定路径。在“Folders/Extensions”标签页里点击ARMCC5旁边的“...”按钮定位到C:\Keil_v5\ARM\ARMCC\bin目录。这个目录下应该有armcc.exe和armlink.exe等文件。第四步验证编译器是否可用。切换编译器后重新编译工程。如果报错说找不到编译器检查路径是否正确以及环境变量里有没有冲突的设置。注意同一个工程不要频繁切换编译器。ARMCC5和ARMCC6生成的目标文件格式不完全兼容混用可能导致链接错误。如果确实需要切换建议先Clean一下工程删掉所有中间文件再重新编译。3.3 编译器切换后的常见报错与修复方法从ARMCC5切到ARMCC6最常见的报错有几类我逐一说说修复方法。第一类error: unknown type name uint32_t之类的类型未定义错误。这是因为ARMCC6对头文件的包含顺序更敏感。解决办法是在报错的源文件里显式包含stdint.h或者检查工程的Include Paths是否完整。第二类warning: implicit declaration of function xxx。ARMCC5允许隐式函数声明ARMCC6默认不允许。解决办法是找到对应的函数声明确保在使用前已经包含。如果函数来自第三方库检查库的头文件是否被正确包含。第三类error: use of undeclared identifier xxx。这种错误通常是因为ARMCC6对宏定义的处理更严格。检查一下相关的宏是否在正确的时机定义以及条件编译的逻辑是否正确。第四类链接错误提示找不到符号。这可能是库文件的格式不兼容。ARMCC5用的是.lib格式的库ARMCC6用的是.a格式。如果你用了第三方库需要确认有没有对应ARMCC6版本的库文件。第五类内联汇编报错。前面提到过ARMCC5和ARMCC6的内联汇编语法不同。如果工程里有内联汇编需要按照ARMCC6的语法改写。具体改法可以参考ARM的官方文档或者用__asm关键字配合GCC风格的语法。3.4 ARMCC5LIB与ARMCC6LIB的路径管理在Keil的安装目录下你会看到ARMCC和ARMCLANG两个文件夹分别对应ARMCC5和ARMCC6。每个文件夹下面都有lib目录存放着编译器自带的库文件。ARMCC5的库文件在C:\Keil_v5\ARM\ARMCC\lib下包括arm_cortexM4lf_math.lib等DSP库。ARMCC6的库文件在C:\Keil_v5\ARM\ARMCLANG\lib下格式是.a文件。管理这些库路径的时候有几个要点在工程的Linker设置里库搜索路径要指向正确的编译器库目录。如果你切换了编译器但库路径没改链接时会找不到对应的库文件。不要手动复制库文件到工程目录。这样容易造成版本混乱而且升级MDK后可能忘记更新。正确的做法是在工程设置里引用编译器自带的库路径。如果同时使用ARMCC5和ARMCC6建议在工程里用条件编译来区分库的引用。比如用#ifdef __ARMCC_VERSION来判断当前编译器版本然后包含对应的头文件。4. 升级后的工程迁移与常见问题排查4.1 旧工程在新版MDK中的打开与迁移升级MDK之后打开旧工程可能会遇到一些提示。最常见的是“Project file was created with an older version of MDK”之类的警告。这个一般点“OK”让它自动迁移就行Keil会帮你更新工程文件的格式。但自动迁移不是万能的。有几种情况需要手动处理器件包版本不匹配。旧工程可能引用了旧版本的STM32F4xx_DFP。升级后如果新版本的DFP改了某些寄存器的定义或者启动文件的格式工程可能编译报错。解决办法是在Project → Manage → Pack Installer里把工程的DFP版本切换到已安装的新版本。编译器版本变化。前面说过如果旧工程用的是ARMCC5而新版MDK默认用ARMCC6打开工程时可能会提示切换编译器。这时候不要盲目点“Yes”先确认工程能不能在ARMCC6下编译通过。如果不行手动在Options for Target里把编译器改回ARMCC5。调试配置丢失。升级后工程的调试器配置比如ST-Link、J-Link的设置可能会重置。需要重新在Options for Target → Debug标签页里配置调试器类型和接口。Flash烧录算法变化。新版本的DFP可能更新了Flash烧录算法。如果烧录时提示“Flash algorithm not found”需要在Options for Target → Utilities → Settings里重新选择对应的Flash算法。4.2 常见问题速查表我把升级过程中可能遇到的问题整理成了一张表方便快速定位问题现象可能原因解决方法Pack Installer打不开或白屏缓存损坏删除AppData\Local\Arm\Packs\.Web目录重启KeilDFP包下载卡住网络问题手动下载.pack文件通过File → Import导入提示“Pack already exists”旧版本残留删除Keil_v5\ARM\PACK\Keil\STM32F4xx_DFP下的旧版本文件夹编译报错“unknown type name”ARMCC6类型检查更严显式包含stdint.h等头文件链接报错“undefined symbol”库文件格式不兼容确认库文件是ARMCC6的.a格式或切回ARMCC5烧录提示“Flash algorithm not found”DFP更新了烧录算法在Utilities设置里重新选择Flash算法License失效硬件信息变化重新激活License工程打开后器件列表为空DFP未正确安装检查Pack Installer里DFP是否显示已安装4.3 实操避坑经验分享最后分享几个我在多次升级中总结的经验都是文档里不会写的。第一升级前把工程里的绝对路径改成相对路径。有些工程在Options for Target → C/C → Include Paths里用了绝对路径升级后如果Keil安装目录变了这些路径就失效了。建议统一改成相对路径用..\和.\来表示。第二保留一份旧版本的安装包。有时候新版本确实有兼容性问题需要临时切回旧版本。手头留一份旧版安装包能省去重新下载的时间。第三DFP包不要盲目追新。新版本的DFP可能修复了一些bug但也可能引入新的问题。如果当前版本用着没问题没必要每次更新都跟着升。我一般是在遇到必须用新DFP才能解决的问题时才升级。第四升级后先跑一遍完整的编译和烧录测试。不要只看编译通过就完事了一定要实际烧录到板子上跑一下确认功能正常。我遇到过编译没问题但运行时跑飞的情况原因是新版本的启动文件改了堆栈的初始化方式。第五团队协作时统一版本。如果团队里多个人协作开发尽量统一MDK版本和DFP版本。版本不一致可能导致工程文件互相打不开或者编译结果不一致。可以在项目的README里注明所需的工具链版本。第六遇到问题先看Release Notes。Keil每个版本的MDK和每个DFP包都有Release Notes里面会列出已知问题和变更点。很多问题其实官方已经说明了看一眼能省不少排查时间。第七善用社区资源。Keil的官方论坛、ST的社区、以及各种嵌入式开发群里大概率有人遇到过类似的问题。搜索的时候用英文关键词比如“STM32F4xx_DFP install failed”能找到更多结果。我在最近这次升级中前后大概花了两个小时其中大部分时间是在处理DFP包的安装问题。如果提前知道手动导入.pack文件这个方法可能半小时就搞定了。希望这篇内容能帮你少走一些弯路。后续如果遇到新的问题我也会继续补充进来。
返回列表