【STM32】自举模式 和 程序下载(ST-Link和串口示例)

article/2025/9/15 21:50:42
  • STM32官方网站
  • STM32中文社区

    如果遇到不清楚的概念,可以看之前的文章。

  • 一、自举模式
  • 二、程序下载
    • 2.1 概述
    • 2.2 实操
      • 2.21 SWD 方式下载(ST-Link)
      • 2.22 串口下载

一、自举模式

STM32有一个特殊的功能,就是可以通过不同的方式启动程序,这就是所谓的自举模式(Boot Mode)。

STM32的自举模式由两个引脚控制,分别是BOOT0BOOT1,它们可以接到不同的电平(高电平或低电平),从而决定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 AdapterSW 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。



~


http://chatgpt.dhexx.cn/article/Is1E9L64.shtml

相关文章

自举电容

自举电容的核心原理是:电容两端电压不能突变。 为什么需要自举电容? DCDC电路中有两个mos开关管,如下图所示。对于低端的管子Q2,由于其源极接地,所以想要Q2导通,只要在Q2的栅极加一定的电压即可&#xff…

自举电路原理

充电储能 在充电过程中,开关闭合(三极管导通),这时,输入电压流过电感。二极管防止电容对地放电。由于输入是直流电,所以电感上的电流以一定的比率线性增加,这个比率跟电感大小有关。随着电感电流增加,电感…

自举电路、自举电容

自举电路也叫升压电路,是利用自举升压二极管,自举升压电容等电子元件,使电容放电电压和电源电压叠加,从而使电压升高.有的电路升高的电压能达到数倍电源电压。 举个简单的例子:有一个12V的电路&#xff0c…

自举电路工作原理和自举电阻和电容的选取

自举电路的工作原理 如下图自举电路仅仅需要一个15~18V的电源来给逆变器的驱动级提供能量,所有半桥底部IGBT都与这个电源直接相连,半桥上部IGBT的驱动器通过电阻Rboot和二极管VF连接到电源Vb上,每个驱动器都有一个电容Cboot来缓冲电压&#…

自举电路

自举电路 Bootstrap circuit 我们知道Nmos管开启时需要大于阈值电压Vth,但是当MOS做高端驱动时,G极电压一定要高于Vcc电压(D极)Vth,所以需要一种电路将G极电路举高,这个电路就是自举电路。 如下: P与N m…

C语言中的循环语句(while、dowhile、for)

文章目录 goto语句循环语句的类型while语句死循环语句的嵌套 do..while语句for语句 goto语句 如果我们想要实现从0输出到n,如果要写0~100的话那我们就要写100个printf,这样非常麻烦,也 不现实,在汇编中当程序print完了我们可以用…

【汇编 C】循环语句goto、while、dowhile、for

目录 前言 一、什么是循环语句? 二、goto语句实现循环 goto底层汇编 三、while循环语句 while底层汇编 四、dowhile语句 do while底层汇编 五、for循环 for语句的几种写法 for底层汇编 总结 结语 封面 前言 本教程内容可能会涉及到汇编&#xff0…

【C语言】循环语句(do while循环)

简单不先于复杂,而是在复杂之后。 目录 do while循环 do 语句的用法 执行流程 do语句的特点 go to语句 do while循环 do 语句的用法 while循环和for循环都是入口条件循环,即在循环的每次迭代之前检查测试条件,所以有可能根本不执行循环…

while和do while的用法区别

前言 在上一篇文章中,壹哥给大家讲解了循环的概念,并重点给大家讲解了for循环的使用。但在Java中,除了for循环之外,还有while、do-while、foreach等循环形式。今天小千就再用一篇文章,给大家讲解while循环的使用。 本文…

循环语句—do…while循环

目录 3.do……while循环语句 3.1do……while循环语句格式 3.2三种循环的区别 3.3总结三种循环的区别 3.do……while循环语句 3.1do……while循环语句格式 基本格式: do { 循环体语句; } while(条件判断语句); …

While语句与do...while语句

循环结构之while语句: while(表达式) {语句} 注意:1.while循环的特点是先判断条件表达式,后执行循环体语句。 2.“语句”就是循环体。循环体可以是一个简单的语句,可以是复合语句(用花括号括起来的若干语…

C/C++之while(do-while)详细讲解

目录 while循环有两个重要组成部分: while 是一个预测试循环 无限循环 do-while 循环 while循环有两个重要组成部分: 进行 true 值或 false 值判断的表达式;只要表达式为 true 就重复执行的语句或块; 图 1 显示了 while 循环的…

do{...}while(0)的用法

首发于微信公众号:【码农在新加坡】,欢迎关注。 个人博客网站:do{...}while(0)的用法 零.导引 第一次见到 do{...}while(0)是在学习libevent的时候,看到里面有很多类似 #define TT_URI(want) do { \char *ret evhttp_uri_…

if,while选择结构和while,dowhile,for循环的使用

什么是if和while选择结构 if 选择结构是根据句条件判断之后再做处理的一种语法结构, 语法如下: while是一种先判断再执行循环体的结构; 当while循环条件为真时才执行循环体,然后再判断循环条件,如果条件为真&#xf…

while及do while语句

编写程序时,许多问题都要用到循环控制。循环结构也是结构化程序设计的基本结构之一,因此熟练地掌握循环结构是程序设计最基本的要求。While循环、do while循环、for循环语句,3种循环语句在一般情况下可以相互转换 While 及dowhile语句 Whil…

代码执行顺序之循环执行:forwhiledowhile嵌套循环

代码执行顺序之循环执行 循环执行的分类 for循环while循环dowhile循环 for循环 语法: for(循环初始化表达式;循环条件表达式;循环后的操作表达式){ ​ // 循环体 } 执行步骤分析: 循环初始化表达式最先执行,并且只执…

dowhile的学习

dowhile的学习 dowhile 的概念及他与while的区别 package javaxunhuanjiegou; ​ public class DoWhile {public static void main(String[] args) {int a 0;int sum 0;do {sum sum a;a;} while (a < 100);System.out.println(sum);} } ​ 我们来跟直观的感受一下 于…

循环结构 --> do while循环

do while循环 do {循环体;} while(条件表达式);执行循环体 > 判断条件表达式是否成立> 若成立&#xff0c;则执行循环体 > 判断条件表达式是否成立> 若不成立&#xff0c;则循环结束do while循环主要用于至少执行一次循环体的场合中。package demo;/*编程实现do wh…

do while循环和whil循环(内含流程图)

C语言的三大循环语句除去for循环语句还剩下do while和while循环&#xff0c;因为这两个很相似所以这里放在一起讲解。希望读完本文能对你有所帮助。 do while循环和whil循环 一、do...while二、while 一、do…while do while的语法循环结构如下所示。 do while的逻辑循环结构…

SQL中join操作后面的on与where的区别

join关键字的作用是将多个表按一定的条件联合起来&#xff0c;从而可以实现从多个表中获取数据 在join后面可以接on条件和where条件&#xff0c;在这里我主要就是说这两者之间的差别 建立两张简单的用来测试的表并添加数据&#xff0c;如下所示&#xff0c;一张表名为id_name…