Keil MDK 安装与部署
二、安装与部署
- 下载安装 MDK。从 Keil 官网获取安装包,安装路径必须为纯英文且不含空格,否则编译器与脚本调用会出错。
- 装器件支持包(DFP)。打开 Pack Installer,搜索目标芯片系列(例如 STM32F4 系列),安装对应的 Device Family Pack。没有 DFP,工程里就没有启动文件与 Flash 算法。
- 激活授权。按使用场景选择社区版或商业授权。免费版本有代码体积限制,超限时会链接失败。授权通过 License Management 界面导入。
- 装调试器驱动。ST-LINK 装 ST 官方驱动,J-Link 装 SEGGER 驱动。装完在设备管理器里确认设备正常,无黄色感叹号。
- 创建或打开工程。新工程用 Project → New µVision Project,选好芯片型号后,MDK 会提示是否加入 CMSIS 的启动代码;用 CubeMX 生成工程时,选 MDK-ARM 工具链,它会直接产出
.uvprojx。
- 配置目标选项。Options for Target 里逐页确认:Device(型号)、Target(晶振频率、是否用 MicroLIB)、Output(是否生成 hex、输出目录)、C/C++(头文件路径与宏定义)、Debug(调试器选择与参数)、Utilities(Flash Download 算法)。
- 编译并下载。先 Build 确认零错误零警告,再 Download 写入芯片。
- 调试验证。进 Debug 模式,设断点、看外设寄存器、看变量,确认程序按预期运行。
# 典型的 MDK 工程目录(由 STM32CubeMX 生成)
MDK-ARM/
├── MyProject.uvprojx # µVision 工程文件(含编译选项、文件列表)
├── MyProject.uvoptx # 用户级选项(断点、窗口布局),一般不纳入版本管理
├── startup_stm32f4xxxx.s # 启动文件,来自 DFP
├── MyProject/
│ ├── MyProject.axf # 带调试信息
│ ├── MyProject.hex # 烧录文件
│ └── MyProject.map # 内存映射与符号表,排查体积与链接问题的关键
└── RTE/ # Run-Time Environment 组件的自动生成内容
# 头文件路径不要写死绝对路径,用相对路径:
# ..\Core\Inc
# ..\Drivers\STM32F4xx_HAL_Driver\Inc
# ..\Drivers\CMSIS\Device\ST\STM32F4xx\Include
# ..\Drivers\CMSIS\Include
#
# 预定义宏(C/C++ 页 Define 栏,注意是英文逗号后无空格):
# USE_HAL_DRIVER,STM32F407xx
依赖与环境要求
- 操作系统:Windows 为主,Linux/macOS 支持有限。
- DFP:必须与芯片型号精确匹配,装错系列会出现「找不到启动文件」。
- 启动文件:由 DFP 提供,需要与芯片的 Flash/RAM 容量匹配(比如 1MB Flash 的型号要用对应的
startup_xxx.s)。
- 调试器:ST-LINK / J-Link / ULINK 等,驱动与固件版本要与 MDK 版本兼容。
- 授权:注意代码体积限制。
常见报错与排查
| 报错 / 现象 | 原因 | 处理 |
Error: L6218E: Undefined symbol ... | 函数声明了但没编译进来;或 C/C++ 混用没加 extern "C" | 确认源文件已加入工程分组;检查头文件路径与宏定义;C++ 调用 C 函数要包 extern "C" |
Flash Download failed - Could not load file | 没生成 hex/axf,或输出路径不对,或 Flash 算法缺失 | Output 页确认生成 hex;Utilities 页确认已勾选正确的 Flash 算法 |
No target connected / 找不到芯片 | 驱动未装、线接错、复位模式不对 | 重装驱动;确认 SWDIO/SWCLK/GND 与电源;在 Debug 设置里把 Connect 改成「under Reset」再试 |
| 编译报大量语法错误,且之前是好的 | AC5 与 AC6 混用 | Target 页确认编译器版本;两者对语法与内联汇编的容忍度不同,切换后要统一 |
| 提示评估版体积限制 | 免费版 32 KB 限制 | 换社区版适用的非商业项目,或改用 GCC 工具链 / 购买授权 |
| 下载成功但程序不跑 | 复位向量/中断向量表偏移不对(有 Bootloader 时);或时钟初始化失败卡在对晶振的等待 | 检查向量表偏移设置;确认晶振频率与实际硬件一致 |
Error: L6406E: No space in execution regions | Flash 或 RAM 超出 | 看 .map 文件找占用大户;开优化、去调试信息、裁剪无用库 |
