Keil µVision 软件使用指南

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

image-20260306225540579
工程三层结构: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+F7C/C++ 选项卡Include Paths → 添加 .h 所在文件夹

.\User;.\BSP;.\Drivers\Inc

多个路径用英文分号 ; 分隔,使用相对路径。


三、Translate / Build / Rebuild

image-20260306225124420

操作 快捷键 作用 场景
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 烧录

  1. 连接调试器 → 确保 Debug/Utilities 选项卡配置正确
  2. 点击 DownloadF8)→ 等待显示 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