实现Keil C251、C51和MDK多环境兼容的技术指南

1. 引言

  • 背景介绍:开发多系列单片机(如STM32、C51、C251)时,Keil默认安装导致工程文件关联到最新环境(如UV4.exe),引发兼容性问题。
  • 问题描述:打开工程文件时,系统自动调用UV4.exe,但可能加载错误工具链(如C51工程在MDK环境中报错)。
  • 解决方案概述:通过修改Keil生成的启动配置文件,动态调整环境参数,实现单一UV4.exe兼容所有工程类型。
  • 预期好处:减少IDE切换,提升开发效率,支持混合项目开发。

2. 技术概要

  • 核心原理:Keil的UV4.exe在启动时读取配置文件(如UV4.ini),指定工具链路径和环境参数。通过编辑该文件,添加多环境识别逻辑,UV4.exe能自动匹配工程类型。
  • 关键机制:配置文件包含路径变量(如$TOOLKIT_DIR$),修改后UV4.exe根据工程文件扩展名(如.uvproj)加载对应编译器。
  • 兼容范围:支持Keil MDK(ARM)、C51(8051)和C251(251架构),覆盖STM32、传统51系列等开发需求。
  • 优势:无需安装多个Keil实例,避免环境冲突,简化工作流程。

3. 准备工作

  • 所需工具:
    • Keil安装包(确保已安装MDK、C51和C251工具链)。
    • 文本编辑器(如Notepad++),用于修改配置文件。
    • 系统权限:Windows管理员账户,以访问系统文件。
  • 环境检查:
    • 确认Keil版本兼容性(如UV4版本需支持所有工具链)。
    • 备份原始配置文件,防止意外错误。

安装顺序为C51->C251->ARM/C251->C51->ARM

在同一文件夹下,先安装C51安装包,再安装C251,再安装ARM。每次安装都将TOOLS.INI文件中的每个编译环境的加载内容复制下来。如:

C51:

[C51]
PATH="D:\keil_IDE\MDK\C51\"
VERSION=V9.02a
BOOK0="HLP\Release_Notes.htm" ("Release Notes",GEN)
BOOK1="HLP\C51TOOLS.chm" ("Complete User's Guide Selection",C)
TDRV0=BIN\MON51.DLL ("Keil Monitor-51 Driver")
TDRV1=BIN\ISD51.DLL ("Keil ISD51 In-System Debugger")
TDRV2=BIN\MON390.DLL ("MON390: Dallas Contiguous Mode")
TDRV3=BIN\LPC2EMP.DLL ("LPC900 EPM Emulator/Programmer")
TDRV4=BIN\UL2UPSD.DLL ("ST-uPSD ULINK Driver")
TDRV5=BIN\UL2XC800.DLL ("Infineon XC800 ULINK Driver")
TDRV6=BIN\MONADI.DLL ("ADI Monitor Driver")
TDRV7=BIN\DAS2XC800.DLL ("Infineon DAS Client for XC800")
TDRV8=BIN\UL2LPC9.DLL ("NXP LPC95x ULINK Driver")
RTOS0=Dummy.DLL("Dummy")
RTOS1=RTXTINY.DLL ("RTX-51 Tiny")
RTOS2=RTX51.DLL ("RTX-51 Full")
TDRV9=BIN\STCMON51.DLL ("STC Monitor-51 Driver")
LIC0=47QMA-14EE0-VP2Z0-BV69M-0VQYL-EC1CJ

C251:

[C251]
PATH="D:\keil_IDE\MDK\C251\"
VERSION=5.60
BOOK0="HLP\Release_Notes.htm" ("Release Notes",GEN)
BOOK1="HLP\c251tools.chm" ("uVision User's Guide Selection",C)
TDRV0=BIN\MON251.DLL ("Keil Monitor-251 Driver")
RTOS0=Dummy.DLL("Dummy")
RTOS1=RTXTINY.DLL ("RTX-251 Tiny")
RTOS2=RTX51.DLL ("RTX-251 Full")
TDRV1=BIN\STCMON251.DLL ("STC Monitor-251 Driver")
LIC0=47PLD-82KGZ-788FE-59LW8-82HWT-85L3V

ARM:

[ARM]
PATH="D:\keil_IDE\MDK\ARM\"
VERSION=5.39
PATH1="C:\Program Files (x86)\Arm GNU Toolchain arm-none-eabi\11.2 2022.02\"
TOOLPREFIX=arm-none-eabi-
CPUDLL0=SARM.DLL(TDRV16,TDRV17,TDRV18)                                                                       # Drivers for ARM7/9 devices
CPUDLL1=SARMCM3.DLL(TDRV0,TDRV1,TDRV2,TDRV3,TDRV4,TDRV5,TDRV6,TDRV7,TDRV8,TDRV9,TDRV10,TDRV11)               # Drivers for Cortex-M devices
CPUDLL2=SARMCR4.DLL(TDRV4)                                                                                   # Drivers for Cortex-R4 devices
CPUDLL3=SARMV8M.DLL(TDRV2,TDRV4,TDRV6,TDRV7,TDRV8,TDRV12,TDRV13,TDRV14,TDRV15)                               # Drivers for ARMv8-M devices
BOOK0="HLP\RELEASE_NOTES.HTM" ("Release Notes for MDK 5.39",GEN)
BOOK1="HLP\ARMTOOLS.chm" ("Complete User's Guide Selection",C)
TDRV0=BIN\UL2CM3.DLL("ULINK2/ME Cortex Debugger")
TDRV1=BIN\ULP2CM3.DLL("ULINK Pro Cortex Debugger")
TDRV2=BIN\ULPL2CM3.dll("ULINKplus Debugger")
TDRV3=BIN\CMSIS_AGDI.dll("CMSIS-DAP Debugger")
TDRV4=Segger\JL2CM3.dll("J-LINK / J-TRACE Cortex")
TDRV5=BIN\DbgFM.DLL("Models Cortex-M Debugger")
TDRV6=STLink\ST-LINKIII-KEIL_SWO.dll ("ST-Link Debugger")
TDRV7=NULink\Nu_Link.dll("NULink Debugger")
TDRV8=PEMicro\Pemicro_ArmCortexInterface.dll("Pemicro Debugger")
TDRV9=SiLabs\SLAB_CM_Keil.dll("SiLabs UDA Debugger")
TDRV10=BIN\ABLSTCM.dll("Altera Blaster Cortex Debugger")
TDRV11=TI_XDS\XDS2CM3.dll("TI XDS Debugger")
TDRV12=BIN\ULP2V8M.DLL("ULINK Pro ARMv8-M Debugger")
TDRV13=BIN\UL2V8M.DLL("ULINK2/ME ARMv8-M Debugger")
TDRV14=BIN\CMSIS_AGDI_V8M.DLL("CMSIS-DAP ARMv8-M Debugger")
TDRV15=BIN\DbgFMv8M.DLL("Models ARMv8-M Debugger")
TDRV16=BIN\UL2ARM.DLL("ULINK2/ME ARM Debugger")
TDRV17=BIN\ULP2ARM.DLL("ULINK Pro ARM Debugger")
TDRV18=Segger\JLTAgdi.dll("J-LINK / J-TRACE ARM")
DELDRVPKG0=ULINK\UninstallULINK.exe("ULINK Pro Driver V1.0")
LIC0=LSNXV-PUMQS-PCAJ8-33SHE-DYASX-BAVUI

4. 修改启动配置文件的分步指南

找到你的安装路径:Keil安装目录下的TOOLS.INI,如("D:\keil_IDE\MDK\TOOLS.INI")。

  • 步骤2: 编辑配置文件内容
    • 核心修改:在TOOLS.INI中添加环境切换区块,定义工具链路径和工程关联规则。
    • 示例代码(我的INI加载文件,基于INI格式):
      [UV2]
      ORGANIZATION="1"
      NAME="1", "1"
      EMAIL="1"
      ARMSEL=1
      USERTE=1
      TOOL_VARIANT=mdk_std
      RTEPATH="D:\keil_IDE\MDK"
      CPACKGETPATH=D:\keil_IDE\MDK\ARM\cmsis-toolbox\bin
      CDB0=UV4\STC.CDB ("STC MCU Database")
      [C51]
      PATH="D:\keil_IDE\MDK\C51\"
      VERSION=V9.02a
      BOOK0="HLP\Release_Notes.htm" ("Release Notes",GEN)
      BOOK1="HLP\C51TOOLS.chm" ("Complete User's Guide Selection",C)
      TDRV0=BIN\MON51.DLL ("Keil Monitor-51 Driver")
      TDRV1=BIN\ISD51.DLL ("Keil ISD51 In-System Debugger")
      TDRV2=BIN\MON390.DLL ("MON390: Dallas Contiguous Mode")
      TDRV3=BIN\LPC2EMP.DLL ("LPC900 EPM Emulator/Programmer")
      TDRV4=BIN\UL2UPSD.DLL ("ST-uPSD ULINK Driver")
      TDRV5=BIN\UL2XC800.DLL ("Infineon XC800 ULINK Driver")
      TDRV6=BIN\MONADI.DLL ("ADI Monitor Driver")
      TDRV7=BIN\DAS2XC800.DLL ("Infineon DAS Client for XC800")
      TDRV8=BIN\UL2LPC9.DLL ("NXP LPC95x ULINK Driver")
      RTOS0=Dummy.DLL("Dummy")
      RTOS1=RTXTINY.DLL ("RTX-51 Tiny")
      RTOS2=RTX51.DLL ("RTX-51 Full")
      TDRV9=BIN\STCMON51.DLL ("STC Monitor-51 Driver")
      LIC0=47QMA-14EE0-VP2Z0-BV69M-0VQYL-EC1CJ
      [C251]
      PATH="D:\keil_IDE\MDK\C251\"
      VERSION=5.60
      BOOK0="HLP\Release_Notes.htm" ("Release Notes",GEN)
      BOOK1="HLP\c251tools.chm" ("uVision User's Guide Selection",C)
      TDRV0=BIN\MON251.DLL ("Keil Monitor-251 Driver")
      RTOS0=Dummy.DLL("Dummy")
      RTOS1=RTXTINY.DLL ("RTX-251 Tiny")
      RTOS2=RTX51.DLL ("RTX-251 Full")
      TDRV1=BIN\STCMON251.DLL ("STC Monitor-251 Driver")
      LIC0=47PLD-82KGZ-788FE-59LW8-82HWT-85L3V
      [ARM]
      PATH="D:\keil_IDE\MDK\ARM\"
      VERSION=5.39
      PATH1="C:\Program Files (x86)\Arm GNU Toolchain arm-none-eabi\11.2 2022.02\"
      TOOLPREFIX=arm-none-eabi-
      CPUDLL0=SARM.DLL(TDRV16,TDRV17,TDRV18)                                                                       # Drivers for ARM7/9 devices
      CPUDLL1=SARMCM3.DLL(TDRV0,TDRV1,TDRV2,TDRV3,TDRV4,TDRV5,TDRV6,TDRV7,TDRV8,TDRV9,TDRV10,TDRV11)               # Drivers for Cortex-M devices
      CPUDLL2=SARMCR4.DLL(TDRV4)                                                                                   # Drivers for Cortex-R4 devices
      CPUDLL3=SARMV8M.DLL(TDRV2,TDRV4,TDRV6,TDRV7,TDRV8,TDRV12,TDRV13,TDRV14,TDRV15)                               # Drivers for ARMv8-M devices
      BOOK0="HLP\RELEASE_NOTES.HTM" ("Release Notes for MDK 5.39",GEN)
      BOOK1="HLP\ARMTOOLS.chm" ("Complete User's Guide Selection",C)
      TDRV0=BIN\UL2CM3.DLL("ULINK2/ME Cortex Debugger")
      TDRV1=BIN\ULP2CM3.DLL("ULINK Pro Cortex Debugger")
      TDRV2=BIN\ULPL2CM3.dll("ULINKplus Debugger")
      TDRV3=BIN\CMSIS_AGDI.dll("CMSIS-DAP Debugger")
      TDRV4=Segger\JL2CM3.dll("J-LINK / J-TRACE Cortex")
      TDRV5=BIN\DbgFM.DLL("Models Cortex-M Debugger")
      TDRV6=STLink\ST-LINKIII-KEIL_SWO.dll ("ST-Link Debugger")
      TDRV7=NULink\Nu_Link.dll("NULink Debugger")
      TDRV8=PEMicro\Pemicro_ArmCortexInterface.dll("Pemicro Debugger")
      TDRV9=SiLabs\SLAB_CM_Keil.dll("SiLabs UDA Debugger")
      TDRV10=BIN\ABLSTCM.dll("Altera Blaster Cortex Debugger")
      TDRV11=TI_XDS\XDS2CM3.dll("TI XDS Debugger")
      TDRV12=BIN\ULP2V8M.DLL("ULINK Pro ARMv8-M Debugger")
      TDRV13=BIN\UL2V8M.DLL("ULINK2/ME ARMv8-M Debugger")
      TDRV14=BIN\CMSIS_AGDI_V8M.DLL("CMSIS-DAP ARMv8-M Debugger")
      TDRV15=BIN\DbgFMv8M.DLL("Models ARMv8-M Debugger")
      TDRV16=BIN\UL2ARM.DLL("ULINK2/ME ARM Debugger")
      TDRV17=BIN\ULP2ARM.DLL("ULINK Pro ARM Debugger")
      TDRV18=Segger\JLTAgdi.dll("J-LINK / J-TRACE ARM")
      DELDRVPKG0=ULINK\UninstallULINK.exe("ULINK Pro Driver V1.0")
      LIC0=LSNXV-PUMQS-PCAJ8-33SHE-DYASX-BAVUI
    • 解释:当打开工程时,UV4.exe解析扩展名,加载对应路径的工具链(如STM32工程使用MDK_Path)。
  • 步骤3: 应用配置并测试
    • 保存文件后,重启Keil UV4.exe。
    • 测试方法:打开不同类型工程文件(如C51的.uvproj),观察是否自动加载正确环境。
    • 验证指标:无报错提示,编译器选项显示目标工具链(如C251的编译器菜单)。

      总结:最终通过简单配置文件修改,实现UV4.exe全兼容,支持无缝开发STM32、C51和C251项目。

Logo

智能硬件社区聚焦AI智能硬件技术生态,汇聚嵌入式AI、物联网硬件开发者,打造交流分享平台,同步全国赛事资讯、开展 OPC 核心人才招募,助力技术落地与开发者成长。

更多推荐