Win11下MDK安装与ARMCC V5补装:老工程AC5编译器配置指南
很多朋友在Win11上装KEIL5 MDK装完后发现新建工程时编译器列表里只有AC6找不到AC5或者干脆连MDK核心都装不上。这个问题的根源在于MDK从5.37版本开始不再默认携带ARMCC V5编译器而国内大量STM32老工程、标准外设库工程还都依赖AC5编译。这篇文章就把Win11下MDK安装、ARMCC V5补装、工程配置、烧录调试这一整套流程讲透所有步骤我都实测过适用于从5.36到5.39的常用MDK版本。不管你是刚入门的学生还是从旧电脑迁移环境的老工程师按这个流程走基本不会踩坑。1. 准备工作先把 AC5、AC6 和 MDK 版本的对应关系搞清楚1.1 为什么新 MDK 默认不带 ARMCC V5很多人一上来就装最新版MDK装完才发现工具栏里的编译器版本根本选不了V5然后开始怀疑是不是自己操作有问题。其实不是操作问题是版本逻辑变了。ARMCC V5是ARM上一代闭源编译器也就是大家常说的AC5。从MDK 5.37开始Keil把默认编译器切换成了基于LLVM/Clang的ARM Compiler 6也就是AC6不再随着安装包分发AC5。AC6在编译速度、代码优化、C11支持上都比AC5强但问题在于它和AC5的语法并不完全兼容。比如老工程里常用的__attribute__((at(0x08000000)))这类写法、老版CMSIS里的内联汇编、一些第三方库的编译选项在AC6下面经常会报错或者行为改变。所以现实情况是新工程可以直接用AC6但如果你手头有STM32标准外设库工程、老版本SDK、或者其他芯片厂商的老例程那就大概率还得回到AC5。这也是为什么ARMCC V5在2021年之后已经几乎不更新了但大家还在到处找它。好在Keil留了一个官方补装通道ARM_Compiler 5.06u7这个Pack。它本质上就是把AC5工具链打包成一个离线安装包装完之后MDK里就能重新选到V5。这个Pack在MDK 5.36、5.37、5.38、5.39上我都验证过都能正常用只不过需要手动装。1.2 不同 MDK 版本与 Win11 的兼容策略Windows 11不是不能装老版本MDK关键是别用太老的版本。MDK 5.36及以上的安装包在Win11下基本没有系统级别的兼容问题5.35以及更早的版本偶尔会出现驱动签名、许可证报错、界面显示异常等问题所以我不建议在新系统上折腾5.35以下的老版本。MDK版本默认自带编译器能否补装AC5Win11下的稳定性5.36及更早AC5 AC6一般不需要补装稳定但安装包较老5.37仅AC6可通过ARM_Compiler Pack补装稳定推荐5.38仅AC6可通过ARM_Compiler Pack补装很稳定推荐5.39仅AC6可通过ARM_Compiler Pack补装稳定但AC6版本较新如果你要兼顾老工程我的建议是直接用5.36或者5.38。5.36的好处是开箱即用AC5就在安装包里面5.38的好处是编译器更新一些AC6对新芯片支持更好补装AC5也只要两步。至于5.39AC6已经切到6.21以上个别老库会多一些警告没必要为了追新给自己找麻烦。2. 下载安装包与系统准备2.1 从哪里获取原版 MDK 和芯片支持包Keil的官方下载页面需要注册账号才能下载MDK安装包注册是免费的。下载的时候记得区分两个东西一个是MDK-ARM本身也就是MDK537.EXE之类的安装包另一个是设备支持包Device Family Pack简写DFP比如STM32F1系列的Keil.STM32F1xx_DFP。有些网盘里流传的“MDK一键安装版”“绿色汉化版”我强烈不建议碰。这些版本往往改了安装目录结构有的还捆绑了不明工具链轻则Pack装不进去重则生成的hex文件在烧录时莫名其妙出问题。配合ARMCC V5这种老工具链环境上有任何一点杂质都很难排查所以老老实实用官方安装包。芯片支持包可以不用单独去下MDK装完以后打开Pack Installer联网搜索对应型号就会自动下载。不过国内网络环境有时候连Pack Installer很慢这时候可以到Keil官网的“Keil Pack”页面手动下载.pack文件下载完直接双击它会自动装进MDK。.2.2 Win11 系统侧的准备权限、路径、杀软Win11有一个很容易忽略的坑UAC权限和系统杀毒。Keil的安装程序会往C:\Program Files这类受保护目录里写文件还会装USB驱动所以安装时一定右键“以管理员身份运行”。不要双击不要从压缩软件里直接拖出来运行先解压到干净目录再右键管理员运行。安装路径方面我统一建议装到C:\Keil_v5不要用默认的C:\Program Files\Keil_v5也不要放到中文目录或者带空格的目录。原因很简单老版本ARMCC对路径里的空格和中文支持不好编译时可能出现“cannot open source file”之类的诡异报错。统一放C:\Keil_v5之后不管换多少台电脑路径不会变打包备份和写批处理脚本都很方便。杀软方面如果你用的是正版安装包Windows Defender一般不会拦。但有时候在安装Pack或者破解注册机时Defender会报毒——破解注册机我就不多说了一是版权上有风险二是注册机本身经常被二次打包木马不建议大家为了省一点授权费去赌自己电脑的安全。如果只是学习MDK评估版就够用如果是公司项目直接买正版授权这个钱不能省。3. 安装 MDK 主程序并完成基础配置3.1 安装操作步骤整个安装过程不算复杂但有几个地方值得注意。下面是我实测过的流程把下载好的MDK538.EXE放到一个临时目录右键“以管理员身份运行”。语言选择界面直接点OK安装程序是英文界面不影响使用。出现License Agreement时勾选“I agree to all terms”一路Next。路径修改为C:\Keil_v5点Next。这里不建议勾选“Create a desktop shortcut”因为后面我们会自己指定快捷方式多一个桌面图标反而乱。填写用户名和公司名随便填个英文名就行这个会写进编译器的注释里。等待安装。中途如果弹出“Windows安全中心”提示安装驱动程序全部点“安装”。这里有一个老手容易忽略的细节安装完以后先别急着启动Keil先把电脑重启一次。因为驱动层的东西在Win11下经常要重启才生效尤其是你之前装过其他版本的烧录器驱动不重启可能会出现调试器冲突。重启以后再从开始菜单运行Keil uVision5。第一次启动时Keil会自动弹出Pack Installer。如果你的网速一般这个窗口会卡很久不要关掉它。可以切到“Packs”标签页等中间那个在线包列表刷新出来先别急着装一大堆后面按需安装。3.2 许可证激活正版授权和评估模式MDK安装完成后默认处于评估模式。评估模式不是不能用而是有代码量限制ARM编译器评估版大概限制在32KB以内对初学者跑点小实验足够了。但如果做实际项目很快就会发现链接时报错说exceeded,这时候就需要激活正版许可证。激活流程不算复杂打开Keil以后点菜单栏的File - License Management窗口里会显示当前电脑的CID码。把CID码复制去Keil官网购买License官网会给你一个LIC形式的注册码回到License Management窗口粘贴进去点Add License就行。购买的时候注意区分是MDK-ARM的License还是C51的License这两个是分开的买错了无法生效。至于网上那些“输入任意用户名即可破解”的说法我建议别折腾。一是这类工具基本都会被杀毒软件拦二是用了之后万一编译出来的产品出了问题解释不清。学校实验室、公司里一般都有批量授权先问一圈实在没有评估版也足够支撑前期学习。4. 补装 ARMCC V5 编译器官方 Pack 方式4.1 通过 Pack Installer 安装 ARM_Compiler.5.06u7MDK 5.37以上版本想用AC5官方给的解决方案是安装ARM::ARM_Compiler这个Pack。具体版本选择5.06u7这是AC5的最后一个正式更新版本也是网上大家验证过最稳的。操作步骤如下打开Pack Installer切换到“Packs”标签页。在左上角搜索框输入ARM_Compiler搜索结果里会出现ARM::ARM_Compiler。点击右侧的Install按钮选择版本5.06u7默认一般就是这个。等待下载安装这个过程可能需要几分钟。如果卡住可以右键取消然后采用离线安装方式。离线安装是很多人在中国的网络环境下会用到的方法。先到Keil官网的Pack下载页搜索ARM_Compiler.5.06u7.pack下载完成后直接双击.pack文件Keil会自动识别并安装。装完以后可以用C:\Keil_v5\ARM\ARMCC\bin目录来验证如果这个文件夹出现并且里面能看到armcc.exe说明AC5已经成功落盘。这里要特别注意不要把ARM_Compiler 5.06u7和“ARM Compiler”工具链安装包搞混。ARM_Compiler这个Pack装的是工具链本体不是某个芯片的例程包。也有人问我是不是要装Keil.ARM_Compiler.5.06u7.pack是的就是它。4.2 验证 AC5 是否安装成功装完以后怎么确认AC5真的能用三个方法从快到慢第一个看编译器下拉框。随便新建或打开一个工程右键点击左侧工程名选择Options for Target在Target标签页右侧可以看到“ARM Compiler”下拉框。如果AC5安装成功下拉框里会出现V5.06 update 7 (build 960)这个选项或者Use default compiler version 5这行字。第二个直接用命令行跑一下。打开CMD进入C:\Keil_v5\ARM\ARMCC\bin目录输入armcc --version能看到类似ARM Compiler: 5060960的输出就说明工具链没问题。如果提示不是内部或外部命令那就是环境变量没配但Keil不依赖环境变量这个命令没配也能用只是不能在任意目录下直接敲。第三个实际编译一次。找一份老工程把编译器选到V5编译一次看是否报错。这个方法最靠谱因为曾经有人的Pack装上了、版本号也能显示但一编译就报“cannot find armcc.exe”最后发现是路径里有中文导致工具链找不到。5. 配置工程使用 ARMCC V5 并处理老工程迁移5.1 把编译工具链切换到 AC5安装完AC5以后剩下的就是把它选定成当前工程的编译器。在Options for Target - Target标签页右侧的“ARM Compiler”下拉框里选择V5.06 update 7 (build 960)。这里有个小技巧如果你同时装了AC5和AC6想让某个工程默认用AC5建议直接选具体的V5.06 update 7不要选Use default compiler version 5。“Use default”这个选项在MDK 5.37以后会去读全局设置如果你全局默认设成了V6它可能不会按预想工作。我遇到过一台机器上默认选项关联到了一个已经卸载的编译器路径编译直接卡在“select a compiler”这一句。切换完成以后C/C选项卡的界面会有一点变化。AC5版本里会多出--c99、--gnu之类的选项而AC6那边则是-stdc99。如果你在移植老工程这些都不需要手动改用默认就行等编译报错再对症处理。5.2 老工程在新 MDK 中编译报错的处理思路老工程在MDK 5.38AC5环境下最常见的问题不是编译器本身而是C库和CMSIS版本不匹配。如果你打开老工程以后发现编译报错先瞄一眼错误列表。我帮人排查过很多次70%的情况都是这几种core_cm3.h not found这说明CMSIS没有正确关联。解决办法是在Pack Installer里安装对应芯片系列的DFP包而不是去网上下载一个core_cm3.h到处拷贝。你拷过来的文件版本很老跟AC5或者新的启动文件混用反而会产生奇怪冲突。undefined symbol __use_no_semihosting这个是老标准外设库工程里很经典的问题。代码里用了printf重定向但在链接时没有正确告编译器不要使用半主机模式。常见修法是在工程选项里勾选“Use MicroLIB”或者在汇编/启动文件里加上对应的声明。很多人不知道这个警告在AC6下可能不会出现但在AC5下一定会。No space in execution regions这个不是编译器问题而是flash/RAM分配不对。检查Target里的IRAM和IROM起始地址和大小是否和你的芯片一致芯片型号选没选对。这个问题在从F103C8迁移到F103ZE的时候特别容易出现。pack not installed芯片包缺失。别急着用标准外设库自己补一大堆头文件先装对应DFP。老工程里最常见还要算宏定义不对。STM32F10x标准外设库工程必须在C/C选项卡的“Define”里写清楚芯片型号宏和USE_STDPERIPH_DRIVER比如STM32F10X_MD,USE_STDPERIPH_DRIVER。少写了其中一个编译结果就是一堆“undeclared identifier”或者驱动文件直接不包含。这个是不能靠系统自动判断的必须手动确认。5.3 ARMCC V5 与 V6 的典型差异如果你原来用的是AC6现在切到AC5或者反过来有几个差异要心里有数。一是C标准。AC5默认是C90你要用C99特性得在Options里勾上--c99AC6默认C11很多老代码在AC6下会因为类型定义更严格而报警告甚至错误。二是内联汇编。AC5支持老的__asm关键字可以直接在C代码里面写ARM汇编AC6对GNU风格内联汇编支持更好但老的__asm { ... }写法在AC6下就不行了。这个差异在移植启动文件和RTOS底层的时会特别明显。三是编译器的诊断信息。AC6的警告种类比AC5多得多同一个工程AC5编译干干净净AC6能给你几十条warning但不影响生成。所以如果你拿一个老工程在AC6下看到海量警告不代表代码有问题更多是编译器检查策略变了。我在实际中给的建议是能用AC5跑老工程就不要费劲去改成AC6除非你有时间把代码彻底迁移一遍。迁移不是改一两个语法问题那么简单有些隐蔽的指针别名问题在AC6下才会暴露而且排查起来很耗时。当然新工程就直接AC6性能更好、优化更激进没必要新写的代码还守着AC5。6. 烧录调试与 Win11 驱动问题6.1 ST-Link、DAP-Link 驱动的安装与回滚Win11对ST-Link和DAP-Link的通用驱动支持其实很好通常情况下插上USB线设备管理器里就能识别出来。但如果你是“第一次插上能识别第二天再插就黄叹号”这个在Win11下也不少见。Windows 11的驱动强制签名机制比Win10更严格某些没有通过微软签名的老版本ST-Link驱动会安装失败。解决办法不是去系统设置里关闭驱动签名验证那个操作一时能用下次更新又会变回去。更稳妥的办法是安装ST官方最新的驱动ST-Link的驱动在STM32CubeProgrammer安装包里自带或者到ST官网单独下载“ST-LINK USB Driver”。这个驱动签名是新的Win11可以直接装。另外有个真实经历分享给你我遇到过两次Win11系统更新完之后ST-Link突然连不上。设备管理器里看驱动显示正常但Keil调试就是“No target connected”。后来发现是Windows更新把USB驱动换成了通用版本导致ST-Link的VCP串口功能和SWD功能同时异常。处理方法很简单设备管理器里找到更新过的设备点“属性 - 驱动程序 - 回滚驱动程序”恢复到旧版本重启电脑就正常了。所以不一定要费劲去关自动更新先学会回滚驱动比一棍子打死更新要稳得多。DAP-Link那边情况好一点因为它使用的是CMSIS-DAP协议在Win11下基本靠系统内置驱动就能跑。问题主要集中在USB线质量或者供电不足上尤其是那种几块钱的“细芯”USB线在SWD频率高一点的场合下极其容易通信失败。调试的时候用短一点的线能明显少一堆奇奇怪怪的报错。6.2 常见烧录失败错误速查烧录失败是新手最容易心态炸裂的环节。我把这些年见过的高频报错整理成一个表你可以直接对照排查。报错信息常见原因解决办法No target connected调试器没识别到目标板或SWD接线错误检查ST-Link与板子的SWDIO、SWCLK、GND三根线在Debug设置里把时钟降到1MHz确认目标板单独供电Flash Download failed - Cortex-M3Flash算法没选对或芯片型号和算法不匹配在Options for Target - Utilities - Settings里勾选对应Flash算法比如STM32F10x Med-density FlashRDDI-DAP ErrorST-Link连接不稳定或固件版本过旧用STM32CubeProgrammer升级ST-Link固件更换USB口关闭其他占用调试器的软件Connection error / Cannot access target芯片被读保护或SWD引脚被复用按住复位键连接或在Debug设置里勾选Connect under Reset模式必要时用STM32CubeProgrammer做整片擦除Timeout while checking target connectivity目标芯片时钟异常或板子没有复位电路检查外部晶振/复位电路先用手动复位后再点烧录这些报错里“RDDI-DAP Error”出现频率最高。以前在Win10下没遇到过换到Win11后大家频繁遇到原因多半不是Keil问题而是ST-Link固件太老。先别换USB线先用STM32CubeProgrammer的固件升级功能把ST-Link升级到最新再回Keil烧录基本就解决了。7. 高频问题速查我在群里被反复问过的几个点7.1 Target 选项卡里的 XTAL 是灰的怎么改不少人新建一个工程后打开Options for Target - Target标签页发现最上面的“Xtal (MHz)”输入框是灰色不可编辑状态第一反应就是哪里的配置不对。我明确告诉你这个不是配置问题。Xtal这个值是从Device数据库里带出来的你选了什么芯片它就会自动填一个默认晶振频率。如果芯片包定义不完整或者你选的是“Generic Cortex-M3”这种通用设备这个框才会置灰。它影响的是Keil软件模拟器里做“仿真”时的时钟计算实际烧录到硬件以后这个值跟你的真实运行一点都不相关。换句话说就算它显示0或者灰色的8.0板子照常跑烧录照常烧。所以这个灰不灰不用太纠结。如果你实在介意可以尝试在Device页面换一个更完整的具体芯片型号比如从“STM32F103C8”到“STM32F103C8Tx”这种保存关闭工程再重新打开有时候芯片包会刷新一下Xtal就能编辑了。跟编译器AC5、AC6都没有关系。7.2 左侧工程目录突然不见了这个属于UI操作问题。有时候不小心拖动了工程窗口或者切换了工程左边的Project栏就消失了很多人以为是软件坏了。恢复方法菜单栏View菜单里找Project Window勾选上就回来了。如果Project Window选项是灰色的说明当前没有打开任何工程去File - Open Project打开一个.uvprojx文件即可。还有一种情况是左侧工程树还在但所有文件都折叠起来了看起来像是“没了”。这时候在左侧空白处右键选“Expand All”就能全部展开。这个小操作在很多中文教程里压根不提但我见过好几个新手卡在这一步。7.3 装了 STM32 芯片包新建工程却找不到芯片芯片包装了Devices里依然找不到对应型号这事也很频繁。通常的原因不是包没装而是你装到了错误的Pack目录。最常见的是电脑上装了不止一个Keil版本Pack Installer装的包进了某一个版本的目录而你打开的是另一个版本的uVision。去C:\Keil_v5\ARM\PACK里看一眼确认STM32F1xx_DFP对应的文件夹存在如果存在重启uVision再新建工程在“Software Packs”下面就能看到ST系列了。另外一个原因是很多人把MDK和C51装在同一个目录导致Pack路径互相覆盖。MDK和C51是两套不同的工具链如果装在同一个Keil_v5目录里后面安装的软件会把前面那个的Pack路径覆盖掉一开有工程全乱。稳妥的做法是给两者分别建独立的安装目录比如MDK装C:\Keil_v5C51装C:\Keil_C51。日常使用通过不同的快捷方式进入就不会冲突。7.4 关于“2K限制”和其他限制的说法网上经常会搜到“keil5 c51的2k限制怎么解除”这里要澄清一下2K限制是C51编译器评估版的限制针对的是8051单片机不是ARM MDK。AND MDK的评估版限制是编译代码大小不能超过32KB左右这两个是完全不同的产品线。如果你在用STM32搜到的却是C51 2K限制说明搜错了方向。这个限制的正式解法只有一个购买对应产品的正版License然后在License Management里输入。不要去折腾注册机那些东西盯上注册机的不只是你还有一堆恶意软件作者。评估版对学习来说真的足够等你需要解限的时候说明你已经有能力判断自己是否需要正版授权了。7.5 Win11 自动更新与开发环境稳定性“关闭更新”这个操作在Win11下争议很大我不会建议你去永久关闭。嵌入式开发环境有时候会依赖USB驱动和特定于版本的系统APIWin11的大版本更新确实可能带来问题。但与其永久关闭更新不如把更新节奏控制在自己手里。我的做法是在Windows更新设置里把“暂停更新”设为最长的时间一般能暂停5周重要项目期间绝不主动更新等手上项目告一段落再手动检查更新。平时保持系统补丁更新既稳定又不会措手不及。如果某次更新后Keil或者调试器出问题先去设备管理器回滚驱动回滚没用再说“本次更新不适合我”也不迟。8. 最后再说点安装之外的体会这一套环境装下来说难也难说简单也简单。难的是方向和版本判断简单的是只要你把版本关系和缘由理清楚了安装本身也就是一路“下一步”的事。我个人习惯是每配置好一台电脑的Keil环境就把C:\Keil_v5整个目录打成一个压缩包留存下次换电脑直接解压到同样的路径然后重新激活一下License就能用省掉重新装Pack的漫长等待。另外就是我现在只用固定版本搭配固定的ST-Link固件不追新不折腾编译环境这玩意儿本质上就是个工具稳定好用比什么都强。希望这套流程能帮你少走点弯路。