2. 开发环境搭建:Keil MDK安装与配置、CMS32固件库获取、第一个LED工程创建与下载
说实话,做嵌入式开发这么多年,我见过太多人在环境搭建这一步就卡住了。不是装不上,就是装上了发现编译器版本不对,折腾半天连个灯都点不亮。这一章,咱们就把这些坑提前填上。
2.1 开发环境全景图
先看看我们这一章要搭什么。说白了,就是三样东西:
- Keil MDK —— 写代码、编译、下载的IDE
- CMS32固件库 —— 芯片厂商提供的底层驱动包
- 调试工具驱动 —— 让电脑和开发板能说上话
这三者的关系,我画了张图,你看一眼就明白了。
核心要点: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 安装步骤
安装过程其实不复杂,但有几个细节我提醒你注意:
- 路径不要有中文和空格 —— 我见过有人装在 "C:\Program Files (x86)\Keil_v5" 没问题,但如果你装在 "D:\我的工具\Keil",后面编译会报一些莫名其妙的路径错误。
- 安装时勾选所有组件 —— 尤其是 ARM Compiler 和 Debug Interface。缺了后面还得补装。
- 安装完成后立即重启 —— 环境变量才能生效。
我的习惯:装完 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,按以下步骤操作:
- 点击 Project -> New uVision Project
- 选择工程保存路径(建议单独建一个文件夹,比如
D:\CMS32_Projects\LED_Blink) - 在弹出的芯片选择窗口中,搜索你的芯片型号,比如 CMS32F030
- 点击 OK 后,会弹出 Manage Run-Time Environment 窗口,这里勾选:
- CMSIS -> CORE
- Device -> Startup
- Device -> GPIO(我们点灯要用)
- 点击 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)"。
接下来是下载。你需要:
- 用 USB 线连接开发板和电脑
- 在 Keil 中点击 Options for Target -> Debug,选择调试器(一般是 CMSIS-DAP 或 DAP-Link)
- 点击 Settings,确认能识别到设备 ID
- 点击 Flash Download 选项卡,勾选 "Reset and Run"
- 按 F8 下载
如果一切正常,你会看到开发板上的 LED 开始闪烁。
如果下载失败,别慌。我遇到过的情况多半是:
- 调试器驱动没装好 —— 去设备管理器看看有没有黄色感叹号
- BOOT0 引脚电平不对 —— 有些板子需要拉高 BOOT0 才能进入下载模式
- 供电不足 —— 换一根 USB 数据线试试(有些线只能充电不能传数据)
2.5 本章小结
这一章我们做了三件事:装了 Keil MDK,拿到了 CMS32 固件库,跑通了第一个 LED 工程。你想想看,从零到让一个灯闪起来,其实也就这么几步。
环境搭建是后面所有开发的基础。我建议你把工程文件备份好,后面章节的例程都可以在这个模板上改。嗯,就这样,咱们继续往下走。