3. 开发环境搭建:Keil MDK安装与配置、CMS32 Pack包安装、工程模板建立与验证
做嵌入式开发,第一件事就是把家伙事儿备齐。Keil MDK 算是 ARM Cortex-M 内核开发的老牌工具了,CMS32 系列用的就是它。这一章我带你从头搭一遍环境,顺便把我这些年踩过的坑也抖出来。
3.1 Keil MDK 安装与配置
Keil MDK 的版本我建议用 5.38 或更新的。为什么?因为老版本对 CMS32 的 Pack 包支持不太好。我之前有个同事用 MDK 5.26 死活装不上 CMS32 的包,折腾了半天才发现是版本太旧。
3.1.1 下载与安装步骤
- 去官网下载:Keil 官网(www.keil.com)找到 MDK-ARM 下载页面。需要注册账号,免费的。
- 运行安装包:双击 .exe,一路 Next。安装路径我建议别改,默认 C:\Keil_v5 就行。改路径有时候会出些莫名其妙的问题。
- 激活 License:安装完打开 Keil,菜单栏 File → License Management。把购买的 License ID 填进去。如果是评估版,有 32KB 代码限制,做 Bootloader 够用,但量产项目还是买正版吧。
3.1.2 编译器配置
装完 MDK 后,我习惯先配一下编译器选项。打开 Keil,点 Project → Manage → Project Components,这里可以选编译器版本。CMS32 推荐用 ARM Compiler 6(也就是 LLVM 后端),编译速度快,优化也好。
ARM Compiler 5 虽然稳定,但已经停止更新了。我个人建议直接上 AC6,代码密度和性能都比 AC5 好一截。
3.2 CMS32 Pack 包安装
Pack 包就是芯片厂商提供的设备支持包,里面包含了芯片的 SVD 文件、Flash 算法、启动代码、外设驱动库这些。没有 Pack 包,Keil 根本不认识 CMS32 芯片。
3.2.1 获取 Pack 包
CMS32 的 Pack 包可以从两个地方拿:
- Keil 官网 Pack Installer:打开 Keil,点 Pack Installer 按钮,搜索 CMS32,直接在线安装。方便,但网速慢的时候能急死人。
- 中微半导体官网:下载离线 Pack 包(.pack 文件),然后手动导入。我一般用这种方式,稳当。
3.2.2 手动安装步骤
- 下载 CMS32_DFP.x.x.x.pack 文件。
- 打开 Keil MDK,点 Pack Installer → File → Import from Folder。
- 选择 .pack 文件,点确定。
- 安装完成后,在 Device 列表中就能看到 CMS32 系列了。
3.2.3 验证 Pack 包安装
新建一个空工程,在 Device 选择界面输入 CMS32,如果能弹出芯片列表,说明装好了。如果搜不到,检查一下 Pack Installer 里有没有绿色勾号。
| 检查项 | 正常状态 | 异常处理 |
|---|---|---|
| Pack Installer 状态 | 绿色勾号 | 红色叉号 → 重新安装 |
| Device 列表 | 显示 CMS32 系列 | 空白 → 重启 Keil |
| 编译无报错 | 0 Error, 0 Warning | 检查路径和版本 |
3.3 工程模板建立与验证
环境搭好了,接下来建一个工程模板。这个模板后面所有章节都会用到,所以一次建好,后面省事。
3.3.1 新建工程
- 点 Project → New μVision Project。
- 选择芯片型号,比如 CMS32L051。
- 弹出 Manage Run-Time Environment 窗口,这里勾选需要的组件:
- CMSIS:CORE、DSP(如果需要)、Device(必选)
- Device:Startup(启动文件)、System(系统初始化)
- Compiler:I/O、Retarget(可选)
我一般只勾 CMSIS CORE 和 Device Startup,其他的后面按需添加。勾太多东西,编译慢,还容易出依赖冲突。
3.3.2 配置工程选项
右键工程名 → Options for Target,这里有几个关键配置:
| 选项卡 | 配置项 | 推荐值 | 说明 |
|---|---|---|---|
| Target | ARM Compiler | V6.19 | AC6 编译器 |
| Target | Floating Point | No FPU | CMS32 无硬件 FPU |
| Output | Create HEX File | 勾选 | 生成烧录文件 |
| Linker | Use Memory Layout | 勾选 | 自动分配内存 |
| Debug | Use Simulator | 不勾 | 用调试器 |
3.3.3 添加启动代码与主函数
工程建好后,默认会有 startup_CMS32.s 和 system_CMS32.c。我们再手动加一个 main.c:
#include "CMS32L051.h"
int main(void)
{
// 系统时钟初始化
SystemInit();
// 配置 GPIO
// 这里先留空,后面章节会详细讲
while(1)
{
// 主循环
}
}
这段代码很简单,就是初始化系统时钟,然后死循环。目的是验证工程能不能正常编译。
3.3.4 编译验证
点 Build 按钮(或者按 F7),看编译输出窗口:
Build started: Project: CMS32_Template
*** Using Compiler 'V6.19', folder: 'C:\Keil_v5\ARM\ARMCLANG\Bin'
Build target 'Target 1'
compiling main.c...
assembling startup_CMS32L051.s...
compiling system_CMS32L051.c...
linking...
Program Size: Code=452 RO-data=256 RW-data=8 ZI-data=1024
FromELF: creating hex file...
".\Objects\CMS32_Template.axf" - 0 Error(s), 0 Warning(s).
看到 "0 Error(s), 0 Warning(s)" 就说明环境搭好了。如果报错,多半是 Pack 包没装好或者路径有问题。
3.4 开发环境结构总览
下面这张图把整个开发环境的结构画出来了,你看一眼就能明白各个组件之间的关系。
3.5 常见问题与避坑指南
环境搭建看着简单,但实际操作中总会遇到各种幺蛾子。我把这些年遇到的高频问题列出来,你碰到了直接对照着查。
3.5.1 Pack 包安装失败
现象:Pack Installer 里 CMS32 显示红色叉号。
原因:网络问题或 Pack 包版本不兼容。
解决:去官网下载离线包手动安装。我曾经在客户现场网络不好,在线装了一下午没成功,后来用离线包 5 分钟搞定。
3.5.2 编译报错 "cannot open source input file"
现象:编译时找不到头文件。
原因:工程路径包含中文或空格,或者 Pack 包没装好。
解决:检查工程路径,确保全英文。重新安装 Pack 包。
3.5.3 调试器连接不上
现象:点击 Debug 按钮后,提示 "No ULINK Device found"。
原因:驱动没装或调试器配置不对。
解决:检查 USB 驱动,在 Debug 选项卡里选择正确的调试器型号。我习惯用 ULINK2,稳定可靠。
好了,环境搭好了,模板也验证通过了。后面我们就可以正式开始写 Bootloader 代码了。记住,开发环境是基础,基础打牢了,后面才不慌。