Keil µVision 软件使用指南
- 嵌入式开发
- 12小时前
- 6热度
- 0评论
Keil µVision 软件使用指南
Keil µVision 是 ARM 公司旗下的嵌入式集成开发环境(IDE),是 51 单片机和 ARM Cortex-M 开发中最主流的工具。
| 版本 | 适用芯片 | 编译器 |
|---|---|---|
| Keil C51 | STC8/STC15/AT89C51 等 51 系列 | C51 编译器 |
| Keil MDK | STM32/GD32/NXP 等 ARM Cortex-M | ARMCC / ARM Compiler 6 |
核心功能: 代码编辑、工程管理、一键编译生成 HEX/BIN、软件仿真 / 硬件在线调试、外设模拟。
一、工程结构:Target / Group / File

工程三层结构:Target(编译配置)→ Group(逻辑分组)→ File(源文件)
📁 Target 1 ← 编译配置(芯片型号、编译选项等)
📁 Source Group 1 ← 逻辑文件分组("虚拟文件夹")
📄 main.c ← 源文件
📄 delay.c
📁 Drivers
📄 gpio.c
- Target = 一套完整的编译配置(芯片、优化等级、输出格式等)
- Group = 逻辑分组,组织源文件用的,不对应真实文件夹
- 可以建多个 Target(如 Debug / Release),通过工具栏下拉切换,不用重复建工程
- Group 可右键重命名、新增,只有加入 Group 的
.c文件才会被编译
Target 和 Source Group 一样是 Keil 工程里的逻辑配置单元,不是硬盘上的文件,不对应真实目录,只组织编译文件,只存在于.uvproj/.uvprojx 工程文件中
二、添加 .c 文件和 .h 文件
添加 .c 文件
右键 Group → Add Existing Files to Group... → 选 .c 文件 → Add
添加 .h 头文件
头文件不加入 Group! 通过配置搜索路径让编译器自动找到:
Alt+F7 → C/C++ 选项卡 → Include Paths → 添加 .h 所在文件夹
.\User;.\BSP;.\Drivers\Inc
多个路径用英文分号 ; 分隔,使用相对路径。
三、Translate / Build / Rebuild

| 操作 | 快捷键 | 作用 | 场景 |
|---|---|---|---|
| Translate | Ctrl+F7 |
只编译当前文件,不链接 | 快速查语法错误 |
| Build | F7 |
增量编译(只编译改过的)+ 链接 | 日常首选 |
| Rebuild | — | 全部重新编译 + 链接 | 改了配置/头文件/优化等级后用 |
编译输出解读:Code / RO-data / RW-data / ZI-data
编译成功后 Build Output 窗口会显示这样一行:
Program Size: Code=2048 RO-data=320 RW-data=16 ZI-data=1024
这四个数字分别代表程序里不同类型的数据占了多少字节:
| 段名 | 全称 | 什么东西会算进来 | 举例 |
|---|---|---|---|
| Code | 代码段 | 写的所有函数编译后的机器指令 | main()、LED_Init()、中断函数 |
| RO-data | Read-Only data | 只读的常量数据 | const int x = 10;、字符串 "Hello" |
| RW-data | Read-Write data | 有初始值的全局/静态变量 | int count = 100;、static char flag = 1; |
| ZI-data | Zero-Init data | 没给初始值(或 = 0)的全局/静态变量 | int buffer[256];、static int sum; |
它们分别存在哪?
| 段 | 烧录时存在 Flash 里? | 运行时占 RAM? | 说明 |
|---|---|---|---|
| Code | ✅ | ❌ | CPU 直接从 Flash 读指令执行 |
| RO-data | ✅ | ❌ | 常量也放 Flash,运行时不需要改 |
| RW-data | ✅ | ✅ | 初始值存 Flash,上电时拷贝到 RAM 才能读写 |
| ZI-data | ❌ | ✅ | 不需要存 Flash(反正都是 0),上电时 RAM 里直接清零 |
所以最终占用的计算:
| 存储区 | 计算公式 | 为什么 |
|---|---|---|
| Flash 占用 | Code + RO-data + RW-data | 代码 + 常量 + 变量初始值,都要烧进去 |
| RAM 占用 | RW-data + ZI-data | 有初始值的变量 + 清零的变量,都要在 RAM 里分配空间 |
举例: 上面的输出 Code=2048 RO-data=320 RW-data=16 ZI-data=1024
- Flash 占用 = 2048 + 320 + 16 = 2384 字节
- RAM 占用 = 16 + 1024 = 1040 字节
如果芯片是 STM32F103C8(64KB Flash / 20KB RAM),那就是 Flash 用了 3.6%,RAM 用了 5.1%,还很充裕。
想减小 Flash? 降 Code 和 RO-data → 精简函数、减少字符串常量、开 -Os 优化。
想减小 RAM? 降 ZI-data → 减小数组和缓冲区大小、用 const 把变量赶去 Flash。
四、关键配置与烧录调试
4.1 配置备忘(Alt+F7)
| 选项卡 | 配置项 | 说明 |
|---|---|---|
| Output | Create HEX File | 必须勾选,否则没有 .hex |
| Output | Browse Information | 勾选后 F12 可跳转定义 |
| C/C++ | Define | 全局宏定义,逗号分隔 |
| C/C++ | Include Paths | 头文件搜索路径 |
| Target | Use MicroLIB | 用 printf 时建议勾选,否则可能卡死 |
| Debug | Use Simulator / ST-Link... | 选仿真还是硬件调试 |
4.2 烧录
- 连接调试器 → 确保 Debug/Utilities 选项卡配置正确
- 点击 Download(
F8)→ 等待显示Verify OK
51 单片机通常用 STC-ISP 等工具烧录 .hex 文件,不通过 Keil 直接下载。
4.3 调试操作
Ctrl + F5 进入/退出调试模式。常用操作:
| 快捷键 | 功能 |
|---|---|
F5 |
全速运行 |
F9 |
设置/取消断点 |
F10 |
单步跳过(Step Over) |
F11 |
单步进入(Step Into) |
Ctrl + F11 |
跳出函数(Step Out) |
Ctrl + F10 |
运行到光标 |
常用调试窗口:Watch(监视变量)、Memory(查看内存)、Peripherals(查看外设寄存器)、Serial Window(printf 输出)。
4.4 printf 重定向
嵌入式中 printf 需要手动重定向,最常见方式——重定向到 UART:
#include <stdio.h>
int fputc(int ch, FILE *f) {
while (USART_GetFlagStatus(USART1, USART_FLAG_TXE) == RESET);
USART_SendData(USART1, (uint8_t)ch);
return ch;
}
注意: 使用 printf 时必须在 Target 选项卡中勾选 Use MicroLIB,否则程序会卡死。
五、常见问题速查
| 问题 | 解决 |
|---|---|
cannot open source input file "xxx.h" |
Include Paths 没加对应路径 |
Undefined symbol xxx(L6218E) |
.c 文件没加入 Group |
| 编译成功但没有 .hex | Output → 勾选 Create HEX File |
| 用 printf 程序卡死 | Target → 勾选 Use MicroLIB |
变量显示 <not in scope> |
降低优化等级 |
| 中文乱码 | Edit → Configuration → UTF-8 |