刚开始学习 STM32 的时候,很多小伙伴满怀热情买好了各种设备,但很快就遇到了第一个拦路虎——如何将写好的代码烧进去这个黑乎乎的芯片~
STM32 的烧录方式多样且灵活,可以根据实际需求选择适合的方式来将程序烧录到芯片中。本文将介绍几种常见的 STM32 烧录方式,包括串口下载、 ST-Link V2 下载、 ST-LINK Utility 下载、 JLink 下载、 STVP 下载,保姆级教程,初学者福音。
五种方式不知道选哪种?直接看总结。
懒得找驱动安装包、软件安装包?我都给你提供啦。
通过深入了解这些烧录方式,相信大家将能够更好地理解 STM32 的烧录过程,选择合适的方式进行开发和调试。
## 0. 前置阅读
本文首发 **良许嵌入式网** :https://www.lxlinux.net/e/ ,欢迎关注!
本文所涉及的源码及安装包如下(由于平台限制,请点击以下链接阅读原文下载):
https://www.lxlinux.net/e/stm32/five-ways-to-flash-program-to-stm32.html
如果不知道如何搭建 STM32 编程环境,不知道如何烧录 STM32 代码,可以阅读这篇文章:
https://www.lxlinux.net/e/stm32/stm32-quick-start-for-beginner.html
新手小白如果连 MDK 的使用都不熟悉,那么可以通过下文先熟悉一下 MDK 的使用:
https://www.lxlinux.net/e/stm32/mdk-development-tool-tutorial.html
文中所使用的芯片是 STM32F103C8T6 ,配套了一个工程模板,如果你需要自己搭建一个工程模板,可以参考下文:
https://www.lxlinux.net/e/stm32/create-stm32-hal-project-template.html
## 1. 安装包及驱动准备
- **安装包准备**
**1. MDK5安装包**
**2. 芯片固件包**
**3. 串口烧录工具(FlyMcu)**
**4. ST-Link Utility**
**5. STVP**
- **驱动准备**
**1. CH340驱动**
**2. ST-Link驱动**
**3. JLink驱动**
- **示例代码**
**STM32F103C8T6模板工程**
## 2. 串口下载
串口下载是我初学时常用的下载方式,现在看有些不如 ST-Link 方便。 使用 ST-Link 基本可以实现一键下载程序,而串口需要反复拔插跳线帽,而且还需要单独的程序员,比较麻烦。
- Need: CH340 USB 转 TTL 模块
这种设备主要作用是用来调试或下载程序。价格也很便宜,普遍 5~8 元。常见的有以下两种:
![](https://pic.imgdb.cn/item/6523c525c458853aef551a73.jpg)
![](https://pic.imgdb.cn/item/6523c54cc458853aef5520e3.jpg)
个人更推荐下面一款,因为它可以切换 VCC 输出电压,在对一些传感器进行独立测试的时候会比较方便。不过反正也不贵,多买几个想怎么用就怎么用。
### 2.1 CH340驱动安装
![](https://pic.imgdb.cn/item/65225398c458853aefce3083.jpg)
![](https://pic.imgdb.cn/item/652253c1c458853aefce48b6.jpg)
![](https://pic.imgdb.cn/item/652254d2c458853aefceed24.jpg)
### 2.2 FlyMcu安装
串口下载工具有很多,这里推荐 FlyMcu 。
FlyMcu 是一款好用的 STM32 烧录程序软件,对于专业的单片机开发者来说应该非常适用,软件可以广泛地应用于电路编程和应用编程领域,支持进行编程、校验、读器件信息。
这款工具是国产的,大家如果需要最新版的,可以去它们的官网下载:
http://www.mcuisp.com/
当然,用我提供的也行,反正也是他们官网下载的。
![](https://pic.imgdb.cn/item/65366ce3c458853aefc6f274.png)
![](https://pic.imgdb.cn/item/65366d38c458853aefc81d6c.png)
![](https://pic.imgdb.cn/item/65366d52c458853aefc877e8.png)
下载好后解压,双击 .exe 文件即可打开,无需安装。
### 2.3 硬件连线
在下载程序之前,请先接好线。接线图如下图所示:
![](https://pic.imgdb.cn/item/6523b65fc458853aef4ec78c.jpg)
电源接线没什么好说的,主要是串口这边,一定要注意**交叉接线**,也就是 CH340 转 TLL 工具的 TX 要接板子的 RX ,CH340 转 TLL 工具的 RX 要接板子的 TX ,千万不要接错,否则就不能烧进去!
开发板上的 PA9 是 TX ,PA10 是 RX ,请按上一段提到的交叉接线接好线。
### 2.4 程序下载
打开 FlyMcu 。如果你们使用的是我上面推荐的 STM32F103C8T6 核心板,那么请下载 `1. 安装包及驱动准备` 我提供的模板工程,如下操作:
![](https://pic.imgdb.cn/item/6523b9bac458853aef4fa615.jpg)
接下来,将板子上的 BOOT0 跳线帽接到 1 ,BOOT1 路线帽维持在 0 ,如下图所示:
![](https://pic.imgdb.cn/item/6523ba96c458853aef5090b9.jpg)
为什么要这么操作呢?
这两个跳线帽是用来调整 BOOT0 和 BOOT1 的状态。跳线帽接到 1 就是高电平,接到 0 就是低电平。
BOOT0 和 BOOT1 是用于设置 STM32 的启动方式的:
| BOOT0 | BOOT1 | 启动模式 | 说明 |
| ----- | ----- | -------------- | --------------------------------- |
| 0 | X | 用户闪存存储器 | 用户闪存存储器,也就是 flash 启动 |
| 1 | 0 | 系统存储器 | 系统存储器,用于串口下载 |
| 1 | 1 | SRAM启动 | SRAM启动,用于在SRAM中调试代码 |
这里是用 USB 下载, 也就是串口下载,所以选择表中的第二个方式也就是 **BOOT0 选择 1, BOOT1 选择 0** 。
![](https://pic.imgdb.cn/item/6523bc5bc458853aef50e5d3.jpg)
然后你就可以点击软件上的 开始编程 按钮,但你会发现,右边一直处于连接状态。这个时候,只有你按一下板子上的 reset 按键(板子上唯一的一个按键),它就开始往下走了。
![](https://pic.imgdb.cn/item/6523bcdac458853aef514a1c.jpg)
**下载后记得把 BOOT0 的跳线冒跳回 0 端**,BOOT0 和 BOOT1 都为 0 ,这样程序就从 flash 区启动,再按一下 reset 按键板子就开始运行烧录进去的代码了。
## 3. ST-Link V2下载
ST-Link V2 是我现在最常用的下载方式,也是我最推荐的。 ST-Link V2 是 STM8 、 STM32 系列单片机的在线仿真器和下载器。 ST-Link 出生就带有两种接口模式: SWIM 接口模式( STM8 ), SWD 接口模式( STM32 )。
- Need: ST-Link V2 下载器
ST-Link 是一种用于 STM32 微控制器的调试和编程工具,它可以通过 SWD 或 JTAG 接口与开发板进行通信。一般也很便宜,七八元左右。
![](https://pic.imgdb.cn/item/65222a41c458853aefb2ce8a.jpg)
### 3.1 ST-Link驱动安装
![](https://pic.imgdb.cn/item/652255dac458853aefcf2b43.jpg)
![](https://pic.imgdb.cn/item/65225692c458853aefd01a3d.jpg)
![](https://pic.imgdb.cn/item/652256bdc458853aefd024c7.jpg)
![](https://pic.imgdb.cn/item/65225752c458853aefd04139.jpg)
![](https://pic.imgdb.cn/item/65225784c458853aefd0489f.jpg)
![](https://pic.imgdb.cn/item/652257bec458853aefd04fd2.jpg)
### 3.2 安装MDK5
MDK5 是由 Keil 公司发布的一款嵌入式软件开发环境,我们平时在进行 STM32 开发的时候,基本上都是在这个软件上进行。
MDK5 可以在它们的官网上下载,网址如下:
https://www.keil.com/demo/eval/arm.htm#/DOWNLOAD
![](https://pic.imgdb.cn/item/652231eec458853aefb6afc0.jpg)
当前最新版本是 MDK538A ,但新版并不意味着最好,可能会有一些奇奇怪怪的问题,也可能不稳定。
推荐大家使用 MDK534,也是我目前所使用的版本,至今未出过什么问题。安装包已经在`1. 安装包及驱动准备` 为大家提供了,接下来我就手把手教大家在你们的电脑上安装 MDK5 。
双击我给大家提供的安装包后,会出现以下界面,大家跟着我的图片操作即可:
![](https://pic.imgdb.cn/item/652232aac458853aefb6ec57.jpg)
![](https://pic.imgdb.cn/item/652232d5c458853aefb71900.jpg)
![](https://pic.imgdb.cn/item/65223385c458853aefb77dc9.jpg)
![](https://pic.imgdb.cn/item/65223417c458853aefb7ab0b.jpg)
![](https://pic.imgdb.cn/item/6523c6c8c458853aef55a550.jpg)
![](https://pic.imgdb.cn/item/6523c715c458853aef55b572.jpg)
![](https://pic.imgdb.cn/item/6523c7b2c458853aef55cb68.jpg)
![](https://pic.imgdb.cn/item/6523c818c458853aef55de5b.jpg)
![](https://pic.imgdb.cn/item/6523c8b4c458853aef563f06.jpg)
到此为止,MDK5 就安装完成了。
但是,我给你们提供的安装包是官网下载的正版版本,试用几天后就要收费了。破解的方法网络上有一大堆,这里我就不讲了,我也怕律师函。
接下来就要安装固件包了。什么是固件包呢?由于 ST 公司生产了非常多的芯片,每颗芯片所需要的支持文件都不一样,这些文件组合起来就是固件包。
但有这么多芯片,他们不可能把所有的固件包都集成在 MDK5 里,否则 MDK5 的安装包将变得超级无敌巨大,很占空间也没必要。比较好的解决方案就是你需要用到什么芯片,就安装对应的固件包就可以了。
固件包也是在官网上可以下载到,网址如下:
https://www.keil.arm.com/packs/
![](https://pic.imgdb.cn/item/65223ba2c458853aefbeaa10.jpg)
由于我们使用的板子是 STM32F103C8T6 ,属于 F1 系列,所以在搜索框里搜索 STM32F1 即可。如果大家使用的是其它系列芯片,那就搜索对应系列的关键词,不要傻乎乎都按下图搜索哦~
![](https://pic.imgdb.cn/item/65223c08c458853aefbf02fd.jpg)
同样的,由于服务器在国外,下载速度巨慢。大家用我提供的文件就可以了,同样也是官网上下载的,原汁原味。链接在 `1. 安装包及驱动准备` 可以找到。
安装的方法很简单,只需要双击安装包即可,然后它就会自动识别固件包的目录,点击 Next ,然后等进度条走到底就 OK 了。
![](https://pic.imgdb.cn/item/65223d1bc458853aefc09b7d.jpg)
### 3.3 程序编译
如果你们使用的是我上面推荐的 STM32F103C8T6 核心板,那么请下载 `1. 安装包及驱动准备` 我提供的模板工程,然后打开这个工程。
![](https://pic.imgdb.cn/item/6522658bc458853aefd63132.jpg)
![](https://pic.imgdb.cn/item/65226cd5c458853aefd95688.jpg)
程序打开后,在上图中左上角箭头处,有三个按钮,我们所做的编译工作都是使用这三个按钮。那这三个按钮有什么作用呢?
- 第一个按钮: Translate 就是翻译当下修改过的文件,说明白点就是检查下有没有语法错误,并不会去链接库文件,也不会生成可执行文件。
- 第二个按钮: Build 就是编译当下修改过的文件,它包含了语法检查,链接动态库文件,生成可执行文件。
- 第三个按钮: Rebuild 重新编译整个工程,跟 Build 这个按钮实现的功能是一样的,但有所不同的是它编译的是整个工程的所有文件,耗时巨大。
在实际工作中,我们最经常使用的就是第二个按钮,另外两个用得不多,尤其是第一个。
### 3.4 硬件接线
![](https://pic.imgdb.cn/item/65227653c458853aefde83ad.jpg)
核心板上边的电源线,随便找一根 microUSB 线来接就行,也就是之前手机充电线,扁头的那种,它就是用来供电的,没有传输数据。
而下边的下载引脚,主要是三根起作用: SWDIO 、 SWDCLK 、 GND 。大家认真对照核心板与 ST-Link ,别接错了哈。特别是 ST-Link ,接的是缺口对面那一排引脚,而不是靠近缺口的那一排引脚。为了让你们看更清楚,我又拍了一张细节图(够保姆吧)。
在下面这张图里,棕色是 GND ,红色是 SWDIO ,黄色是 SWDCLK ,大家可以对照着接线。
![](https://pic.imgdb.cn/item/65227833c458853aefdfb183.jpg)
### 3.5 程序下载
在下载之前,请先按下面的步骤做好配置。
![](https://pic.imgdb.cn/item/652286ebc458853aefe79e09.jpg)
![](https://pic.imgdb.cn/item/652287fac458853aefe84a31.jpg)
![](https://pic.imgdb.cn/item/65228872c458853aefe854f6.jpg)
![](https://pic.imgdb.cn/item/652288cdc458853aefe85d12.jpg)
![](https://pic.imgdb.cn/item/65228936c458853aefe868a4.jpg)
到此为止,针对 MDK 的配置已经搞定了,现在就可以进行下载了。
在下载之前,请做好四件事:
1. 就是刚刚前面的配置,一定要配置好;
2. 设备的接线,只要有一根线没接对,就无法完成下载;
3. 编译好程序;
4. 板子一定要上电。
![](https://pic.imgdb.cn/item/6523ae8fc458853aef4aa96d.jpg)
程序下载成功之后,板子自动运行新代码,会看到 LED 灯间隔 500 毫秒亮灭交替闪烁。
![](https://pic.imgdb.cn/item/6523af6cc458853aef4ae9e5.jpg)
## 4. STM32 ST-LINK Utility下载
STM32 ST-LINK Utility 是针对STM32全系芯片进行编程(读、写、擦除、选项字)的一款工具。
ST-LINK Utility 只支持 ST-Link (多个版本)的下载调试器,支持的芯片只有 STM32 。
- Need: ST-Link 下载器(和 `3. ST-Link V2下载` 使用的设备一样)
### 4.1 ST-LINK Utility安装
官网下载:
https://www.st.com/en/development-tools/stsw-link004.html
![](https://pic.imgdb.cn/item/6538a0e0c458853aef59ff9a.jpg)
官网需要注册、填邮箱……怪麻烦的,所以建议直接拿我准备好的安装包( `1. 安装包及驱动准备` ),也是官网下的,4.6.0版本。
安装没啥好说的,一路 Next 就行,有需要的话记得改下安装路径。
### 4.2 硬件连接
ST-Link V2 和 STM32 引脚一一对应就可以了,采用SWD 接口模式,接好如图,插上电脑。
ST-Link V2 STM32
SWCLK —— SWCLK
SWDIO —— SWDIO
GND —— GND
3.3V —— 3V3
![](https://pic.imgdb.cn/item/65388d97c458853aef242d8d.jpg)
### 4.2 程序下载
打开 ST-LINK Utility ,如图操作:
![](https://pic.imgdb.cn/item/65388e8ac458853aef269110.png)
![](https://pic.imgdb.cn/item/65388e9fc458853aef26c729.png)
这里需要选择 hex 文件,如果你们使用的是我上面推荐的 STM32F103C8T6 核心板,可以下载 `1. 安装包及驱动准备` 我提供的模板工程,如下操作。想烧自己的代码要是没有 hex 文件的话可以用 MDK(Keil) 生成。
![](https://pic.imgdb.cn/item/65388eb4c458853aef26f9a9.png)
![](https://pic.imgdb.cn/item/65388ec5c458853aef27211f.png)
看到出现 “Verification...OK” 就是下载成功。
![](https://pic.imgdb.cn/item/65388f1ac458853aef27f3bd.png)
程序下载成功之后,板子自动运行新代码,会看到 LED 灯间隔 500 毫秒亮灭交替闪烁。
## 5. JLink下载
JLINK 是一个兼容 JTAG 的仿真器,可以烧入程序和调试。
调试 ARM ,需要遵循 ARM 的调试接口协议, JTAG 就是其中的一种。JTAG 是一种国际标准测试协议,也叫 ARM 调试协议。现在多数的高级器件都支持 JTAG 协议,如 DSP 、 FPGA 器件等。
网上有的 JLink 下载用的是 JFlash ,我觉得有点麻烦了,还要再下一个软件,直接用 MDK 就行。
- Need: J-Link 仿真下载器
支持 KEIL 、 IAR 、 ADS 等编译仿真软件。支持功能 JTAG 、 SWD 、 SWO 、 VCOM 模式。正版 JLink 价格在 2000 元以上,某宝上仿的均价在 70 左右,但容易掉固件(一般商家支持帮我们重刷固件)。
![](https://pic.imgdb.cn/item/653bca5dc458853aeff58d04.jpg)
### 5.1 J-Link驱动安装
官网下载地址:
https://www.segger.com/downloads/jlink
也可以用我提供的驱动安装包,我的是 V612 ,V1、V2、V8、V9 的仿真器都可以用,或者找买的客服,一般都有驱动(不走官网就跳过下两张图)。
![](https://pic.imgdb.cn/item/653bb881c458853aef71ccad.jpg)
![](https://pic.imgdb.cn/item/653bb974c458853aef796316.jpg)
安装好后解压打开,点下图的 .exe 文件。
![](https://pic.imgdb.cn/item/653bbda1c458853aef991a58.jpg)
如下操作:
![](https://pic.imgdb.cn/item/653bbad7c458853aef8420bb.jpg)
![](https://pic.imgdb.cn/item/653bbb0bc458853aef85aa3f.jpg)
![](https://pic.imgdb.cn/item/653bbb6ec458853aef88cd4d.jpg)
![](https://pic.imgdb.cn/item/653bbbd7c458853aef8bff12.jpg)
![](https://pic.imgdb.cn/item/653bbc94c458853aef914052.jpg)
![](https://pic.imgdb.cn/item/653bbd0ec458853aef94deaf.jpg)
### 5.2 硬件连线
烧 STM32 只要用 4 条杜邦线就可以了,和 STM32 ST-LINK Utility 下载连线一样,采用SWD 接口模式,这里的 VREF 就是电源正极。
![](https://pic.imgdb.cn/item/653bc4bac458853aefcc1a49.jpg)
看图连线应该很简单吧,1、7、9是上面一排,20是下面一排哦。
![](https://pic.imgdb.cn/item/653bc467c458853aefc9db30.jpg)
整体连好长这样:
![](https://pic.imgdb.cn/item/653bc55fc458853aefd111ca.jpg)
### 5.3 程序下载
使用 MDK5 打开工程(这里用的是我的模板工程),点击魔法棒,跟我操作。
![](https://pic.imgdb.cn/item/653bbf6ec458853aefa5e38d.jpg)
![](https://pic.imgdb.cn/item/653bc093c458853aefae074b.jpg)
一般这样设置就可以了,如果烧录失败,可以参考 3.5 。
![](https://pic.imgdb.cn/item/653bc235c458853aefb96583.jpg)
## 6. STVP下载
STVP 是很早的下载工具了,支持 ST7 、 STM8 、 STM32 系列。说实话,这玩意从安装到使用都是太奶级别,又臭又长,真的不建议使用。。
- Need: ST-Link 下载器
### 6.1 STVP安装
官网下载:
https://www.st.com/en/development-tools/stvp-stm32.html#get-software
和 ST-LINK Utility 一样,官网需要注册、填邮箱……怪麻烦的,所以建议直接拿我准备好的安装包( `1. 安装包及驱动准备` ),也是官网下的。
![](https://pic.imgdb.cn/item/65389750c458853aef3f786c.jpg)
![](https://pic.imgdb.cn/item/65389798c458853aef402cab.jpg)
安装过程也是一路 Next 就行,由于安装时我不能截屏了,所以拍几个关键步骤出来。
![](https://pic.imgdb.cn/item/6538a421c458853aef65a908.jpg)
![](https://pic.imgdb.cn/item/6538a484c458853aef66db81.jpg)
![](https://pic.imgdb.cn/item/6538a3a5c458853aef6438c6.jpg)
PS :安装好后会看见 STVD 和 STVP ,我们用 STVP 就行。
- STVD : ST Visual Develop ,可视化开发工具
- STVP : ST Visual Programmer ,可视化编程工具
### 6.2 硬件连接
和3.4一样, ST-Link V2 和 STM32 引脚一一对应就可以了,接好如图,插上电脑。
ST-Link V2 STM32
SWCLK —— SWCLK
SWDIO —— SWDIO
GND —— GND
3.3V —— 3V3
![](https://pic.imgdb.cn/item/65388d97c458853aef242d8d.jpg)
### 6.3 程序下载
安装好后,桌面会有这个图标,点击打开。
![](https://pic.imgdb.cn/item/6538a5d6c458853aef6ad70c.jpg)
这里以 ST-Link 下载器和 STM32F103C8T6 核心板为例:
![](https://pic.imgdb.cn/item/6538a6e3c458853aef6dee90.jpg)
弹出新窗口,如下操作,这里打开的是 `1. 安装包及驱动准备` 我提供的模板工程,大家可以选自己的,要是 hex 文件,没有可以用 MDK(Keil) 生成。
![](https://pic.imgdb.cn/item/6538a808c458853aef7143e2.jpg)
![](https://pic.imgdb.cn/item/6538b799c458853aefa3fb0c.jpg)
![](https://pic.imgdb.cn/item/6538b7f6c458853aefa518ff.jpg)
## 7. 总结
对于初学者来说,没必要掌握那么多烧录方式,就我和我身边的程序猿来说,大家都喜欢用 ST-Link V2 搭配 MDK5 编写、烧录程序,所以我也推荐初学者先从 ST-Link V2 烧录方式开始,比较方便快捷。
感谢各位看官, peace and love !
**tips:**
- hex 文件、 bin 文件、 axf 文件的区别:
hex 文件、 bin 文件和 axf 文件是在嵌入式系统开发中常见的文件格式,用于存储编译后的程序代码和数据。
**hex 文件( Intel HEX )**: hex 文件是一种十六进制文本文件格式,用于表示程序代码和数据的二进制内容。它由一系列十六进制数值组成,每个数值对应一个字节的数据。 hex 文件通常包含地址信息、数据记录类型和实际的数据内容。它是一种常见的文件格式,广泛用于烧录设备、调试工具和仿真器等。
**bin 文件( Binary )**: bin 文件是一种原始的二进制文件格式,直接以二进制形式存储程序代码和数据。 bin 文件没有像 hex 文件那样进行十六进制的编码,而是按照字节的实际值进行存储。 bin 文件可以更直观地表示程序的原始二进制数据,但缺少了地址和其他元数据信息,因此在烧录和调试过程中需要额外的处理。
**axf 文件( ARM eXtended Format )**: axf 文件是针对 ARM 架构开发的一种特定格式,包含了可执行程序的代码、数据和符号表等信息。 axf 文件通常由 ARM 开发工具链生成,可以包含链接器产生的符号表、调试信息和其他附加的元数据。 axf 文件在调试过程中非常有用,可以用于查看和分析程序的结构、变量信息等。