拓十年匠心定制 · 商业建站与技术教学双线并行 咨询热线:400-886-1026 service@lmnt.cn
ARTICLE DETAIL

资讯详情

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

Keil5中C51与STM32共存安装配置及TOOLS.INI合并指南

Keil5中C51与STM32共存安装配置及TOOLS.INI合并指南

在嵌入式这行待久了,你会发现一个特别有意思的现象:很多人的电脑里同时躺着两种完全不同的活儿——一边是车间里跑了十年的老设备,主控还是STC89C52或者AT89C51这类经典51单片机,代码几百行,但稳定得像老黄牛;另一边是新接的项目,STM32F103或者F407,外设一堆,动不动就要上RTOS、跑以太网、驱动数字电源。这两类项目放在一个人手里,最省事儿的做法就是让C51和STM32的开发环境在同一台电脑、同一个Keil5里共存,而不是装虚拟机或者来回切换。但真正动手装过的人都知道,Keil的C51和MDK(ARM)分属两套工具链,装不好就会出现"装了MDK,C51编译选项消失"或者"装了C51,STM32工程打不开"的尴尬。这篇就把我自己反复折腾、给团队新人配环境总结出来的一套方法完整拆开讲,从选版本、定目录、合并配置到排查报错,尽量让你一次装通、少走弯路。

1. 为什么同一台电脑要装两套工具链,难点到底在哪

1.1 51和32共存不是矫情,是真实的工作常态

先说清楚需求从哪来。很多人以为51单片机早就该淘汰了,可实际市场里,小家电、充电器、玩具、遥控器、简单的温控板,大量还在用51内核的芯片。原因很实在:便宜、够用、开发门槛低,一个8位MCU几毛钱到一两块钱,能把一个按键加数码管加继电器的小项目做完。而STM32这类32位MCU,价格虽然也降到几块钱,但工程复杂度、外设配置、时钟树、中断优先级这些,对简单项目来说是"杀鸡用牛刀"。所以真实情况就是,一个工程师手头可能同时有"用51快速出货的小单"和"用STM32做功能复杂的项目",两种需求并存。

更重要的是,很多人的学习路径本身就是从51入门的。大学里学的第一块板子大概率是51,毕业设计或者进阶才转到STM32。这些人的电脑里天然就装着Keil C51,后来又需要装Keil MDK。如果两套环境不能共存,就得装两台电脑或者用两个虚拟机,每次切项目都要重启、重连、传文件,效率低到让人抓狂。让它们在一台机器上和平共处,本质上是把重复的环境开销降到最低。

还有一个很现实的场景是代码复用。有些项目早期用51做原型验证,验证通过后为了性能升级到STM32,代码逻辑、状态机、通信协议都要对照着看,两个工程放在同一个IDE里切换,改起来顺手得多。这些都是把C51和STM32装在一起的实际理由,不是什么强迫症。

1.2 Keil的C51和MDK其实是两个东西

这是很多人一开始没搞明白、后面踩坑的根源。虽然它们都叫"Keil uVision",界面长得几乎一模一样,但底层是两条完全独立的工具链。

Keil C51针对的是8位8051内核,自带C51编译器、A51汇编器、BL51/LX51链接器,器件库是8051系列的各种型号。而Keil MDK(MDK-ARM)针对的是ARM Cortex-M、Cortex-A、Cortex-R内核,用的是ARMCC或者AC6(Arm Compiler 6,基于Clang)编译器,器件库通过Pack机制管理。两者唯一的共同点是那个叫uVision的图形IDE外壳,以及用来记录工具链路径的TOOLS.INI配置文件。

理解了这一点,很多现象就说得通了。为什么装了C51之后STM32编译不了?因为C51的安装包覆盖了TOOLS.INI,把ARM工具链的路径记录冲掉了。为什么在网上看到有人说"先装C51再装MDK"能成功,有人说反过来就不行?因为安装顺序直接决定了谁覆盖谁。所以核心矛盾不是"两个软件能不能共存",而是"那个记录工具链路径的TOOLS.INI能不能同时容纳C51和ARM两套配置"。想通这一层,后面所有操作的目标就明确了——让TOOLS.INI里同时有C51和ARM的段落。

1.3 装不好会出现的典型症状

提前把可能踩的坑摆出来,你装的时候心里有数。最常见的三种症状:

第一种,装完C51后发现STM32工程打开提示找不到器件或者编译时报"cannot open source input file",本质是ARM工具链的PATH在TOOLS.INI里丢了。第二种,装完MDK后想新建C51工程,发现在器件选择界面里根本搜不到51芯片,这是因为C51的器件库和工具链配置没了。第三种,两边看起来都在,但编译时提示License错误,比如"C51 evaluation version limit"或者"MDK-Lite expired",这是因为两套工具的授权是独立的,互不通用,一个装好了不代表另一个也能用。

这三种症状背后指向的是同一件事:环境是"分层"的——IDE外壳层、工具链层、器件库层、授权层,每一层都要单独照顾到。很多人只装了主程序就以为完事,结果卡在工具链或者授权上。所以下面我会按层来拆,尽量把每一步的目的讲透,而不是让你照着点下一步。

2. 安装之前的准备工作与版本选择

2.1 Keil主程序版本怎么选

版本选择这事儿,我的建议是不要盲目追新。原因有两点:一是新版IDE对老工程有时会有兼容性问题,二是工具链和器件包的匹配需要时间沉淀。

对于MDK,比较稳妥的是MDK5系列的某个成熟版本,比如5.29到5.36之间这些被大量项目验证过的版本。太新的版本有时候会强制用AC6编译器,而一些老工程用的是AC5(ARMCC),打开会提示编译器缺失,还得手动装Legacy支持包。对于C51,主流是Keil C51 V9.5x或V9.6x系列,这个版本已经很稳定,能覆盖绝大部分51芯片。

这里有个关键点要提前说:MDK和C51的安装包是分开下载的,它们不是一个大包。你需要分别拿到MDK的安装程序(比如MDK529.exe这类)和C51的安装程序(比如c51v960a.exe这类)。网上搜"keil5下载"往往只给MDK,C51要单独找。建议去官方渠道获取安装包,正版授权的问题后面单独说。

注意:不同版本混装偶尔会出现器件库不识别的情况,所以在正式装之前,先把主程序版本、C51版本、STM32的Pack版本三者记下来,装完出问题了好对照排查。

2.2 安装目录的规划,这一步决定成败

我见过太多人栽在目录上,所以单独拎出来讲。目录规划的核心原则是:要么彻底分开,要么主目录统一,别搞成一半一半。

方案一是主目录统一,也就是MDK和C51都装到同一个根目录,比如都用D:\Keil_v5。这种方案的好处是路径清晰,TOOLS.INI就一个,合并起来直观。缺点是装C51时它会把文件写进这个统一目录的C51子文件夹,如果MDK已经在里面,安装程序需要能正确识别并追加而不是覆盖。

方案二是彻底分开,比如MDK装D:\Keil_MDK,C51装D:\Keil_C51,然后手工把两个TOOLS.INI合并。这种方案最不容易相互破坏,是团队里我最推荐的一种,尤其是帮别人配环境或者一台机器要长期用的时候。

不管选哪种,有两条硬性要求:第一,安装路径里不要有中文和空格,比如"Program Files"这种带空格的路径就可能让某些工具链找不到文件,中文路径更是直接报错的重灾区。第二,C盘尽量不要放,一是占用系统盘空间,二是重装系统就全没了。统一放到D盘或E盘的英文目录下,比如D:\Keil5。

2.3 需要提前准备的资源清单

动手前把东西备齐,避免装到一半去下载。清单如下:MDK主程序安装包一个;C51主程序安装包一个;STM32对应系列的器件包(Device Family Pack,也就是常说的.pack文件,比如Keil.STM32F1xx_DFP.2.x.x.pack);如果要连ST-Link下载调试,还要装ST-Link的驱动;串口调试的话备一个CH340或者CP2102的USB转串口驱动。这些都是基于常见实践的补充,具体到你的板子可能还要额外的调试器驱动。

另外提前想好一件事:你是打算用正版授权,还是先用官方评估版顶着。官方评估版对C51有代码大小限制,对MDK也有代码大小限制,这种限制在正式商用项目里是绕不过去的。如果只是学习、跑demo,评估版完全够用;如果是要交付的商业项目,建议走正规授权渠道。这一点我不展开教你绕限制的方法,因为那涉及版权问题,用正版是对开发者和生态的基本尊重。

3. 兼容C51与STM32的安装实操全流程

3.1 第一步:安装MDK5主程序

我按"分开装再合并"的方案来演示,这套最稳。先装MDK。

运行MDK安装包,一路Next,到了选择安装路径的界面,改成D:\Keil_MDK(根据你实际情况调整)。这里注意,安装程序可能会默认把它装到C:\Keil_v5,一定手动改掉。改完之后继续Next,遇到需要输入用户信息的界面随便填,不影响使用,然后等待安装完成。

装完之后先不要急着装C51,先在MDK里做个小验证:打开uVision,看看界面能不能正常起来。如果起不来,先解决MDK的问题再说,别急着叠加C51。这一步的验证门槛很低,但能帮你把问题隔离在单一安装上,不至于两个都装完才发现坏了、还分不清是谁的锅。

MDK装完后,D:\Keil_MDK目录下会有UV4(IDE主程序)、ARM(ARM工具链)、TOOLS.INI这几个关键部分。ARM文件夹里就是编译器和器件支持,TOOLS.INI里此刻只有ARM相关的配置。记住这个状态,一会儿要对比。

3.2 第二步:部署C51工具链

接着装C51,安装路径设成D:\Keil_C51。C51安装包相对老一些,界面也更朴素,一路Next就行。

这里有个细节要留意:C51安装过程中,它也会生成或修改一个TOOLS.INI,而且这个TOOLS.INI里只有C51相关的段落。安装程序有时还会提示是否关联工程文件,如果你已经装了MDK,这个关联选择要小心,别把.uvprojx这类STM32工程文件错误关联到C51版本上,否则以后双击工程文件可能打开的是C51。稳妥的做法是不勾选关联,等合并完再统一处理。

装完C51后,去D:\Keil_C51目录看,通常有C51(C51工具链)、UV4(C51版IDE)、TOOLS.INI这几个。这个TOOLS.INI里的内容就是马上要合并的宝贝,先打开它看一眼,你会看到类似[C51]这样的段落,下面有PATH=指向C51目录。

3.3 第三步:合并TOOLS.INI,这是核心中的核心

前面铺垫那么多,就是为了这一步。合并的本质,就是让一个TOOLS.INI里同时有C51和ARM两套工具链的段落。

先理解TOOLS.INI的结构。它是一个典型的INI格式文件,用方括号分段。C51的段大致是[C51],ARM的段大致是[ARM]或者[ARMADS]之类,每个段下面有PATH、VERSION、BOOK等键值。IDE在启动的时候读这个文件,谁在里面谁就能被识别。

合并有两种做法。第一种是直接手工编辑:把D:\Keil_MDK目录下的TOOLS.INI用文本编辑器打开,再把D:\Keil_C51目录下TOOLS.INI里[C51]那一段(连同下面的PATH等)整体复制过来,粘到MDK的TOOLS.INI里,注意各段之间不要重名、不要互相嵌套。保存。第二种更彻底:直接用C51目录里的那个TOOLS.INI作为基础,把ARM段落补进去,或者反过来。

这里的关键是路径要指向实际位置。因为我是分开装的,所以C51段的PATH要指向D:\Keil_C51\C51\,ARM段的PATH要指向D:\Keil_MDK\ARM\。如果你只复制了段落却忘了改路径,IDE就会去找一个不存在的目录,结果就是工具链照样不识别。

一个合并后的结构大致长这样(示意,实际内容以你的版本为准):

[UV2] ORGANIZATION=xxx NAME=xxx [C51] PATH="D:\Keil_C51\C51\" VERSION=V9.60 BOOK0=HLP\RELEASE_NOTES.HTM("Release Notes",GEN) [ARM] PATH="D:\Keil_MDK\ARM\" VERSION=V5.06 BOOK0=HLP\RELEASE_NOTES.HTM("Release Notes",GEN)

改完保存,然后打开IDE看是否两边的工具链都能识别。这一步我建议改之前先备份一份TOOLS.INI,万一改乱了能马上还原。合并完后,用MDK目录下的UV4打开,应该能看到器件库和编译器都齐全了。

提示:如果你选的是"主目录统一"方案,两个安装都写在同一个根目录,那么TOOLS.INI本身通常会被安装程序智能追加,出问题的概率小一些,但也不是绝对,装完还是建议检查一遍C51和ARM段是否都在。

3.4 第四步:安装STM32芯片包

工具链通了,接下来装器件支持。STM32在MDK里是通过Pack机制管理的,也就是那一堆Keil.STM32F1xx_DFP、Keil.STM32F4xx_DFP这样的包。

装法有两种。一种是IDE里在线装:打开uVision,点菜单里的Pack Installer,在里面找到对应系列的Pack,点Install,网络好的话它会自动下载安装。另一种是离线装:提前下载好.pack文件,双击它,安装程序会自动装到MDK的Pack目录里。离线方式更稳,尤其是网络不稳定或者内网环境,强烈推荐离线装。

装之前先确认你用的是哪个系列:F1(比如F103)、F4(F407、F429)、F0、G0、H7等等,每个系列对应一个DFP包。装错了系列,工程里选不到对应型号。装完之后,新建STM32工程时在器件选择界面能搜到STM32F103C8这类具体型号,就说明Pack装对了。

3.5 第五步:授权与验证

授权这一步绕不开,但我要按合规的方式讲。Keil C51和MDK的授权是两套独立的,需要分别处理。

对于MDK,官方提供的是评估版,功能完整但有代码大小限制;正式项目需要购买授权,拿到License后通过IDE的License Management界面导入,把CID提交给官方或者授权渠道换取License Key。对于C51,逻辑一样,评估版有代码大小限制,商用需要正式授权。这里我不提供任何绕限制的工具或步骤,一方面涉及版权,另一方面很多来路不明的工具本身夹带风险。

验证的方法很简单:分别建一个C51工程和一个STM32工程,各写一段最简代码,编译看能否通过、有没有出现评估版限制提示。C51那侧写个点灯或者空main都行,STM32那侧建个最小工程编译一遍。两边都能干净编译通过,说明工具链和授权都到位了。

3.6 第六步:双环境编译验证

最后做一次完整的交叉验证。具体做法:新建一个C51工程,选好器件(比如AT89C51),写个简单的闪烁或串口打印,编译一次,看Build Output是否干净。再新建一个STM32工程,选好型号,编译一次空工程或者官方例程。关键是看IDE在同一个界面里能不能无缝切换这两种工程,工程属性里的Target、C/C++选项是否正常显示。

如果你是用分开装再合并的方案,验证通过后,就得到了一个"一套IDE、两套工具链、互不打架"的环境。以后开工,双击工程文件直接进,不用再折腾环境。

4. 装好之后的常见问题与排查

4.1 TOOLS.INI被覆盖导致的工具链丢失

这是最高频的问题。典型表现是:装了新东西之后,原来能编译的工程突然报找不到编译器,或者器件列表里某类芯片凭空消失。

排查思路很简单,打开TOOLS.INI看段落全不全。如果[C51]或[ARM]有一段不见了,就是被覆盖了,手动补回去。补的时候注意路径要对。如果你之前备份过一份完整的TOOLS.INI,直接还原是最快的。所以再强调一次,动手改之前一定要备份。

还有一种隐蔽的情况:段落都在,但PATH指向的是旧版本目录,比如你升级了MDK,路径没跟着更新,IDE就会去找一个不存在的旧路径。解决方法是把PATH改成当前实际安装目录。

4.2 编译报错与授权失效

编译报错的种类很多,但有几类特别常见,列个表方便对照排查。

报错现象可能原因处理思路
提示评估版代码大小限制授权为评估版或未导入检查License管理界面,确认授权状态
找不到器件型号Pack未装或装错系列检查Pack Installer,装对应系列DFP
找不到编译器路径TOOLS.INI中PATH错误打开TOOLS.INI核对并修正路径
编译通过但无法生成hex工程配置里未勾选输出在Output选项卡勾选生成hex文件
提示工具链未注册授权与工具链不匹配分别核对C51和MDK的授权

再说"授权失效"这个坑。有时候你昨天还能用,今天开机就提示授权过期或者失效,常见原因是系统时间被改过、装了什么清理软件把授权文件删了、或者两台机器用的是同一个授权导致冲突。处理办法是重新按正规流程导入授权,别指望换时间这种偏门操作,它往往会把授权状态搞得更乱。

4.3 烧录失败排查

热词里"keil5烧录失败"、"keil5 flash download failed"出现频率很高,这里专门讲讲。烧录失败一般分"连不上"和"连上但写不进"两类。

连不上,先查硬件:SWD或JTAG的线接对没有、目标板有没有独立供电、调试器驱动装了没。ST-Link、J-Link、DAPLink各自的驱动不一样。再看IDE里的调试器配置,Debug选项卡里选对了调试器没有,Flash Download里有没有勾选正确的Flash算法。

连上但写不进,常见原因是Flash算法不匹配,比如你的STM32F103C8用的是64K算法,结果配成了512K,或者更常见的是芯片被读保护或写保护了,需要先解除保护再烧。还有一种情况是芯片进入了低功耗或者调试口被复用成了GPIO,尤其是PA13、PA14这两个SWD引脚被程序占用后,下次就烧不进去了,这时候得用连接时复位或者BOOT模式配合才能救回来。

提示:调试口引脚被复用是新手最容易忽视的坑。写程序时如果一开始就把SWD引脚初始化成普通IO,第一次烧完就再也连不上了,所以别在程序开头就动这两个脚。

4.4 界面与细节上的小毛病

还有些不起眼但烦人的问题。比如"keil5 target选项卡的xtal变灰",这通常是因为当前工程类型不支持在界面上直接设晶振频率,或者器件库缺少对应定义,多数情况下不影响实际运行,通过工程配置或代码里定义就能绕过。"keil5左侧目录怎么显示",很多人是误点了把Project窗口隐藏了,在View菜单里把Project Window重新勾上就行。

再比如快捷键或自动补全失灵,往往是因为装了多个版本导致配置文件冲突,或者是杀毒软件干扰了IDE的临时文件。遇到这类玄学问题,先排除多版本冲突,再排除安全软件,多数能解决。

5. 长期使用中的一些个人经验

5.1 目录备份与迁移

环境装好之后,强烈建议给整个Keil目录做一次备份,把D:\Keil_MDK和D:\Keil_C51(或者统一目录)整个打包存起来。以后再帮别人配环境,直接解压改一下TOOLS.INI里的路径就能用,省去重新装的时间。我自己就备了一份,换新电脑的时候半小时就把环境还原了。备份的时候注意连Pack目录一起备,否则STM32的器件库还得重装。

5.2 两套工程的打开习惯

因为C51和MDK共用uVision外壳,建议养成习惯:51工程和32工程分目录放,文件名前缀区分,比如led51.uvproj和led32.uvprojx。虽然两者都用同一个IDE打开,但工程文件格式其实不完全一样,混在一起容易点错。另外,如果你经常在两套环境之间切,可以在桌面建两个快捷方式,分别指向两个目录下的UV4,需要哪套就开哪套,减少误操作。

5.3 关于代码大小限制的说明

最后再回到那个绕不开的话题。C51和MDK的官方评估版都有代码大小限制,这是官方设计的功能边界,不是bug。学习阶段,几百字节到几KB的代码完全够跑实验和课程设计;一旦进入商业交付,就走正规授权。我见过有人为了省授权费去用来源不明的工具,结果工程文件被注入奇怪内容、编译产物对不上、甚至机器中招,得不偿失。环境这东西,稳字当头,省小钱吃大亏的例子太多了。

我个人实际配这套环境配了不下十次,帮同事、带新人,最后发现最省心的永远是那几条:版本别追新,路径别带中文,分开装再合并,改配置文件前先备份。把这几条守住,C51和STM32在同一台电脑、同一个Keil5里和平共处,一点问题都没有。真要遇到绕不过的坑,十有八九是TOOLS.INI或授权这两处,顺着这条线查,基本都能定位到。

返回列表