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 下载与安装步骤

  1. 去官网下载:Keil 官网(www.keil.com)找到 MDK-ARM 下载页面。需要注册账号,免费的。
  2. 运行安装包:双击 .exe,一路 Next。安装路径我建议别改,默认 C:\Keil_v5 就行。改路径有时候会出些莫名其妙的问题。
  3. 激活 License:安装完打开 Keil,菜单栏 File → License Management。把购买的 License ID 填进去。如果是评估版,有 32KB 代码限制,做 Bootloader 够用,但量产项目还是买正版吧。
注意:安装路径不要包含中文或空格!我见过有人装到“D:\开发工具\Keil”这种路径,结果编译报错找不到头文件。老老实实用英文路径。

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 手动安装步骤

  1. 下载 CMS32_DFP.x.x.x.pack 文件。
  2. 打开 Keil MDK,点 Pack Installer → File → Import from Folder。
  3. 选择 .pack 文件,点确定。
  4. 安装完成后,在 Device 列表中就能看到 CMS32 系列了。
小技巧:安装完 Pack 包后,建议重启一下 Keil。有时候 Pack 包加载不完整,重启就能解决。我曾经因为这个浪费了半小时,后来发现重启大法好。

3.2.3 验证 Pack 包安装

新建一个空工程,在 Device 选择界面输入 CMS32,如果能弹出芯片列表,说明装好了。如果搜不到,检查一下 Pack Installer 里有没有绿色勾号。

检查项 正常状态 异常处理
Pack Installer 状态 绿色勾号 红色叉号 → 重新安装
Device 列表 显示 CMS32 系列 空白 → 重启 Keil
编译无报错 0 Error, 0 Warning 检查路径和版本

3.3 工程模板建立与验证

环境搭好了,接下来建一个工程模板。这个模板后面所有章节都会用到,所以一次建好,后面省事。

3.3.1 新建工程

  1. 点 Project → New μVision Project。
  2. 选择芯片型号,比如 CMS32L051。
  3. 弹出 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 不勾 用调试器
重点:Output 选项卡里一定要勾选 "Create HEX File",不然编译完没有 .hex 文件,没法烧录。我刚开始做 Bootloader 时忘勾过,找半天找不到烧录文件,尴尬。

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 开发环境结构总览

下面这张图把整个开发环境的结构画出来了,你看一眼就能明白各个组件之间的关系。

CMS32 开发环境结构图 Keil MDK-ARM IDE ARM Compiler 6 (AC6) ULINK / J-Link 调试器 CMS32 DFP Pack 包 CMS32L051 目标芯片 说明: • Keil MDK 提供 IDE 界面和项目管理功能 • AC6 编译器将 C 代码编译为机器码 • CMS32 DFP Pack 包提供芯片外设定义和 Flash 算法 • 调试器负责下载和在线调试

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 代码了。记住,开发环境是基础,基础打牢了,后面才不慌。