news 2026/2/2 5:10:40

新手教程:Keil uVision5下载并运行第一个STM32程序

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
新手教程:Keil uVision5下载并运行第一个STM32程序

从零开始点亮第一颗LED:手把手带你跑通STM32开发全流程

你有没有过这样的经历?买了一块“蓝丸板”STM32最小系统板,插上电脑却完全不知道从哪下手。Keil、烧录器、寄存器、时钟配置……这些术语像一座大山挡在面前。

别担心,每个嵌入式工程师都是从这一刻开始的。今天我们就抛开复杂的理论堆砌,用最接地气的方式,一步步带你完成从安装Keil到让LED真正闪烁起来的全过程。不需要任何基础,只要跟着做,就能看到那颗小小的灯亮起——这是属于你的“Hello World”。


为什么选Keil uVision5作为入门工具?

市面上能开发STM32的IDE不少:STM32CubeIDE、IAR、PlatformIO、VS Code + Cortex-Debug……但对新手来说,Keil uVision5依然是最稳的选择

它不像某些新工具那样动不动报错崩溃,也不需要你先配一堆插件和环境变量。它的界面虽然老派,但逻辑清晰,调试功能成熟,尤其适合初学者建立完整的开发流程认知。

更重要的是——官方提供免费版本(MDK-Lite),虽然限制代码大小为4KB,但对于点个LED、读个按键这类基础实验绰绰有余。

✅ 小贴士:你现在完全可以下载使用这个免费版来学习,等以后做复杂项目再考虑授权问题。


准备工作:软硬件清单一目了然

在动手前,先把“弹药”准备好:

硬件部分

名称建议型号
开发板STM32F103C8T6 最小系统板(俗称“蓝丸板”)
下载器ST-Link V2 或兼容仿真器
连接线2.54mm排线(建议杜邦线公对母)
LED电路板载PC13引脚通常自带LED,否则外接LED+220Ω限流电阻

🔍 注意:很多“蓝丸板”的PC13默认就接了一个LED,共阴极连接,即低电平点亮。这点很关键,写代码时别搞反了!

软件部分

  1. Keil MDK-ARM 安装包(官网注册后可下载)
  2. ST-Link驱动(一般Keil自带或随下载器附带)
  3. STM32F1系列支持包(DFP),可通过Pack Installer在线安装

第一步:安装Keil并添加芯片支持

1. 下载与安装

前往 Arm Keil官网 注册账号,下载MDK-Core安装包。

安装过程非常标准:
- 双击运行 → 同意协议 → 选择路径(建议不要带中文)→ 等待安装完成。
- 安装过程中会提示是否安装“ULINK”驱动,可以跳过;但记得勾选“Install ST-Link drivers”。

安装完成后打开uVision5,你会看到一个干净的主界面。

2. 安装STM32F1支持包

点击菜单栏Pack Installer图标(蓝色拼图标志),进入组件管理器。

在左侧搜索框输入STM32F1,找到:

STMicroelectronics :: STM32F1 Series Device Family Pack

点击右侧的Install按钮,等待下载安装完毕。

✅ 成功后,在新建工程时就能选择 STM32F103C8T6 了。


第二步:创建第一个工程模板

现在我们来创建一个专属于STM32F103C8T6的基础工程。

1. 新建项目

菜单 → Project → New µVision Project
保存路径不要有中文或空格,例如:D:\stm32_project\led_blink

接下来会让你选择目标芯片。在搜索框中输入STM32F103C8,选中对应的型号(注意是Medium-density设备)。

⚠️ 关键点:这里选对芯片非常重要!如果选错,启动文件和内存映射都会出问题。

2. 添加启动文件

Keil会自动弹出对话框,询问是否添加启动文件(Startup Code)。一定要勾选“Copy STM32F1xx…” 并确认

这个.s文件是程序运行的第一站,负责初始化堆栈、中断向量表,并最终跳转到main()函数。

此时项目结构大致如下:

Target 1 ├── Startup (startup_stm32f10x_md.s) └── Source Group 1 └── (待添加 main.c)

3. 创建 main.c 文件

右键Source Group 1→ Add New Item to Group…

类型选择C File (.c),命名为main.c,然后把下面这段代码粘进去。


核心代码解析:寄存器级操作到底发生了什么?

#include "stm32f10x.h" #include "system_stm32f10x.h" void Delay_ms(uint32_t nTime) { uint32_t i, j; for (i = 0; i < nTime; i++) for (j = 0; j < 8000; j++); } int main(void) { SystemInit(); // 初始化系统时钟至72MHz RCC->APB2ENR |= RCC_APB2ENR_IOPCEN; // 使能GPIOC时钟 GPIOC->CRH &= ~GPIO_CRH_MODE13; // 清除模式位 GPIOC->CRH |= GPIO_CRH_MODE13_0; // 输出速率10MHz GPIOC->CRH &= ~GPIO_CRH_CNF13; // 推挽输出模式 while (1) { GPIOC->BSRR = GPIO_BSRR_BR13; // PC13 = 0,点亮LED Delay_ms(500); GPIOC->BSRR = GPIO_BSRR_BS13; // PC13 = 1,熄灭LED Delay_ms(500); } }

别被这堆寄存器吓到,我们一行行拆解:

🧩SystemInit()—— 系统时钟初始化

这函数来自system_stm32f10x.c,作用是将主频设置为72MHz(基于外部8MHz晶振倍频)。如果不调用它,默认可能只有内部8MHz RC振荡器,导致延时不准确。

🧩RCC->APB2ENR |= RCC_APB2ENR_IOPCEN

这是开启GPIOC端口的电源开关。STM32采用“按需供电”机制,未使能时钟的外设无法访问其寄存器。GPIOC属于APB2总线,所以要操作APB2ENR寄存器。

💡 类比理解:就像家里装修,即使插座装好了,不推闸也没电。

🧩 配置PC13工作模式:CRH寄存器详解

GPIO端口有两个控制寄存器:
- CRL:控制引脚0~7
- CRH:控制引脚8~15

我们要配置的是PC13,所以操作CRH。

位段功能
MODE13[1:0]输出模式:00=输入,01=最大10MHz,11=最大50MHz
CNF13[1:0]模式功能:00=通用推挽输出,01=通用开漏输出等

我们的配置是:

GPIOC->CRH &= ~GPIO_CRH_MODE13; // 先清零原有设置 GPIOC->CRH |= GPIO_CRH_MODE13_0; // 设置为10MHz输出 GPIOC->CRH &= ~GPIO_CRH_CNF13; // 设为推挽输出

🧩 使用BSRR实现原子操作

为什么不直接写GPIOC->ODR |= (1<<13)?因为这种“读-改-写”操作不是原子的,可能被中断打断。

而BSRR寄存器提供了安全写法:
-BS13:置位第13位(高电平)
-BR13:复位第13位(低电平)

这样就能确保一次完成电平切换,更可靠。


编译与下载:让程序真正跑起来

1. 配置项目选项

右键项目名 → Options for Target → 弹出配置窗口。

【Output】标签页
  • ✔️ Create HEX File:生成HEX文件便于验证
  • Output Name 可自定义
【Debug】标签页
  • Select: ST-Link Debugger
  • Settings → Connect: SWD, Full Speed
【Utilities】标签页
  • ✔️ Use Debug Driver
  • 在下方Flash Download中点击“Add” → 选择对应算法(如STM32F10x Medium Density)

✅ 如果没看到可用算法,说明DFP没装好,请返回第一步检查。

2. 物理连接开发板

使用4根线连接ST-Link与蓝丸板:
| ST-Link | 开发板 | 功能 |
|--------|-------|------|
| SWCLK | SWCLK | 时钟线 |
| SWDIO | SWDIO | 数据线 |
| GND | GND | 地线 |
| 3.3V | 3.3V | 供电(可选,若由其他源供电则不接) |

❗ 注意:有些劣质下载器线序是反的!务必对照丝印确认,否则可能烧毁芯片。

3. 编译 & 下载

点击顶部按钮:
1.Rebuild all target files(锤子图标)→ 编译整个工程
2. 若无错误,点击Download(向下箭头图标)→ 烧录程序到Flash
3. 下载成功后,按下复位键或断电重上电,观察LED是否开始闪烁!


常见问题排查指南(亲测有效)

现象原因分析解决方案
编译报错:“cannot open source input file ‘stm32f10x.h’”头文件路径未包含在Options → C/C++ → Include Paths中手动添加头文件目录
下载失败:“No target connected”① 接线错误 ② 电源异常 ③ SWD冲突检查SWDIO/SWCLK是否接反;确认NRST是否悬空或接地;排除PA13/PA14被占用情况
LED常亮/常灭极性判断错误查看原理图:多数蓝丸板PC13是低电平点亮,若接反则修改代码高低电平顺序
闪得飞快或极慢延时不准确保调用了SystemInit(),且外部晶振正常工作(8MHz)
修改代码后重新下载无效Flash未擦除在Utilities中勾选“Update Target before Debugging”或手动执行Erase

写在最后:这不是终点,而是起点

当你第一次亲眼看到那个微弱的LED按照你的指令规律闪烁时,那种成就感是难以言喻的。这不是简单的亮灭,这是你第一次用自己的代码操控了物理世界

也许你现在还不太明白RCC时钟树是怎么分频的,也不清楚NVIC中断优先级怎么分配,但这没关系。每一个高手都曾坐在桌前盯着一块不会闪的板子发愁。

下一步你可以尝试:
- 把延时换成SysTick定时器,实现精准计时;
- 用STM32CubeMX生成初始化代码,对比看看差异;
- 给另一个引脚接个按键,实现按下亮、松开灭;
- 串口打印“Hello STM32”,迈出通信第一步。

记住一句话:所有伟大的系统,都始于一个能闪烁的LED

如果你在实践过程中遇到了坑,欢迎留言交流。我们一起把这条路走得更稳、更远。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/2/1 14:08:38

Switch大气层系统完整实战手册:快速解锁游戏新境界

Switch大气层系统完整实战手册&#xff1a;快速解锁游戏新境界 【免费下载链接】Atmosphere-stable 大气层整合包系统稳定版 项目地址: https://gitcode.com/gh_mirrors/at/Atmosphere-stable 想要彻底释放Switch的游戏潜能吗&#xff1f;Switch大气层系统为你打开了一扇…

作者头像 李华
网站建设 2026/1/17 6:17:10

使用pip和conda混合安装PyTorch GPU的最佳实践

使用 pip 和 conda 混合安装 PyTorch GPU 的最佳实践 在深度学习项目中&#xff0c;一个稳定、可复现且能充分发挥硬件性能的开发环境&#xff0c;往往决定了从原型到落地的速度。尽管 Python 生态繁荣&#xff0c;但依赖管理依然是许多开发者踩坑最多的环节之一——尤其是当引…

作者头像 李华
网站建设 2026/2/1 13:39:26

中山大学LaTeX论文模板:告别格式焦虑,专注内容创作

还记得那个深夜吗&#xff1f;你在Word里反复调整页边距&#xff0c;参考文献编号突然乱套&#xff0c;图片位置又跑偏了……这样的经历&#xff0c;我猜你一定不陌生。今天&#xff0c;我要和你分享一个能彻底解决这些烦恼的"神器"——中山大学LaTeX论文模板。 【免…

作者头像 李华
网站建设 2026/2/1 9:45:02

AMD Ryzen处理器精准调优:SMUDebugTool深度体验指南

AMD Ryzen处理器精准调优&#xff1a;SMUDebugTool深度体验指南 【免费下载链接】SMUDebugTool A dedicated tool to help write/read various parameters of Ryzen-based systems, such as manual overclock, SMU, PCI, CPUID, MSR and Power Table. 项目地址: https://gitc…

作者头像 李华
网站建设 2026/1/3 12:57:31

如何在Miniconda环境中同时使用PyTorch和TensorFlow

如何在 Miniconda 环境中高效管理 PyTorch 与 TensorFlow 在当今 AI 开发实践中&#xff0c;一个开发者很可能上午还在调试基于 PyTorch 的论文复现代码&#xff0c;下午就要把模型集成进公司用 TensorFlow 构建的生产系统。这种“双框架并行”的需求早已不是特例&#xff0c;…

作者头像 李华
网站建设 2026/2/2 1:33:14

城通网盘限速终结者:一键获取高速直连下载地址全攻略

城通网盘限速终结者&#xff1a;一键获取高速直连下载地址全攻略 【免费下载链接】ctfileGet 获取城通网盘一次性直连地址 项目地址: https://gitcode.com/gh_mirrors/ct/ctfileGet 还在为城通网盘的下载限速而抓狂吗&#xff1f;每次看到那缓慢爬升的进度条都让人无比焦…

作者头像 李华