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

STM32的自举模式包括主闪存模式、系统存储器模式和嵌入式SRAM模式,由BOOT0和BOOT1引脚控制。程序下载可通过串行引导加载器、JTAG和SWD方式,其中SWD是最常用的方法之一,ST-Link是常用的下载工具。串口下载利用系统存储器中的串行引导加载器更新Flash中的程序。
摘要由CSDN通过智能技术生成

一、自举模式

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。



~

  • 6
    点赞
  • 39
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
### 回答1: 首先,Keil5是一款非常流行的嵌入式开发工具,主要用于开发和调试ARM架构的微控制器。而ST-Link V2则是一款常用的STM32系列微控制器的烧录和调试工具,可以通过USB接口连接到计算机。 STM32F103C8T6是一款常用的ARM Cortex-M3内核的微控制器,其中包含了多个GPIO引脚,其中的P13引脚是其中的一个。 P13引脚可以通过配置为输出模式来控制连接到该引脚的LED灯的亮灭。为了测试P13引脚连接的LED灯是否正常工作,我们可以使用Keil5和ST-Link V2来编写和烧录一个简单的测试程序。 下面是一个示例的测试程序的代码: ```c #include "stm32f103c8t6.h" void delay(int); int main(void) { RCC->APB2ENR |= (1 << 3); // Enable GPIOB clock GPIOB->CRH &= ~(0x0F << 20); // Clear PIN13 configuration GPIOB->CRH |= (0x03 << 20); // Configure PIN13 as output push-pull while (1) { GPIOB->BSRR = (1 << 13); // Set PIN13 to HIGH delay(500000); // Delay for some time GPIOB->BRR = (1 << 13); // Reset PIN13 to LOW delay(500000); // Delay for some time } } void delay(int count) { for (int i = 0; i < count; i++); } ``` 这个程序中,我们首先需要配置P13引脚为输出模式,并将其连接的GPIO口的时钟使能。然后,在一个无限循环中,我们通过设置和复位P13引脚来控制LED灯的亮灭,并在设置和复位之间加入了一个延时函数来控制灯的持续时间。 在Keil5中,我们可以创建一个新的工程,选择适当的目标设备为STM32F103C8T6,然后将以上代码复制到一个.c文件中,并进行编译和烧录。 使用ST-Link V2连接STM32F103C8T6微控制器和计算机,然后在Keil5中选择ST-Link V2作为调试工具进行烧录。完成烧录后,可以通过观察P13引脚连接的LED灯的亮灭状态来判断测试程序是否正常工作。 希望对你有帮助! ### 回答2: Keil5是一款被广泛用于嵌入式系统开发的集成开发环境(IDE),而ST-Link V2是一种程序烧录器和调试器,用于与STMicroelectronics的STM32系列微控制器进行通信和调试。而STM32F103C8T6是一个性能强大的STM32系列微控制器,其P13引脚可以用作输出控制。 通过Keil5和ST-Link V2的配合使用,我们可以进行STM32F103C8T6的开发、调试和烧录操作。下面是一个使用P13引脚测试程序示例: 首先,在Keil5中创建一个新的工程,选择合适的芯片型号为STM32F103C8T6。然后编写一个简单的程序,以控制P13引脚的输出状态。 #include "stm32f103c8t6.h" void delay(uint32_t count) { for(uint32_t i=0;i<count;i++); } int main() { RCC->APB2ENR |= RCC_APB2ENR_IOPCEN; // 使能C端口时钟 GPIOC->CRH &= ~(0x0F << (4*0)); // 清除P13端口的配置 GPIOC->CRH |= (0x03 << (4*0)); // 设置P13引脚为推挽输出 GPIOC->BRR |= (1 << 13); // 将P13引脚置低,灯熄灭 while(1) { GPIOC->BSRR |= (1 << 13); // 将P13引脚置高,灯亮起 delay(1000000); // 延时一段时间 GPIOC->BRR |= (1 << 13); // 将P13引脚置低,灯熄灭 delay(1000000); // 延时一段时间 } } 在上述程序中,我们首先使能了GPIOC端口的时钟,并对P13引脚进行了配置,将其配置为推挽输出模式。然后,在主函数中的循环中,通过设置和清除P13引脚的电平来实现让灯亮起和熄灭的效果。同时,为了控制灯的亮灭时间,我们使用了一个简单的延时函数。 完成程序编写后,可以使用ST-Link V2将程序烧录到STM32F103C8T6上。连接ST-Link V2与STM32F103C8T6的调试串口,并通过Keil5进行程序的烧录和调试操作。最后,我们可以观察到P13引脚接入的LED灯的亮度变化,达到测试效果。 以上就是使用Keil5、ST-Link V2和STM32F103C8T6进行P13灯测试的简要步骤和示例程序。这种组合可以为嵌入式开发者提供方便的开发和调试环境,帮助他们快速验证和测试硬件功能。 ### 回答3: Keil5和ST-Link V2是嵌入式开发中常用的工具,用于开发和调试STM32微控制器。在这个问题中,我们将使用Keil5和ST-Link V2开发板来编写一个简单的程序,以控制STM32F103C8T6开发板上的P13灯。 首先,我们需要在Keil5中创建一个新的工程,并选择适合的开发板和目标芯片,本例中选择的是STM32F103C8T6。 接下来,我们需要编写一个简单的程序来控制P13灯。下面是一个示例程序: ```c #include "stm32f103c8t6.h" void delay(void) { for(int i = 0; i < 500000; i++); // 延时函数 } int main(void) { // 启用GPIOC时钟 RCC->APB2ENR |= RCC_APB2ENR_IOPCEN; // 配置P13引脚为输出模式 GPIOC->CRH &= ~(GPIO_CRH_MODE13_Msk | GPIO_CRH_CNF13_Msk); GPIOC->CRH |= GPIO_CRH_MODE13_0; while(1) { // 设置P13输出高电平 GPIOC->BSRR |= GPIO_BSRR_BS13; // 延时一段时间 delay(); // 设置P13输出低电平 GPIOC->BSRR |= GPIO_BSRR_BR13; // 延时一段时间 delay(); } } ``` 在这个程序中,我们首先启用GPIOC端口的时钟。然后,我们配置P13引脚为输出模式。接下来是一个无限循环,在循环中我们将P13引脚设置为高电平,然后延时一段时间,接着将P13引脚设置为低电平,再次延时一段时间,不断循环。 最后,我们需要将程序下载STM32F103C8T6开发板上进行测试。我们可以使用ST-Link V2作为调试器,将程序下载到开发板上。连接ST-Link V2与开发板,并通过Keil5的调试功能进行下载和调试。 当程序下载到开发板上之后,你就会看到P13灯每隔一段时间亮起并熄灭,表示程序正常运行。 总之,通过Keil5和ST-Link V2,我们可以轻松地编写并测试STM32F103C8T6开发板上的P13灯测试程序
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

感谢地心引力

有用的话请我喝杯咖啡吧????

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值