Keil uVision5 实战入门:30分钟从零点亮第一颗LED
你是不是也曾在嵌入式开发的门口徘徊许久?看着别人轻松烧录程序、调试外设,而自己却被卡在“安装失败”“找不到设备”“编译报错一堆”的怪圈里。别担心,这几乎是每个初学者都经历过的“成长痛”。
今天,我们不讲大道理,也不堆术语,只用最直白的方式带你走完一条真实可用的开发路径——从打开Keil到让STM32上的LED开始闪烁,全程控制在30分钟内。准备好了吗?来吧,动手才是硬道理。
为什么是 Keil uVision5?
市面上的嵌入式IDE不少:IAR、STM32CubeIDE、VSCode + PlatformIO……但如果你刚入门,想快速上手又不想被HAL库和CMake绕晕,Keil uVision5 依然是那个最稳的选择。
它不像某些工具需要配置Python环境、下载十几GB依赖;它也不强制你使用某种抽象层。它是“老派”的,但也正是这份简洁和成熟,让它成了高校实验室、企业原型验证中最常见的身影。
更重要的是——
✅ 图形化界面友好
✅ 芯片支持全面(ST、NXP、GD等主流厂商全覆盖)
✅ 编译器由Arm官方优化,生成代码效率高
✅ 社区资源丰富,百度一搜就有解法
哪怕你现在用的是国产替代MCU,只要兼容Cortex-M内核,Keil照样能跑。
第一步:装好环境,别急着写代码
先确认三件事:
下载并安装 Keil MDK-ARM 5.x 版本(推荐 v5.39 或以上)
官网地址: https://www.keil.com/download/product/注意:选择 “MDK Core + Software Packs” 完整包,避免后续缺组件。
安装对应芯片支持包
打开Keil →Pack Installer→ 搜索你的MCU型号,比如STM32F1
勾选安装:
- STM32F1xx_DFP (Device Family Pack)
- CMSIS-Core(M)
安装完成后重启Keil即可识别具体型号。准备好硬件
- 一块STM32最小系统板(如经典蓝pill:STM32F103C8T6)
- 一个ST-Link V2调试器(几块钱淘宝有售)
- 杜邦线若干,连接SWD接口(VCC、GND、SWCLK、SWDIO)
⚠️ 小贴士:不要图省事直接用USB转TTL串口烧录!那种方式只能用于Bootloader模式,无法调试。我们要的是可断点、可观测变量的真·开发体验。
第二步:新建工程——别跳过这一步!
很多人一开始就栽在这里:直接打开编辑器写代码,结果编译时报一堆“找不到头文件”。
正确做法如下:
Project → New μVision Project- 保存项目为
LED_Blink,路径尽量别带中文 - 弹出窗口中搜索
STM32F103C8→ 选中STMicroelectronics条目 → 确定 - 是否复制启动文件?→选 Yes
- 这会自动生成startup_stm32f103xb.s
- 这个文件太关键了!没有它,单片机根本不知道从哪开始执行
🧠 秘籍:启动文件的作用就像“开机引导”,它设置了堆栈指针、中断向量表,并跳转到main函数。千万别删!
此时左侧Project栏应该长这样:
Target 1 ├── Source Group 1 │ └── startup_stm32f103xb.s接下来,我们加自己的代码。
第三步:写个最简程序,控制GPIO翻转
右键Source Group 1→ Add New Item to Group… → 创建main.c
粘贴以下代码(放心,每一行我都给你解释清楚):
#include "stm32f10x.h" // 核心头文件,定义了所有寄存器地址 // 简单延时函数 void delay(uint32_t count) { while (count--) { __NOP(); // 占位指令,防止编译器优化掉循环 } } int main(void) { // Step 1: 开启GPIOA时钟 RCC->APB2ENR |= RCC_APB2ENR_IOPAEN; // Step 2: 配置PA5为通用推挽输出,最大速度2MHz GPIOA->CRL &= ~(GPIO_CRL_MODE5 | GPIO_CRL_CNF5); // 清除原有设置 GPIOA->CRL |= GPIO_CRL_MODE5_1; // MODE5[1:0] = 10 → 输出模式 GPIOA->CRL &= ~GPIO_CRL_CNF5; // CNF5[1:0] = 00 → 推挽输出 // 主循环:点亮→延时→熄灭→延时 while (1) { GPIOA->BSRR = GPIO_BSRR_BR5; // PA5输出低电平(假设LED共阳) delay(0xFFFFF); GPIOA->BSRR = GPIO_BSRR_BS5; // PA5输出高电平 delay(0xFFFFF); } }📌 关键点解析:
| 行为 | 说明 |
|---|---|
RCC->APB2ENR |= ... | 必须先开启时钟!否则GPIO不能工作 |
GPIOA->CRL | 控制PA0~PA7的工作模式和速度 |
BSRR寄存器 | 原子操作,不怕中断打断,比直接赋值更安全 |
__NOP() | 防止编译器把空循环优化掉 |
💡 提醒:你的LED可能是共阳或共阴接法。如果是共阴(负极接地),那低电平才点亮;共阳则相反。查一下原理图再决定逻辑。
第四步:告诉编译器“去哪找东西”
点击Project → Options for Target 'Target 1',这是新手最容易忽略的关键步骤!
1. Output 选项卡
✔️ 勾选Create HEX File
→ 后续可用于ISP烧录或交付生产
2. C/C++ 选项卡
- 在Define框中输入:
STM32F10X_MD,USE_STDPERIPH_DRIVER解释:
MD表示Medium-density芯片(如103C8),这个宏会影响头文件内部判断 - 在Include Paths添加:
.\Libraries\CMSIS\Device\ST\STM32F10x\Include .\Libraries\STM32F10x_StdPeriph_Driver\inc如果你没放这些库文件,请先从ST官网下载标准外设库(Standard Peripheral Library)
❗注意:路径可以是相对或绝对,但必须真实存在。否则编译时就会报“cannot open source file”
第五步:编译!看那一行绿色的成功提示
按下快捷键F7,或者点工具栏上的 🔁 按钮(Rebuild all target files)
等待几秒后,如果底部 Build 窗口出现:
".\Output\LED_Blink.axf" - 0 Error(s), 0 Warning(s).恭喜你!代码成功编译成可执行映像了。
同时你会在项目目录下的Output文件夹看到:
-.axf:调试用的映像文件(含符号信息)
-.hex:Intel HEX格式,可用于烧录
-.bin:纯二进制镜像
第六步:连上板子,下载程序
用杜邦线将 ST-Link 与目标板连接:
ST-Link → STM32板 SWCLK → SWCLK SWDIO → SWDIO GND → GND 3.3V (可选) → VCC(若板子无独立供电)给目标板通电(可通过USB或外部电源)
回到Keil,点击
Flash → Download(或按 F8)
正常流程应该是:
Erase Complete Program Complete Verify OK如果弹出错误:“No target connected”?
👉 先检查接线顺序是否正确,尤其是GND有没有接牢
👉 再确认目标板是否供电正常(可以用万用表测3.3V引脚)
👉 最后尝试按下复位按钮再下载
✅ 高级技巧:在Options → Debug → Settings里启用
Run to main(),下次调试时自动跳过启动代码,直接停在main函数开头,省时又直观。
常见坑点 & 解决方案(亲测有效)
| 问题现象 | 可能原因 | 快速解决方法 |
|---|---|---|
| 编译报错 “undefined identifier ‘GPIOA’” | 头文件未包含或宏未定义 | 检查Options → C/C++ → Define和Include Paths |
| 下载失败,“Could not stop CPU” | 芯片处于低功耗模式或死循环 | 断电重连,或短接NRST与GND强制复位 |
| LED完全不亮 | 引脚配错 / 极性反了 / 硬件损坏 | 改成PA0试试?很多板子上PA5没焊LED |
| 程序运行几秒就卡住 | 堆栈溢出或中断未处理 | 检查startup_stm32f103xb.s中 Stack_Size 设置,默认0x00000400通常够用 |
工程管理小建议:让你的项目更专业
虽然我们现在只是做个LED实验,但养成好习惯很重要:
分目录管理源码:
Project/ ├── Core/ │ ├── main.c │ └── system_stm32f10x.c ├── Drivers/ │ └── stm32f10x_gpio.c ├── Libraries/ │ ├── CMSIS/ │ └── StdPeriph_Driver/ └── Output/ └── *.hex, *.axf纳入Git版本控制:
- 提交
.uvprojx(XML结构,适合diff) 忽略
.uvoptx和Output/目录(用户个性化设置)统一编译器版本:
- 团队协作时建议固定使用 Arm Compiler 5 或 AC6,避免因编译差异导致行为不一致
总结:你已经跨过了最重要的门槛
回顾一下,这30分钟我们都做了什么?
✅ 安装Keil并配置芯片支持
✅ 新建工程,导入启动文件
✅ 编写裸机代码直接操作寄存器
✅ 配置编译选项,生成HEX文件
✅ 使用ST-Link下载程序并验证运行
你不需要懂RTOS、不用会FreeRTOS调度,甚至不需要知道什么叫HAL库——你已经掌握了嵌入式开发最本质的能力:让代码真正跑在硬件上。
未来你可以继续深入:
- 加入SysTick实现精准延时
- 用USART打印调试信息
- 配合逻辑分析仪观察信号时序
- 移植轻量级操作系统
但今天这一小步,是你成为嵌入式工程师的第一块基石。
如果你在实操过程中遇到任何问题——
接线不对?编译报错?LED就是不闪?
欢迎留言交流,我会一一回复。毕竟,每一个能点亮LED的人,都曾在这盏灯前反复试过几十次。
技术关键词:Keil uVision5、STM32、嵌入式开发入门、MDK、SWD下载、GPIO寄存器操作、HEX文件生成、ST-Link烧录、裸机编程、启动文件、Arm Compiler