Keil MDK for ARM 完整入门教程
第一部分:准备工作与环境搭建
什么是 Keil MDK?
Keil MDK(Microcontroller Development Kit)是 ARM 公司推出的一个集成开发环境,专门用于基于 ARM Cortex-M, Cortex-R 以及经典 ARM7/9 内核的微控制器开发,它由德国公司 Keil 开发,后被 ARM 收购,是目前嵌入式开发领域最主流、最强大的工具之一。

MDK 主要包含以下几个核心组件:
- µVision IDE (集成开发环境):代码编辑器、项目管理器、构建工具(编译器、汇编器、链接器)的图形界面。
- ARM C/C++ Compiler (ARMCC/ARMCLANG):业界领先的 C/C++ 编译器,能将你的高级代码高效地转换为 ARM 汇编语言,并最终生成机器码。
- Keil RTX 实时操作系统:一个轻量级的实时内核,用于任务管理。
- ULINK 调试器:用于硬件调试的仿真器,支持实时调试、性能分析、内存查看等功能。
- Pack Installer (软件包安装器):用于从 ARM 官方网站下载和安装各种微控制器设备的 Device Family Pack (DFP),即设备支持包。
安装 Keil MDK
前提条件:
- 一台运行 Windows 操作系统的电脑。
- 管理员权限(安装时需要)。
安装步骤:
-
下载安装包:
(图片来源网络,侵删)- 访问 Keil 官方网站:https://www.keil.com/download/product/
- 找到 MDK v5 版本并下载,通常提供最新版和稳定版供选择。
-
运行安装程序:
- 双击下载的
.exe文件(SetupMDK5xxx.exe)。 - 在安装向导中,一路点击 "Next"。
- 双击下载的
-
接受许可协议:
仔细阅读许可协议,选择 "I agree to the terms of the license agreement",然后点击 "Next"。
-
选择安装组件:
(图片来源网络,侵删)- 强烈建议选择默认的全安装,这包含了所有必要的组件,如编译器、调试器、RTX 等,点击 "Next"。
-
选择安装路径:
保持默认路径即可,或者选择一个你喜欢的路径,点击 "Next"。
-
开始安装:
点击 "Install" 开始安装过程,这可能需要几分钟时间。
-
完成安装:
- 安装完成后,会提示你安装 Device Family Packs (DFPs),这是 至关重要的一步!
- 点击 "OK",Pack Installer 会自动启动。
- 在 Pack Installer 中,搜索并安装你所用芯片厂商的 DFP,如果你用的是 STM32F103,就搜索并安装 "STMicroelectronics" 的 DFP。
- 安装完成后,关闭 Pack Installer。
-
首次启动:
- 首次启动 Keil µVision 时,会提示你注册,你可以选择使用 评估版,评估版有 32KB 的代码限制,对于学习和大多数示例项目来说完全足够。
第二部分:创建第一个工程 (Blinky LED)
我们将以一个经典的 "Blinky LED"(闪烁的 LED)项目为例,走完一个完整的开发流程,这里我们假设你使用的是一块 STM32F103C8T6 开发板。
创建新工程
-
打开 Keil µVision。
-
点击菜单栏的
Project->New µVision Project...。 -
选择一个文件夹来保存你的工程(
Blinky_LED),然后为工程命名(Blinky),并点击Save。 -
Keil 会提示你选择一个 设备,这是最关键的一步。
- 在弹出的窗口中,展开左侧的设备厂商列表,找到
STMicroelectronics。 - 在其下找到
STM32F1 Series,然后选择STM32F103。 - 在右侧的列表中,选择你的具体芯片型号,
STM32F103C8。 - 点击
OK。
- 在弹出的窗口中,展开左侧的设备厂商列表,找到
-
Keil 会询问你是否从
Device Family Pack中添加 启动文件,对于大多数项目,选择Yes。- 在弹出的窗口中,选择
CMSIS->Startup->startup_stm32f10x_md.s(如果你的芯片是中等容量 Flash,如 64KB,则选md;小容量选vl,大容量选ld)。 - 点击
Add,Close。
- 在弹出的窗口中,选择
配置工程
- 在左侧的 Project 窗口中,右键点击
Target 1,选择Options for Target 'Target 1'...。 - 在
Target选项卡中:- Xtal (MHz):设置你开发板的系统时钟频率,对于 STM32F103,外部晶振通常是 8MHz,保持
0 MHz。 - Use MicroLIB:勾选此项,MicroLIB 是一个针对嵌入式应用的轻量级 C 库,比标准的 C 库更小、更快。
- Xtal (MHz):设置你开发板的系统时钟频率,对于 STM32F103,外部晶振通常是 8MHz,保持
- 在
C/C++选项卡中:- Define:这里可以定义宏,我们暂时留空。
- Include Paths:这是告诉编译器去哪里找头文件,点击文件夹图标,添加 STM32 标准库的头文件路径,通常是
...\Keil_v5\ARM\Pack\Keil\STM32F1xx_DFP\2.4.0\Device\Include(路径中的版本号可能不同)。
- 在
Debug选项卡中:- Use:选择
ULINK Pro或ULINK2/ME,如果没有硬件调试器,可以选择Use Simulator(使用软件仿真)进行初步测试。
- Use:选择
- 点击
OK保存设置。
编写代码
- 在 Project 窗口中,右键点击
Source Group 1,选择Add New Item to Group 'Source Group 1'...。 - 选择
C File (.c),命名为main.c,并点击Add。 - 将以下代码复制并粘贴到
main.c中:
#include "stm32f10x.h" // 包含 STM32F10x 的头文件
// 延时函数 (简单粗略的延时)
void simple_delay(volatile uint32_t count) {
while(count--);
}
int main(void) {
// 1. 使能 GPIOA 的时钟
RCC->APB2ENR |= RCC_APB2ENR_IOPAEN;
// 2. 配置 PA5 引脚为推挽输出
// GPIOA->CRL 寄存器控制 PA0-PA7
// 位 31-28: CNF5, 位 27-24: MODE5
// 推挽输出: MODE = 01b (输出模式, 最大速度 10MHz)
GPIOA->CRL &= ~(0xF << 20); // 清除原来的设置
GPIOA->CRL |= (0x1 << 20); // 设置为推挽输出模式
while (1) {
// 3. 点亮 LED (PA5 输出低电平)
GPIOA->ODR &= ~(1 << 5);
// 延时
simple_delay(500000);
// 4. 熄灭 LED (PA5 输出高电平)
GPIOA->ODR |= (1 << 5);
// 延时
simple_delay(500000);
}
}
代码解释:
#include "stm32f10x.h":包含了芯片所有寄存器定义的文件。RCC->APB2ENR |= RCC_APB2ENR_IOPAEN;:这是 STM32 的精髓——时钟使能,在使用任何外设(如 GPIO)之前,必须先为其提供时钟。GPIOA->CRL ...:配置 GPIOA 端口寄存器。CRL控制低 8 位引脚(PA0-PA7),我们修改CNF5和MODE5来设置 PA5 的模式。GPIOA->ODR ...:输出数据寄存器,向ODR的第 5 位写入 0 或 1,就可以控制 PA5 引脚的电平。
编译工程
- 点击工具栏上的 Build 按钮(一个看起来像药丸的图标,快捷键
F7)。 - 如果一切配置正确,底部的 Build Output 窗口会显示:
Build target 'Target 1' compiling main.c... linking... Program Size: Code=680 RO-data=252 RW-data=0 ZI-data=4 ".\Objects\Blinky.axf" - 0 Error(s), 0 Warning(s).看到
0 Error(s), 0 Warning(s)表示编译成功!生成的.axf文件是用于调试的,.hex文件是用于烧录到芯片的。
下载与调试
- 连接硬件:将你的开发板通过 ST-Link 或 J-Link 等调试器连接到电脑。
- 配置下载:在
Options for Target->Debug选项卡中,确保你的调试器已连接并被识别,点击Settings,可以查看连接状态。 - 下载程序:点击工具栏上的 Download 按钮(一个向下的箭头,快捷键
F8),程序会被下载到开发板的 Flash 中。 - 开始调试:
- 点击工具栏上的 Start/Stop Debug Session 按钮(一个虫子图标,快捷键
Ctrl+F5)。 - 程序会开始运行,并停在
main函数的入口处(黄色箭头指示)。 - 你可以使用快捷键
F10(单步跳过)或F11(单步进入)来逐行执行代码。 - 观察 PA5 引脚上的 LED,它应该会开始闪烁!
- 在调试过程中,你可以查看变量、寄存器、内存等,非常方便。
- 点击工具栏上的 Start/Stop Debug Session 按钮(一个虫子图标,快捷键
第三部分:进阶技巧与资源
使用标准外设库 或 HAL 库
直接操作寄存器虽然能让你深刻理解硬件,但效率低且容易出错,在实际开发中,我们通常使用厂商提供的库函数。
- 标准外设库:早期广泛使用,函数直接对应寄存器操作,结构清晰。
- HAL 库 (Hardware Abstraction Layer):STM32 官方主推的库,统一了不同系列芯片的 API,可移植性更强,但代码结构相对复杂一些。
使用库时,你需要下载相应的库文件,并将其添加到你的工程中,然后在代码中包含对应的头文件。
代码片段与代码补全
Keil 提供了强大的代码补全功能,当你输入 GPIOA-> 时,它会列出所有可用的寄存器,极大提高了编码效率。
查阅数据手册和参考手册
- 数据手册:芯片的“身份证”,引脚定义、电气特性、封装信息等。
- 参考手册:芯片的“使用说明书”,详细描述了每个外设的功能、寄存器地址和每一位的作用,当你不确定某个寄存器如何配置时,查阅参考手册是唯一正确的方法。
学习资源推荐
- 官方资源:
- Keil 官方文档和教程:https://www.keil.com/support/docs/
- ARM 官方社区:https://community.arm.com/
- ST 官方网站:https://www.st.com/ (获取数据手册、库文件)
- 中文社区:
- 正点原子、野火 等国内知名厂商提供了非常详尽的开发板教程和视频,是初学者的绝佳学习材料。
- CSDN、博客园 等平台有大量开发者分享的经验和笔记。
这份教程涵盖了 Keil MDK 开发的基本流程:
- 安装 Keil MDK 和芯片支持包。
- 创建 新工程并选择正确的设备。
- 配置 工程选项(时钟、包含路径等)。
- 编写 代码(可以是寄存器操作或库函数)。
- 编译 代码,检查错误和警告。
- 下载 程序到硬件,并进行 调试。
掌握这些步骤后,你就可以开始探索更复杂的嵌入式项目了,祝你学习愉快!
