一、自举模式
STM32有一个特殊的功能,就是可以通过不同的方式启动程序,这就是所谓的自举模式(Boot Mode)。
STM32的自举模式由两个引脚控制,分别是BOOT0
和BOOT1
,它们可以接到不同的电平(高电平或低电平),从而决定STM32从哪里启动程序。
STM32有三种自举模式,分别是:
- 主闪存模式(
Main Flash memory mode
):这是默认的自举模式,当BOOT0为低电平
,BOOT1为任意电平时,STM32会从主闪存(Flash)中启动程序。主闪存是STM32内部的非易失性存储器,可以通过编程工具或者内置的串行引导加载器(serial bootloader)来烧写程序。 - 系统存储器模式(
System memory mode
):这是一种特殊的自举模式,当BOOT0为高电平,BOOT1为低电平时
,STM32会从系统存储器中启动程序。系统存储器是STM32内部的只读存储器(ROM),其中存放了一个串行引导加载器(serial bootloader),它可以通过串口、USB或者CAN等接口来接收外部的程序,并将其写入主闪存或者外部的存储器设备。 - 嵌入式SRAM模式(
Embedded SRAM mode
):这是一种调试用的自举模式,当BOOT0为高电平,BOOT1为高电平
时,STM32会从嵌入式SRAM中启动程序。嵌入式SRAM是STM32内部的易失性存储器,它可以通过JTAG或者SWD等调试接口来加载程序。这种模式通常用于开发和测试阶段,不适合生产环境。
自举模式的选择对于STM32的应用开发和调试非常重要,它可以影响STM32的启动速度、安全性和灵活性。通过合理地利用自举模式,可以实现不同的功能和需求,例如:
- 通过串行引导加载器来更新程序,无需使用专用的编程工具或者拆卸设备。
- 通过嵌入式SRAM模式来快速验证程序的功能和性能,无需烧写主闪存。
- 通过主闪存模式来保证程序的稳定性和安全性,防止被篡改或者损坏。
BOOT0 和 BOOT1 这2个引脚在开发板上是会明确标注的。但是当你去看芯片的引脚分布图时,有可能只能看到BOOT0引脚,找不到BOOT1引脚,这是因为BOOT1引脚有可能是与其他引脚复用的。
拿STM32F103C8T6
来说:64KB Flash+20KB SRAM(还有64KB ROM)。它的引脚是48个,LQFP封装,它的引脚分布图如下:
BOOT0明确为44
引脚。
BOOT1是与PB2
复用的,即20
引脚,在芯片手册的引脚定义表格中可以看到:
二、程序下载
一般情况下,我们的程序是下载到Flash
中的。好比你在电脑上下载安装软件,安装位置一般就是SSD(与Flash类似)。
下面介绍的3中方法对应系统存储期模式和Flash模式(下载方法不限于下面3种)。
2.1 概述
(1)串行引导加载器(serial bootloader)
串行引导加载器是STM32内置的一个程序,它存放在系统存储器中(ROM
),可以通过串口、USB或者CAN等接口来接收外部的程序,并将其写入主闪存或者外部的存储器设备。
- 串行引导加载器的优点是无需使用专用的编程工具或者拆卸设备,只需要一根数据线和一个电脑就可以完成下载。
- 缺点是速度较慢,而且需要配置好自举模式和接口参数。
要使用串行引导加载器下载程序,需要按照以下步骤进行:
- 将STM32的BOOT0引脚接高电平,BOOT1引脚接低电平,选择系统存储器模式。
- 将STM32的串口、USB或者CAN接口连接到电脑上,并安装相应的驱动程序。
- 打开一个串口终端软件(如PuTTY)、USB转串口软件(如STSW-LINK009)或者CAN转串口软件(如CANalyst-II),并设置好波特率、数据位、停止位等参数。
- 复位STM32,并在终端软件中发送一个0x7F字节,以激活串行引导加载器。
- 如果收到一个0x79字节的应答,表示串行引导加载器已经准备好接收命令。如果没有收到应答,可能是参数设置错误或者连接问题,需要检查并重试。
- 发送一个读取命令(0x11),并指定要读取的存储器地址和长度。如果收到一个0x79字节的应答,表示命令有效。如果收到一个0x1F字节的应答,表示命令无效或者地址错误,需要检查并重试。
- 读取返回的数据,并校验其正确性。
- 发送一个擦除命令(0x43),并指定要擦除的扇区号。如果收到一个0x79字节的应答,表示命令有效。如果收到一个0x1F字节的应答,表示命令无效或者扇区号错误,需要检查并重试。
- 发送一个写入命令(0x31),并指定要写入的存储器地址和数据。如果收到一个0x79字节的应答,表示命令有效。如果收到一个0x1F字节的应答,表示命令无效或者地址错误,需要检查并重试。
- 校验写入的数据,并重复上述步骤直到所有数据都写入完成。
- 发送一个跳转命令(0x21),并指定要跳转的程序入口地址。如果收到一个0x79字节的应答,表示命令有效。如果收到一个0x1F字节的应答,表示命令无效或者地址错误,需要检查并重试。
- 复位STM32,并将BOOT0引脚接低电平,选择主闪存模式。
- STM32将从主闪存中启动程序。
中间的很多步骤看起来可能比较复杂,但是通常串口下载软件可以代替我们完成这些工作,比如FlyMCU
。
(2)JTAG(Joint Test Action Group)
JTAG
是一种标准的测试和调试接口,它可以通过一根多芯的数据线来连接STM32和一个编程工具(如ST-LINK、J-LINK等),并通过一个调试软件(如Keil、IAR等)来控制STM32的运行状态和存储器内容。
- JTAG的优点是速度较快,而且可以实时监视和修改STM32的寄存器和存储器。
- 缺点是需要使用专用的编程工具和调试软件,而且可能会占用一些GPIO引脚。
要使用JTAG下载程序,需要按照以下步骤进行:
- 将STM32的JTAG接口连接到编程工具上,并将编程工具连接到电脑上。
- 打开一个调试软件,并设置好目标芯片型号、时钟频率、下载地址等参数。
- 选择下载模式,并选择要下载的程序文件。
- 点击下载按钮,开始下载程序到STM32的存储器中。
- 点击运行按钮,开始运行程序。
(3)SWD(Serial Wire Debug)
SWD
是一种简化的JTAG接口,它只需要两根数据线来连接STM32和一个编程工具(如ST-LINK、J-LINK等),并通过一个调试软件(如Keil、IAR等)来控制STM32的运行状态和存储器内容。
- SWD的优点是占用引脚少,而且可以实现和JTAG相同的功能。
- 缺点是速度稍慢于JTAG,而且可能会影响一些GPIO引脚的功能。
要使用SWD下载程序,需要按照以下步骤进行:
- 将STM32的SWD接口连接到编程工具上,并将编程工具连接到电脑上。
- 打开一个调试软件,并设置好目标芯片型号、时钟频率、下载地址等参数。
- 选择下载模式,并选择要下载的程序文件。
- 点击下载按钮,开始下载程序到STM32的存储器中。
- 点击运行按钮,开始运行程序。
2.2 实操
自己去官网下载相应的驱动并安装:就是ST-Link和ch340等驱动,具体取决于你使用的工具。实在不会就找你的淘宝卖家要。不展开介绍了。
拿ST-Link来说,安装驱动后,将设备连接到电脑可以看到:
说明驱动安装的没问题。
2.21 SWD 方式下载(ST-Link)
这是最常用、最好用的方式之一。可以买正版的ST-Link,也就100来块,或者10几块买个自制的那种。(正版J-Link太贵了😅)
很多设置设调试的时候用的,大概介绍一下。
引脚对应接线即可:(BOOT引脚按照Flash模式接线即可)
软件是Keil的 MDK-ARM 5.38
。
首先编译生成hex文件,前面的文章对Keil的功能已经完整介绍过了。
在 options for target
下的Debug
选项下选择ST-Link,然后进入设置:
如果是第一次使用,有可能会提示你安装或更新某些固件,按照指示操作即可。
进入设置会有如下4个选项:
- Debug:设置调试参数,例如复位模式、复位脚、最大时钟频率、SWO频率等。这些参数会影响调试器和目标板之间的通信和同步。
- Trace:设置是否启用跟踪功能,以及选择跟踪模式、跟踪端口、跟踪时钟频率等。跟踪功能可以实现对目标板的实时监视和分析,例如显示程序执行流程、函数调用栈、变量值等。
- Flash Download:设置是否在调试前自动下载程序到目标板的存储器中,以及选择要下载的存储器设备和算法。这些设置会影响下载速度和成功率。
- Pack:设置是否使用软件包中提供的调试定义,以及选择要使用的软件包和配置文件。这些定义会提供调试连接和跟踪功能的配置设置。
Debug:
- Debug Adapter 和 SW Device 是你的ST-Link参数,只要你的ST-Link质量没问题、BOOT引脚设置正确、接线正确、板子正常、安装了驱动,那么这里就会显示相关信息,否则请逐一排查问题。
- Target Com:
port
用于选择端口类型,我使用的是SWD
(2跟线的,SWDIO和SWCLK)。clock
是时钟设置,可以设置调试的速度。 Req:请求频率 Selected:实际频率。
- Debug: 这是调试设置,根据需要设置即可。
Trace
:
- Core Clock:核心时钟频率。设置跟当前板子相同的时钟频率,可以在调试时按实际运行时间进行追踪调试。
- Trace Enable:使能追踪功能。
Flash Download
:
- Download Function:
- Erase Full Chip:擦除整片
- Erase Sectors:擦除部分
- Do not Erase:不擦除
- 勾选Erase Full Chip时,每次下载时,都会对整片Flash进行擦除操作。勾选Erase Sectors时,下载时只会擦除使用到的扇区。勾选Do not Erase时,则下载时不擦除原本代码。
- Program:烧录
- Verify:校验
- Reset and Run:复位并运行
- 勾选Program时,下载时才会把代码写入Flash,否则不写入。勾选Verify时,则在烧录代码后,对代码进行校验。某些场合下不能检验,比如代码段跟数据段分开下载,代码里不包含数据部分,而工程里配置的代码段又包含数据段时,此时如果进行校验,可能会因为数据内容不一致导致校验失败。勾选Reset and Run时,则在下载完成后立即复位运行代码,不勾选时则需要手动复位运行。
- Programming Algorithm:设置要下载的存储器设备和算法,以及选择要下载的扇区和地址范围。一般选择与目标板匹配的存储器设备和算法。比如STM32F103C8T6就选择中等容量(虽然它是64K不是128K)
Pack
: 芯片对应的Pack
全部设置完成后,点击Download即可下载:
下载完之后,按下板子上的reset
即可运行你的、正确的程序。
2.22 串口下载
这种方式只需要串口转USB即可完成,成本很低,是通过系统存储中的程序(串行引导加载器),将程序下载到Flash中的方式。
-
BOOT设置:
BOOT0=1,BOOT1=0
-
接线:USB转串口的TX和RX分别与板子的RX(PA10)和TX(PA9)相连(不是同名相连哦),电源正常接线。
-
软件:FlyMCU
首先搜索串口,选择有USBxxxCH340字样的端口。
读取器件信息示例(需要按一下reset):这说明连接正常,显示的信息不一定准确哦,具体看Datasheet。
下载程序:
选择Keil生成的hex文件,点击开始编程即可,设置按照上图。
- 这里是 FlyMcu 对一键下载电路的控制过程,其实就是控制DTR和RTS电平的变化,控制BOOT0和RESET,从而实现自动下载。
- STM32每次下载程序时,需要先将整片擦除,擦除速度比较慢,整个过程可能需要几十秒钟时间。
- 下载成功后,会出现“共写入 xxxx KB,进度100%,耗时 xxxx 毫秒”的提示,并且下方的进度条会全绿。
程序是下载到Flash的,所以下载完后,记得把BOOT0设为0。
把 永 远 爱 你 写 进 诗 的 结 尾 ~