2. 开发环境搭建:Keil MDK安装与配置、CMS32固件库获取、第一个LED工程创建与下载

说实话,做嵌入式开发这么多年,我见过太多人在环境搭建这一步就卡住了。不是装不上,就是装上了发现编译器版本不对,折腾半天连个灯都点不亮。这一章,咱们就把这些坑提前填上。

2.1 开发环境全景图

先看看我们这一章要搭什么。说白了,就是三样东西:

  • Keil MDK —— 写代码、编译、下载的IDE
  • CMS32固件库 —— 芯片厂商提供的底层驱动包
  • 调试工具驱动 —— 让电脑和开发板能说上话

这三者的关系,我画了张图,你看一眼就明白了。

CMS32 开发环境结构图 Keil MDK (IDE + 编译器) CMS32 固件库 (HAL/LL) CMS32 开发板 (硬件) 调试器驱动 (DAP-Link) 用户应用代码 (main.c) 说明:Keil MDK 调用固件库 API,通过调试器将固件下载到开发板 Flash 中

核心要点:Keil MDK 是主控台,固件库是中间层,硬件是目标。调试器负责把编译好的二进制文件烧进去。这三层缺一不可。

2.2 Keil MDK 安装与配置

2.2.1 版本选择

我个人习惯用 Keil MDK 5.38 或更新版本。为什么?因为 CMS32 的芯片包(Device Family Pack)在 5.36 之后才得到完整支持。你如果装了个 5.30,后面会发现找不到芯片型号,那就尴尬了。

Keil 版本 CMS32 支持情况 建议
MDK 5.36 以下 需手动安装旧版 Pack 不推荐
MDK 5.36 - 5.40 原生支持 CMS32 系列 推荐
MDK 6.x 基于 Clang,兼容性待验证 暂不推荐

2.2.2 安装步骤

安装过程其实不复杂,但有几个细节我提醒你注意:

  1. 路径不要有中文和空格 —— 我见过有人装在 "C:\Program Files (x86)\Keil_v5" 没问题,但如果你装在 "D:\我的工具\Keil",后面编译会报一些莫名其妙的路径错误。
  2. 安装时勾选所有组件 —— 尤其是 ARM Compiler 和 Debug Interface。缺了后面还得补装。
  3. 安装完成后立即重启 —— 环境变量才能生效。

我的习惯:装完 Keil 后,第一件事是打开 Pack Installer,搜索 "CMS32" 并安装对应的 Device Family Pack。这一步很多人会忘,结果打开工程发现芯片列表是空的。

2.3 CMS32 固件库获取

固件库去哪找?官方渠道有两个:

  • 中微半导体官网 —— 下载中心 -> CMS32 系列 -> 固件库包
  • Keil Pack Installer —— 直接在线安装 CMS32_DFP

我个人更推荐第二种方式。为什么?因为 Pack Installer 会自动处理依赖关系,你点一下安装,它把芯片头文件、启动文件、链接脚本全给你配好了。

固件库的目录结构,我简单说一下:

CMS32_StdPeriph_Lib/
├── Libraries/
│   ├── CMSIS/          # 内核相关文件
│   ├── CMS32F0xx/      # 外设驱动源文件
│   └── CMS32F1xx/      # 另一系列(视芯片而定)
├── Project/
│   ├── MDK-ARM/        # Keil 工程模板
│   └── IAR/            # IAR 工程模板
├── Utilities/
│   └── Flash_Loader/   # 串口下载工具
└── Documentation/
    └── User_Manual.pdf # 用户手册

我曾经踩过的坑:有次项目赶进度,我从网盘下载了一个所谓的"最新版"固件库,结果里面缺了关键的 system_cms32.c 文件。编译通过,下载也正常,但芯片就是跑不起来。后来花了半天才发现是固件库版本不对。所以,一定要从官方渠道获取,别图省事。

2.4 第一个 LED 工程创建与下载

好了,环境搭好了,库也拿到了。咱们来点实际的——让开发板上的 LED 亮起来。

2.4.1 创建工程

打开 Keil MDK,按以下步骤操作:

  1. 点击 Project -> New uVision Project
  2. 选择工程保存路径(建议单独建一个文件夹,比如 D:\CMS32_Projects\LED_Blink)
  3. 在弹出的芯片选择窗口中,搜索你的芯片型号,比如 CMS32F030
  4. 点击 OK 后,会弹出 Manage Run-Time Environment 窗口,这里勾选:
    • CMSIS -> CORE
    • Device -> Startup
    • Device -> GPIO(我们点灯要用)
  5. 点击 OK,工程就创建好了

2.4.2 编写代码

在工程中新建一个 main.c 文件,写入以下代码:

#include "CMS32F0xx.h"

void Delay(uint32_t count) {
    while(count--);
}

int main(void) {
    // 使能 GPIOA 时钟
    RCC_EnableAPB2PeriphClock(RCC_APB2_PERIPH_GPIOA, ENABLE);
    
    // 配置 PA0 为推挽输出,50MHz
    GPIO_InitTypeDef gpio_init;
    gpio_init.GPIO_Pin   = GPIO_Pin_0;
    gpio_init.GPIO_Mode  = GPIO_Mode_Out_PP;
    gpio_init.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_Init(GPIOA, &gpio_init);
    
    while(1) {
        GPIO_SetBits(GPIOA, GPIO_Pin_0);   // 点亮 LED
        Delay(500000);
        GPIO_ResetBits(GPIOA, GPIO_Pin_0); // 熄灭 LED
        Delay(500000);
    }
}

这段代码的逻辑很简单:

  • 先开 GPIOA 的时钟(不开启钟,寄存器写不进去)
  • 配置 PA0 为推挽输出模式
  • 主循环里,置位 PA0 -> 延时 -> 复位 PA0 -> 延时,形成闪烁效果

注意:不同开发板的 LED 引脚可能不同。有的接在 PA0,有的接在 PB1,甚至可能是低电平点亮。拿到板子后,先看原理图确认一下。我习惯在代码开头用宏定义把引脚写清楚:

#define LED_PIN     GPIO_Pin_0
#define LED_PORT    GPIOA
#define LED_ON()    GPIO_ResetBits(LED_PORT, LED_PIN)  // 低电平点亮
#define LED_OFF()   GPIO_SetBits(LED_PORT, LED_PIN)

2.4.3 编译与下载

代码写好了,按 F7 编译。如果一切顺利,底部 Output 窗口会显示 "0 Error(s), 0 Warning(s)"。

接下来是下载。你需要:

  1. 用 USB 线连接开发板和电脑
  2. 在 Keil 中点击 Options for Target -> Debug,选择调试器(一般是 CMSIS-DAP 或 DAP-Link)
  3. 点击 Settings,确认能识别到设备 ID
  4. 点击 Flash Download 选项卡,勾选 "Reset and Run"
  5. 按 F8 下载

如果一切正常,你会看到开发板上的 LED 开始闪烁。

如果下载失败,别慌。我遇到过的情况多半是:

  • 调试器驱动没装好 —— 去设备管理器看看有没有黄色感叹号
  • BOOT0 引脚电平不对 —— 有些板子需要拉高 BOOT0 才能进入下载模式
  • 供电不足 —— 换一根 USB 数据线试试(有些线只能充电不能传数据)

2.5 本章小结

这一章我们做了三件事:装了 Keil MDK,拿到了 CMS32 固件库,跑通了第一个 LED 工程。你想想看,从零到让一个灯闪起来,其实也就这么几步。

环境搭建是后面所有开发的基础。我建议你把工程文件备份好,后面章节的例程都可以在这个模板上改。嗯,就这样,咱们继续往下走。