目录
-
第一部分:准备工作
- 1 什么是 Keil MDK?
- 2 为什么选择 Keil MDK?
- 3 硬件和软件需求
- 4 下载与安装 Keil MDK
- 5 安装设备包
- 6 添加/注册 MDK-Lite (免费版)
-
第二部分:第一个项目 - 点亮一个 LED (Blinky)
- 1 创建新项目
- 2 选择 CPU 型号
- 3 创建源代码文件
- 4 编写简单的 C 代码
- 5 添加文件到项目
- 6 配置项目选项
- 7 编译项目
- 8 下载程序到开发板
-
第三部分:深入理解 Keil 界面与核心功能
- 1 Keil µVision 界面布局详解
- 2 使用调试器 - 核心功能
- 3 断点设置与使用
- 4 变量监视与内存查看
- 5 外设寄存器查看
-
第四部分:高级技巧与最佳实践
- 1 使用 CMSIS-DAP / J-Link / ST-Link 等调试器
- 2 配置目标选项
- 3 使用
printf重定向到串口 - 4 代码分块与优化
- 5 版本控制集成
-
第五部分:常见问题与资源
第一部分:准备工作
1 什么是 Keil MDK?
Keil MDK (Microcontroller Development Kit) 是德国 Keil 公司(现为 ARM 公司的一部分)推出的一款专门用于基于 ARM Cortex-M、ARM7/9/Cortex-R 等内核微控制器的集成开发环境,它将代码编辑器、编译器、链接器、调试器和项目管理工具无缝地集成在一起,极大地简化了嵌入式软件的开发流程。
2 为什么选择 Keil MDK?
- 一站式解决方案:从编写代码到调试烧录,所有功能集成在一个软件中。
- 强大的编译器:ARMCC/ARMCLANG 编译器性能优异,代码密度和执行效率高。
- 完善的调试功能:支持实时调试、断点、变量监视、内存查看、外设寄存器仿真等。
- 广泛的设备支持:支持几乎所有主流厂商(如 ST、NXP、TI、Microchip 等)的 ARM 芯片。
- 丰富的中间件:集成了 RTOS(如 Keil RTX5)、文件系统、USB/网络协议栈等。
- 庞大的用户社区和文档:学习资源非常丰富,遇到问题容易找到解决方案。
3 硬件和软件需求
- 硬件:
- 一块 ARM 开发板(STM32 Nucleo/Discovery, LPCXpresso, ESP32-C3 开发板等)。
- 一根 USB 连接线(用于供电、下载程序和调试)。
- (可选)一个独立的调试器(如 J-Link, ST-Link V2/V3,但很多开发板已板载)。
- 软件:
- Windows 操作系统 (7/8/10/11,64位推荐)。
- Keil MDK 安装包。
- 对应开发板的 设备包。
4 下载与安装 Keil MDK
- 访问官网:打开浏览器,访问 ARM Keil 官方网站。
- 下载 MDK:点击 "Downloads" -> "MDK" 找到最新版本的 MDK (MDK536)。
- 注册账号:下载前需要注册一个免费 ARM 账号。
- 安装:下载完成后,运行安装程序
mdk536.exe,按照安装向导的提示进行安装,一路点击 "Next" 即可,建议保持默认安装路径(如C:\Keil_v5)。
5 安装设备包
设备包包含了对应芯片的头文件、启动文件、Flash 算法等,是使用 Keil 开发特定芯片的必要组件。
- 在线安装(推荐)
- 打开 Keil µVision。
- 点击菜单栏的
Pack Installer(图标像一个电路板)。 - 在弹出的窗口中,左侧选择
Devices,在右侧的搜索框中输入你的芯片型号(STM32F103C8)。 - 找到对应的设备包,点击右侧的 号,然后点击
Install。 - 等待安装完成。

- 离线安装
如果你的开发板厂商提供了离线的设备包
.pdsc文件,可以在Pack Installer中点击Install from local file...来安装。
6 添加/注册 MDK-Lite (免费版)
Keil MDK 有免费版和商业版,免费版(MDK-Lite)对代码大小有限制(通常为 32KB),但对于学习和开发小型项目完全足够。
- 打开 Keil µVision。
- 点击菜单
Help->About µVision...。 - 在弹出的窗口中,点击
Enter License。 - 如果你已有 License,可以输入注册码,如果没有,可以点击
Get Free Evaluation License申请一个免费的 32KB 限制的 License。
第二部分:第一个项目 - 点亮一个 LED
本节以 STM32F103C8T6 (Blue Pill) 开发板为例,演示如何创建项目并点亮一个 LED。
1 创建新项目
- 打开 Keil µVision。
- 点击菜单栏
Project->New µVision Project...。 - 选择一个文件夹用于存放你的项目(
D:\Keil_Projects\Blinky),输入项目名Blinky,点击保存。
2 选择 CPU 型号
- 保存后,会弹出
Select Device for Target 'Target 1'窗口。 - 在左侧的厂商列表中找到并展开
STMicroelectronics。 - 在右侧的设备列表中找到
STM32F1 Series,然后选择STM32F103C。 - 确认选中
STM32F103C8T6,点击OK。

- 接下来会弹出一个
Manage Run-Time Environment窗口,这里让你选择需要的组件,对于第一个项目,我们保持默认,直接点击OK,Keil 会自动为你添加启动文件和基本的 CMSIS 文件。
3 创建源代码文件
- 在项目窗口左侧的
Project标签页中,右键点击Source Group 1。 - 选择
Add New Item to Group 'Source Group 1'...。 - 在
C/C++文件夹下,选择C File (.c),输入文件名main.c,点击Add。 - 用同样的方法再添加一个
Assembly File (.s),命名为startup_stm32f10x_md.s(如果你的芯片是中等容量的,文件名可能略有不同)。
4 编写简单的 C 代码
双击 main.c 打开它,删除默认内容,然后输入以下代码:
#include "stm32f10x.h" // 包含 STM32F10x 的头文件
// 简单的延时函数
void delay(volatile uint32_t count) {
while(count--);
}
int main(void) {
// 1. 使能 GPIOC 的时钟
RCC->APB2ENR |= RCC_APB2ENR_IOPCEN; // 使能 GPIOC 端口时钟
// 2. 配置 PC13 引脚为推挽输出
// GPIOC_CRH 的第 20-27 位控制 PC13
// 清除原来的设置 (4 bits)
GPIOC->CRH &= ~(0x0F << (4 * (13 - 8)));
// 设置为推挽输出,最大速度 50MHz (0011)
GPIOC->CRH |= (0x03 << (4 * (13 - 8)));
while (1) {
// 3. 点亮 LED (PC13 输出低电平)
GPIOC->BSRR = GPIO_BSRR_BR13; // 将 PC13 置为 0
delay(500000);
// 4. 熄灭 LED (PC13 输出高电平)
GPIOC->BSRR = GPIO_BSRR_BS13; // 将 PC13 置为 1
delay(500000);
}
}
代码解释:
#include "stm32f10x.h":包含芯片寄存器定义的头文件。RCC->APB2ENR |= ...:在 STM32 中,使用任何外设(如 GPIO)前,必须先为其使能时钟。GPIOC->CRH &= ...和GPIOC->CRH |= ...:配置 GPIO 端口的引脚模式,PC13 在CRH寄存器中,我们将其设置为推挽输出模式。GPIOC->BSRR = ...:通过位设置/复位寄存器来控制引脚的电平。BS13位设置为 1,会使 PC13 输出高电平;BR13位设置为 1,会使 PC13 输出低电平。
5 添加文件到项目
- 如果你在创建文件时没有自动添加,可以在
Source Group 1上右键,选择Add Existing Files to Group...,然后将main.c和startup_stm32f10x_md.s添加进来。 startup_stm32f10x_md.s这个文件是 Keil 在你选择芯片时自动添加的,通常在Project窗口的Startup文件夹下,如果没看到,检查一下是否添加到了正确的 Group。
6 配置项目选项
-
在
Project窗口中,右键点击Target 1,选择Options for Target 'Target 1'...(或按快捷键Alt+F7)。 -
Target 选项卡:
Use Microcontroller: 确认芯片型号正确。Crystal: 晶振频率,通常为 8MHz 或 12MHz,根据你的开发板设置。
-
Output 选项卡:
Create Executable: 确保Create HEX File被勾选,这个 HEX 文件是最终要烧录到芯片里的文件。
-
Debug 选项卡:
Use: 选择你的调试器,如果你使用的是板载 ST-Link,选择STLink-Debugger,如果是 J-Link,选择J-Link。- 点击
Settings...,确保Flash Download选项卡中Reset and Run被勾选。
7 编译项目
点击工具栏上的 Build 按钮(一个看起来像 1 的图标,或者按 F7)。
- 如果一切顺利,底部的
Build Output窗口会显示0 Error(s), 0 Warning(s)。 - 如果有错误,根据提示信息修改代码。
8 下载程序到开发板
- 确保你的开发板已通过 USB 连接到电脑,并且驱动已安装。
- 点击工具栏上的 Download 按钮(一个向下的箭头,或者按
F8)。 - Keil 会先编译代码,然后通过调试器将生成的 HEX 文件下载到开发板的 Flash 中。
- 下载成功后,程序会自动开始运行,你应该能看到开发板上的 LED 灯在闪烁!
第三部分:深入理解 Keil 界面与核心功能
1 Keil µVision 界面布局
- 菜单栏:所有功能的入口。
- 工具栏:常用功能的快捷按钮(新建、打开、保存、编译、下载等)。
- 项目管理窗口:左侧区域,显示项目文件结构。
- 代码编辑器窗口:中间区域,用于编写和查看代码。
- 输出窗口:底部区域,显示编译信息、搜索结果等。
2 使用调试器
点击 Start/Stop Debug Session 按钮(像一只虫子的图标,或者按 Ctrl+F5)进入调试模式。
- 进入调试模式后,程序指针会停在
main函数的入口处。 - 你可以点击 Run(F5)全速运行,或者点击 Step Over(F10)单步执行。
3 断点设置与使用
断点是调试的灵魂,它能让程序在指定的代码行暂停。
- 设置断点:在代码编辑器左侧的灰色边栏上,双击你想要暂停的代码行,会出现一个红色的方块。
- 运行到断点:进入调试模式后,按 F5 运行,程序会在断点处暂停。
- 取消断点:再次单击红色方块即可取消。
4 变量监视与内存查看
-
监视窗口:
- 在调试模式下,右键点击代码中的变量,选择
Add "变量名" to Watch window。 - 或者直接在
Watch窗口的Watch 1标签页中输入变量名。 - 程序运行时,你可以实时看到变量值的变化。
- 在调试模式下,右键点击代码中的变量,选择
-
内存窗口:
- 在调试模式下,点击菜单
View->Memory Window。 - 在
Memory 1窗口的地址栏中输入你想查看的内存地址,0x20000000(SRAM 的起始地址)。 - 你可以查看该地址及其后地址的内存内容,这对于调试数组、缓冲区等非常有用。
- 在调试模式下,点击菜单
5 外设寄存器查看
Keil 的一大优势是能直接查看和修改外设寄存器的值。
- 在调试模式下,点击菜单
Peripherals。 - 你会看到所有可用的外设列表,如
GPIOC,RCC,USART1等。 - 点击
GPIOC,会弹出一个窗口,显示 GPIOC 的所有状态寄存器(IDR用于读取输入电平,ODR用于读取输出电平,BSRR用于设置/复位)。 - 你可以直接在这个窗口中修改寄存器的值,并立即看到硬件上的变化(手动将
ODR的第 13 位置 1,LED 灯就会熄灭)。
第四部分:高级技巧与最佳实践
1 使用 CMSIS-DAP / J-Link / ST-Link
- ST-Link: ST 官方调试器,大部分 ST 开发板都板载,Keil 支持得很好,通常即插即用。
- J-Link: SEGGER 公司出品,性能强大,支持广泛,是很多专业开发者的选择。
- CMSIS-DAP: 基于 ARM 官方标准调试协议的调试器,很多开源开发板(如 Nucleo)使用。
在 Options for Target -> Debug 中选择对应的调试器即可,如果找不到,可能需要安装对应的驱动软件(如 J-Link OB)。
2 配置目标选项
- C/C++ 选项卡:
Define: 可以定义宏,DEBUG=1,用于条件编译。Include Paths: 指定头文件的搜索路径,当你把代码分到多个文件夹时,需要在这里添加路径。Misc Controls: 可以传递特殊参数给编译器,-O0(不优化) 方便调试,-O3(最高优化) 用于最终发布。
3 使用 printf 重定向到串口
在调试时,向串口打印信息是最高效的调试手段之一。
- 修改
printf实现:在你的代码中,包含<stdio.h>,并重写fputc函数。
#include "stm32f10x.h"
#include <stdio.h>
// 重定向 printf 到串口1
int fputc(int ch, FILE *f) {
// 假设你的串口1已经初始化好了
while (USART1->SR & USART_SR_TC == 0); // 等待发送完成
USART1->DR = (uint8_t)ch; // 发送一个字节
return ch;
}
// ... 你的 main 函数和其他代码 ...
- 初始化串口:在
main函数开始时,你需要先初始化 USART1,这部分代码相对固定,通常由 STM32CubeMX 生成,或者从网上找现成的代码。
4 代码分块与优化
- 代码分块:将代码按功能模块(如
delay.c,uart.c,gpio.c)分到不同的.c和.h文件中,使项目结构清晰。 - 优化级别:在
C/C++选项卡的Optimization Level中设置。None (-O0):不优化,编译速度快,调试信息最全。Level 1 (-O1)到Level 3 (-O3):优化程度递增,代码运行更快,但可能影响调试。Size (-Os):优化代码大小,适用于 Flash 空间紧张的项目。
5 版本控制集成
Keil 可以直接集成 Git。
- 在
Project窗口中,右键点击项目根目录。 - 选择
Enable Version Control with Git。 - 之后就可以通过右键菜单进行
Commit,Push,Pull等操作,方便团队协作和代码回溯。
第五部分:常见问题与资源
常见问题
-
Q: 编译时提示 "No target selected" 或 "No memory defined"
- A: 在
Options for Target中没有正确选择芯片型号,或者Target选项卡中的Flash和RAM大小不正确,通常选择芯片型号后会自动填充。
- A: 在
-
Q: 下载程序失败,提示 "Flash Download failed"
- A:
- 检查
Debug设置中的调试器是否正确。 - 检查
Flash Download选项卡中是否勾选了Reset and Run。 - 按下开发板上的复位按钮,然后再尝试下载。
- 检查 Boot 引脚是否被设置为从系统存储器启动(通常不是,除非你在烧录 bootloader)。
- 检查
- A:
-
Q: 变量在调试窗口中显示为 "not accessible"
- A: 通常是开启了编译器优化(如
-O1或更高),导致编译器优化掉了这个变量或改变了其生命周期,在C/C++选项卡中将优化级别设为-O0即可。
- A: 通常是开启了编译器优化(如
学习资源
- 官方文档:Keil MDK 自带的帮助文档 (
Help -> Contents) 是最权威的资料。 - ARM 官方网站:ARM Developer,提供 CMSIS 标准和底层架构文档。
- 开发板厂商资源:
- STMicroelectronics: 提供丰富的应用笔记、参考手册和 STM32CubeMX 图形化配置工具。
- NXP: 同样提供大量技术文档和示例代码。
- 视频教程:在 Bilibili、YouTube 上搜索 "Keil MDK 教程" 或 "STM32 Keil 教程",有很多优秀的视频课程。
- 开源项目:在 GitHub 上搜索基于 Keil 的项目,学习别人的代码风格和工程结构。
这份教程涵盖了从入门到进阶的大部分内容,希望能帮助你顺利掌握 Keil MDK for ARM,祝你学习愉快!
