☰
STM32F103开发环境搭建全攻略:Keil MDK、ST-Link驱动与器件包安装指南
2026/10/29 10:12:30 网站建设 项目流程

1. 为什么第一课不是点灯而是搭环境

很多人拿到STM32F103开发板的第一反应是赶紧写个点灯程序跑起来,觉得环境搭建这种"杂活"随便搞搞就行。我带过不少刚入门的同学,十个人里有八个卡在环境上,真正写代码的时间反而不到两成。这个现象很普遍,也很正常——嵌入式开发和纯软件开发最大的区别就在于,你的代码要经过编译、链接、下载、运行四个环节才能看到效果,任何一个环节出问题,你面对的都是一堆看不懂的报错。

所以第00课的核心任务不是教你写代码,而是把"从电脑到芯片"这条链路彻底打通。这条链路包括:PC端的集成开发环境(IDE)、芯片支持包、编译器工具链、下载调试器驱动、以及开发板本身的硬件认知。任何一环缺失,后面的学习都是空中楼阁。

我见过太多人因为环境问题放弃嵌入式的例子。有个同学买了板子三个月,一直卡在"no target connected"这个报错上,最后发现是ST-Link驱动没装对。这种问题在懂的人眼里五分钟解决,在不懂的人手里能耗掉一整个周末。所以这篇文章我会把环境搭建的每个环节拆开讲透,包括为什么这么选、怎么装、装完怎么验证、出问题怎么排查。

STM32F103这颗芯片值得单独说一下。它是ST公司基于ARM Cortex-M3内核的32位微控制器,主频72MHz,片上资源丰富,价格便宜,资料铺天盖地。国内几乎所有嵌入式培训机构的入门课程都选它,不是没有道理的。你把这颗芯片玩明白了,后面换F4、F7、H7系列,甚至换其他厂商的芯片,迁移成本都很低。

这篇文章适合谁看?如果你是电子、自动化、计算机相关专业的学生,或者想转行做嵌入式开发的工程师,又或者只是对单片机感兴趣想自己做个智能小车、鱼缸控制器之类的小项目,那这篇内容就是为你准备的。不需要你有任何STM32基础,但最好有一点C语言基础,知道什么是变量、函数、指针就够了。

2. 开发环境的三件套选型逻辑

2.1 Keil MDK为什么是大多数人的第一选择

嵌入式开发的IDE选择其实不少,Keil MDK、IAR EWARM、STM32CubeIDE、还有用VSCode加各种插件自己搭的。为什么我推荐新手从Keil MDK开始?原因很实际:教程多、坑少、社区活跃。你遇到任何问题,百度一搜,大概率能找到中文的解决方案。IAR虽然编译器优化更强,但正版授权贵,破解版安装麻烦;STM32CubeIDE是ST官方出的免费工具,基于Eclipse,功能全但界面复杂,新手容易被各种配置项搞晕;VSCode方案灵活但需要自己配工具链,对新手来说学习曲线太陡。

Keil MDK的全称是Keil Microcontroller Development Kit,注意不是Keil C51。这两个东西经常被搞混。Keil C51是给8051单片机用的,Keil MDK是给ARM Cortex-M系列用的。你如果搜"keil c251"或者"keil uvision 4 c51",那是另一个产品线,跟STM32没关系。下载的时候认准MDK-ARM版本,目前主流的是MDK 5.x系列,比如5.36、5.38这些版本。

关于版本选择,我的建议是不要追最新版。新版本可能引入一些兼容性问题,而且网上大部分教程是基于5.20到5.30这个区间写的。5.36是个比较稳定的版本,用的人多,遇到问题好搜。安装包大概七八百兆,装完之后还需要单独安装器件支持包(Device Family Pack,简称DFP或Pack),这个后面会详细说。

注意:Keil MDK是商业软件,有代码大小限制的评估版。对于学习用途,评估版的32KB限制其实够用,但如果你要跑大一点的工程,可能需要考虑正版授权或者转向STM32CubeIDE。这个话题比较敏感,我就不展开说了,大家根据自己的实际情况选择。

2.2 ST-Link调试器的角色和驱动问题

ST-Link是ST官方的调试下载器,负责把编译好的程序烧录到芯片里,同时支持在线调试。市面上常见的ST-Link有几种形态:一种是ST官方开发板板载的ST-Link电路,比如Nucleo板子;另一种是独立的USB加密狗形态,淘宝上十几块钱就能买到一个。还有一种是山寨的ST-Link V2,外观是个U盘样子,这种性价比最高,但质量参差不齐。

为什么强调驱动问题?因为ST-Link在Windows上需要安装驱动才能被识别。很多人插上ST-Link,设备管理器里显示一个黄色感叹号,这就是驱动没装好。驱动装好之后,设备管理器里应该能看到"STMicroelectronics STLink dongle"或者类似的条目。如果用的是山寨ST-Link,有时候需要手动指定驱动路径,或者用Zadig工具替换驱动。

除了驱动,还需要装ST-Link Utility或者STM32CubeProgrammer。这两个工具的作用是独立于Keil之外,直接连接芯片进行烧录、读保护、选项字节配置等操作。ST-Link Utility比较老但轻量,STM32CubeProgrammer是新一代工具,功能更全。我建议两个都装上,有时候Keil里下载失败,用独立工具反而能连上,方便排查问题。

2.3 器件支持包到底装了什么

器件支持包(Device Family Pack)是Keil MDK的一个特色机制。Keil本身只是个壳,它不知道STM32F103的寄存器地址、中断向量表、启动文件长什么样。这些东西都在Pack里。你新建工程的时候,Keil会让你选择芯片型号,如果你没装对应的Pack,列表里就找不到STM32F103。

Pack包里包含哪些东西?启动文件(startup_stm32f103xb.s)、外设寄存器定义头文件(stm32f103xb.h)、系统初始化代码(system_stm32f1xx.c)、以及一些示例工程和中间件。这些东西你写代码的时候会直接或间接用到。比如你写GPIOA->ODR = 0x01;,这个GPIOA的定义就是从Pack里的头文件来的。

Pack的安装方式有两种:一种是在Keil里通过Pack Installer在线安装,另一种是去Keil官网下载.pack文件离线安装。在线安装方便但速度慢,尤其是国内网络环境,有时候会卡住。离线安装需要手动下载,但更可靠。如果你搜"stm32f103 pack包下载",能找到很多网盘链接,下载下来双击就能装。

提示:Pack Installer里有时候会显示"offline",这是因为Keil在尝试连接服务器获取Pack列表但失败了。不影响已安装Pack的使用,但如果你想在线安装新的Pack,需要检查网络或者改用离线安装。

3. 从零开始的环境搭建实操

3.1 Keil MDK的安装细节与常见卡点

下载好MDK安装包之后,双击运行。安装路径建议用默认的C:\Keil_v5,不要放在中文路径下,也不要有空格。我见过有人把Keil装在D:\我的软件\单片机开发\Keil这种路径下,结果编译的时候各种找不到文件。嵌入式工具链对路径中的中文和空格支持很差,这是历史遗留问题,别去挑战它。

安装过程中会弹出几个对话框,一个是询问是否安装ULINK驱动,一个是是否安装Pack Installer。ULINK是Keil自家的调试器,如果你不用ULINK可以跳过,但建议还是装上,不占多少空间。Pack Installer一定要装,后面装器件包全靠它。

安装完成后,第一次打开Keil会提示你注册。评估版有32KB代码限制,对于STM32F103来说,简单的点灯、串口、定时器程序都不会超过这个限制。但如果你要跑FreeRTOS或者带网络协议栈的工程,可能就超了。注册的事情大家自己想办法,我不多说了。

还有一个常见问题是Keil的编译器版本。MDK 5.36默认用的是ARM Compiler 5(AC5),但新版本可能默认用AC6。AC5和AC6的语法兼容性有差异,很多老教程的代码在AC6下编译会报错。如果你发现编译报错说某个语法不对,可以检查一下编译器版本。在Options for Target -> Target标签页里,有个ARM Compiler下拉框,可以切换AC5和AC6。如果你搜"keil 如何安装ac5",说明你遇到了这个问题。

3.2 ST-Link驱动的正确安装姿势

ST-Link驱动安装有个坑:如果你先插了ST-Link再装驱动,Windows可能已经给它分配了一个错误的驱动。这时候你需要先在设备管理器里卸载那个设备,勾选"删除驱动程序软件",然后再重新插拔,让系统重新识别。

正确的顺序是:先装驱动,再插ST-Link。驱动可以从ST官网下载,搜"ST-Link driver"就能找到。下载下来是个压缩包,解压后根据你的系统版本(32位还是64位)运行对应的安装程序。装完之后插上ST-Link,设备管理器里应该能看到两个设备:一个是"STMicroelectronics STLink dongle",在通用串行总线设备下面;另一个是"STMicroelectronics STLink Virtual COM Port",在端口下面。第二个是虚拟串口,如果你用ST-Link的串口功能会用到。

如果设备管理器里显示的是"未知设备"或者带黄色感叹号,右键选择"更新驱动程序",然后手动浏览到驱动解压的文件夹。如果还是不行,试试用Zadig工具,选择ST-Link设备,替换成WinUSB驱动。这个方法对山寨ST-Link特别有效。

3.3 器件支持包的离线安装流程

去Keil官网的Pack下载页面,搜索STM32F1系列。你会看到好几个Pack,比如Keil.STM32F1xx_DFP.2.4.0.pack。下载下来之后,双击这个.pack文件,它会自动调用Pack Installer进行安装。安装过程很快,几秒钟到几十秒不等。

装完之后怎么验证?打开Keil,点击Project -> New uVision Project,随便选个路径,然后会弹出器件选择对话框。在搜索框里输入STM32F103,如果能看到STM32F103C8、STM32F103RB这些型号,说明Pack装好了。如果列表是空的,或者搜索不到,说明Pack没装成功,需要重新装。

有时候你会遇到Pack版本冲突的问题。比如你之前装过STM32F1xx_DFP的旧版本,现在装新版本,Keil可能会提示已存在。这时候可以在Pack Installer里先卸载旧版本,再装新版本。Pack Installer的入口在Keil的Pack菜单里,或者工具栏上有个小图标。

4. 开发板硬件认知与最小系统

4.1 STM32F103最小系统板上有哪些东西

最小系统板,顾名思义,就是让STM32F103能跑起来的最少外围电路。一块典型的最小系统板通常包含以下部分:

  • 主控芯片:STM32F103C8T6或者C6T6,LQFP48封装,48个引脚。
  • 晶振电路:8MHz高速晶振(HSE)和32.768kHz低速晶振(LSE)。HSE给系统提供主时钟,LSE给实时时钟(RTC)用。
  • 复位电路:一个按键加一个电容,按下按键芯片复位。
  • 启动模式选择:BOOT0和BOOT1两个跳线帽,决定芯片从Flash启动、从系统存储器启动还是从SRAM启动。
  • 电源电路:5V转3.3V的LDO稳压芯片,比如AMS1117-3.3。
  • 调试接口:SWD接口,通常是4个排针:3.3V、GND、SWDIO、SWCLK。
  • LED指示灯:一个电源指示灯,一个用户LED接在某个GPIO上,通常是PC13。
  • USB接口:有些板子带USB转串口芯片,比如CH340,方便串口通信。

你搜"stm32f103最小系统"或者"stm32f103 5v转3.3v电路",能看到很多原理图。建议你对着原理图把板子上的元件认一遍,知道哪个是晶振、哪个是复位按键、哪个是BOOT跳线。这个认知过程很重要,后面你写代码配置时钟的时候,脑子里要有硬件的样子。

4.2 BOOT跳线的正确设置

BOOT0和BOOT1的组合决定了芯片上电后从哪里开始执行代码。这个知识点很多人忽略,但它是下载程序失败的头号原因之一。

BOOT0BOOT1启动模式用途
0X主Flash启动正常运行模式
10系统存储器启动串口下载模式
11内置SRAM启动调试用,很少用

正常使用ST-Link下载程序时,BOOT0应该接GND(即设置为0)。如果你用串口下载(比如用FlyMcu通过串口烧录),需要把BOOT0接3.3V,下载完再改回GND。我见过有人BOOT0一直接3.3V,结果程序下载进去了但不运行,折腾半天才发现是跳线问题。

注意:有些最小系统板把BOOT0通过一个电阻下拉到GND,默认就是Flash启动,不需要手动跳线。但有些板子需要你自己用跳线帽短接。拿到板子第一件事就是确认BOOT0的状态。

4.3 SWD接口的接线方式

SWD(Serial Wire Debug)是ARM Cortex-M系列常用的调试接口,只需要两根信号线:SWDIO和SWCLK,加上电源和地,一共四根线。相比JTAG的20针接口,SWD简洁得多。

ST-Link和开发板的连接方式:

  • ST-Link的3.3V接开发板的3.3V
  • ST-Link的GND接开发板的GND
  • ST-Link的SWDIO接开发板的SWDIO(通常是PA13)
  • ST-Link的SWCLK接开发板的SWCLK(通常是PA14)

有些ST-Link上标注的是DIO和CLK,对应SWDIO和SWCLK。接线的时候注意不要接反,接反了不会烧芯片,但连不上。如果连接正常,ST-Link上的LED会闪烁或者常亮。

如果你搜"st-link no ulink/me device found"或者"no st-link detected",大概率是接线问题或者驱动问题。先检查线有没有接对,再检查驱动有没有装好,最后检查Keil里的调试器设置有没有选对。

5. 第一个工程的创建与下载验证

5.1 新建工程时容易忽略的选项

打开Keil,Project -> New uVision Project,选一个纯英文路径的文件夹。工程名也建议用英文,比如"test_led"。然后选择芯片型号,搜索STM32F103C8,选中STM32F103C8T6。

接下来会弹出一个"Manage Run-Time Environment"对话框。这个对话框是让你选择要不要自动添加一些软件组件,比如CMSIS的Core和Device Startup。对于新手,我建议至少勾选CMSIS -> CORE和Device -> Startup。这样Keil会自动帮你把启动文件和系统初始化文件加到工程里,省得你手动添加。

但要注意,自动添加的启动文件可能和你实际用的芯片型号不完全匹配。比如STM32F103C8的Flash是64KB,启动文件应该是startup_stm32f103xb.s(xb表示中容量)。如果你选错了,编译可能不报错但运行不正常。所以工程建好之后,检查一下启动文件的名字对不对。

5.2 添加用户代码与编译

工程建好之后,右键Source Group 1,选择Add New Item to Group,添加一个main.c文件。然后在main.c里写一个最简单的程序:

#include "stm32f10x.h" int main(void) { // 使能GPIOC时钟 RCC->APB2ENR |= RCC_APB2ENR_IOPCEN; // 配置PC13为推挽输出,最大速度2MHz GPIOC->CRH &= ~(0x0F << 20); GPIOC->CRH |= (0x02 << 20); while(1) { // 点亮LED(低电平点亮) GPIOC->ODR &= ~GPIO_ODR_ODR13; for(int i = 0; i < 1000000; i++); // 熄灭LED GPIOC->ODR |= GPIO_ODR_ODR13; for(int i = 0; i < 1000000; i++); } }

这段代码直接操作寄存器,不依赖任何库。为什么第一课用寄存器而不是库函数?因为寄存器操作能让你看清楚底层发生了什么。库函数虽然方便,但把细节都封装起来了,新手容易知其然不知其所以然。等你对寄存器有感觉了,再用标准库或者HAL库,会顺畅很多。

编译之前,检查Options for Target里的Output标签页,勾选"Create HEX File"。这样编译后会生成.hex文件,方便用独立工具烧录。然后点击编译按钮,如果一切正常,Build Output窗口会显示"0 Error(s), 0 Warning(s)"。

5.3 下载配置与常见报错处理

点击Options for Target -> Debug标签页,在右上角的下拉框里选择"ST-Link Debugger"。然后点击旁边的Settings按钮,会弹出ST-Link的配置窗口。在Debug标签页里,Port选择SW,Max Clock可以选4MHz或者1.8MHz。如果连接正常,右侧会显示芯片的IDCODE和Device Name。

切换到Flash Download标签页,确认"Download to Flash"被勾选,Programming Algorithm里应该有STM32F10x Medium-density Flash。如果没有,点击Add按钮手动添加。

配置好之后,点击下载按钮(一个向下的箭头图标)。如果一切顺利,Build Output窗口会显示"Programming Done. Verify OK."。如果报错"no st-link detected",检查ST-Link是否插好、驱动是否正常。如果报错"flash download failed - target dll has been cancelled",通常是Flash算法没选对,或者芯片被读保护了。

我遇到过一次"load ... project.axf no st-link detected"的报错,折腾了很久,最后发现是USB线的问题。有些USB线只能充电不能传数据,换一根线就好了。这种问题最坑人,因为软件层面看不出任何异常。

6. 环境搭建后的验证与排查思路

6.1 用ST-Link Utility做独立验证

Keil里下载成功不代表ST-Link和芯片的通信就没问题。有时候Keil的配置有误,但恰好能下载,换一个工程就不行了。所以我建议装一个ST-Link Utility,用它来独立验证连接。

打开ST-Link Utility,点击Target -> Connect。如果连接成功,下方会显示芯片的Flash大小、ID等信息。然后你可以点击Target -> Program & Verify,选择一个.hex文件烧录进去。如果ST-Link Utility能正常连接和烧录,说明硬件链路没问题,Keil那边的问题就是软件配置问题。

ST-Link Utility还能做一件很有用的事:读芯片的选项字节(Option Bytes)。如果你不小心把芯片读保护打开了,Keil下载会失败,但ST-Link Utility可以解除读保护。在Target -> Option Bytes里,把Read Out Protection改成Disabled,然后应用。

6.2 串口打印的验证方法

点灯验证的是GPIO输出,串口验证的是GPIO复用功能和时钟配置。如果你搜"stm32f103 串口打印",能找到很多例程。串口验证的好处是,你可以打印变量值、调试信息,比点灯直观得多。

串口验证的步骤:配置USART1的TX(PA9)和RX(PA10),设置波特率115200,然后在PC端用串口助手接收。如果你用的是ST-Link的虚拟串口,需要在代码里配置USART1,然后把ST-Link的TX/RX接到开发板的RX/TX。注意TX和RX要交叉连接。

串口打印乱码是最常见的问题,原因通常是波特率不对或者时钟配置错误。STM32F103的USART1挂在APB2总线上,时钟是72MHz。如果你配置的波特率是115200,但实际时钟不是72MHz,算出来的分频系数就不对,打印出来就是乱码。检查SystemInit函数里有没有正确配置时钟。

6.3 环境问题的通用排查链路

环境搭建过程中遇到的问题,90%集中在以下几个环节。我按排查顺序列出来,你遇到问题可以按这个顺序检查:

  1. 供电是否正常:开发板上的电源指示灯亮不亮?用万用表量一下3.3V引脚,是不是稳定的3.3V?
  2. ST-Link驱动是否正常:设备管理器里有没有识别到ST-Link?有没有黄色感叹号?
  3. 接线是否正确:SWDIO、SWCLK、GND、3.3V四根线有没有接对?有没有松动?
  4. BOOT跳线是否正确:BOOT0是不是接GND?
  5. Keil调试器配置是否正确:Debug标签页里有没有选ST-Link Debugger?Settings里能不能看到芯片ID?
  6. Flash算法是否正确:Flash Download标签页里有没有添加STM32F10x Medium-density Flash?
  7. 芯片是否被读保护:用ST-Link Utility连接,看看能不能读到芯片信息。如果读不到,可能是读保护开了。

这个排查链路是我自己踩坑总结出来的,按这个顺序走,基本能定位到问题所在。最怕的是跳着排查,一会儿怀疑驱动一会儿怀疑代码,效率很低。

7. 一些过来人的经验之谈

环境搭建这件事,说难不难,说简单也不简单。我见过有人半小时搞定,也见过有人折腾一周。差别不在于智商,而在于有没有人告诉你哪些地方容易踩坑。

第一个经验:不要同时装多个版本的Keil。有些人电脑里装了Keil C51又装了Keil MDK,两个版本会互相干扰。如果你两个都要用,建议装在不同的路径下,或者用虚拟机隔离。我见过Keil C51的安装把MDK的注册表覆盖了,导致MDK打不开的案例。

第二个经验:工程路径不要有中文和空格。这个坑我踩过不止一次。Keil的编译器对中文路径的支持很差,有时候编译报错说找不到文件,你去看文件明明就在那里。把工程放在D:\stm32_projects\这种纯英文路径下,能省很多事。

第三个经验:养成备份工程的习惯。环境搭建好之后,建一个空的工程模板,配置好时钟、GPIO、串口这些基础功能,然后复制一份存起来。以后新建工程直接复制这个模板,改改就能用,不用每次都从头配置。这个习惯能帮你节省大量时间。

第四个经验:遇到报错先看Build Output窗口。很多人遇到报错就慌了,到处问人。其实Keil的报错信息很详细,告诉你哪个文件哪一行出了什么问题。把报错信息复制到搜索引擎里,大概率能找到答案。如果搜不到,把报错信息发到论坛或者群里,别人也能更快帮你定位。

第五个经验:不要迷信教程。网上的教程质量参差不齐,有些是抄来抄去的,里面的配置可能已经过时了。你要学会看官方文档,STM32F103的参考手册(RM0008)和Keil的官方文档是最权威的。虽然英文看起来费劲,但看多了就习惯了,而且能避免被错误教程带偏。

环境搭建只是嵌入式的第一步,后面还有时钟树、中断、定时器、串口、SPI、I2C、ADC、DMA等等一大堆东西要学。但这一步走稳了,后面的路会顺很多。我见过太多人因为环境问题放弃,真的很可惜。希望这篇内容能帮你把这一步走扎实。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询