STM32三种BOOT模式的差异

前言

本篇文章分析了3种BOOT模式下不同的启动区域。以及三种启动方式的区别。
芯片:正点原子STM32F103ZET6
环境:Keil5


提示:以下是本篇文章正文内容,下面案例可供参考

三种BOOT模式

在这里插入图片描述

主闪存存储器

主闪存存储器(Main Flash memory)是STM32内置的Flash,一般我们使用JTAG或者SWD模式下载程序时,就是下载到这个里面,重启后也直接从这启动程序。

系统存储器

系统存储器(System memory),这种模式启动的程序功能是由厂家设置的。一般来说,这种启动方式用得比较少。系统存储器是芯片内部一块特定的区域,STM32在出厂时,由ST在这个区域内部预置了一段BootLoader, 也就是我们常说的ISP程序, 这是一块ROM,出厂后无法修改。一般来说,我们选用这种启动模式时,是为了从串口下载程序,因为在厂家提供的BootLoader中,提供了串口下载程序的固件,可以通过这个BootLoader将程序下载到系统的Flash中。
但这个下载方式需要以下步骤:

第一步

将BOOT0设置为1,BOOT1设置为0,然后按下复位键,这样才能从系统存储器启动BootLoader。

第二步

最后在BootLoader的帮助下,通过串口下载程序到Flash中。

第三步

程序下载完成后,又需要将BOOT0设置为GND,手动复位,这样,STM32才可以从Flash中启动。

按照上面的步骤进行操作会比较麻烦,也可以直接用串口下载工具进行下载。

内置SRAM

内置SRAM模式一般用于程序调试,没有程序存储的能力。假如我只修改了代码中一个小小的地方,然后就需要重新擦除整个Flash,比较的费时,可以考虑从这个模式启动代码(也就是STM32的内存中),用于快速的程序调试,等程序调试完成后,在将程序下载到SRAM中。

烧录程序验证

主要代码

#include "delay.h"
#include "sys.h"
#include "usart.h"
#include <stdio.h>
#include <stdlib.h>

void before()
{
 
}

char g_buf[16];
char g_buf2[16];
char g_buf3[16];
char g_buf4[16];
char g_i_buf[]="123";
char g_i_buf2[]="123";
char g_i_buf3[]="123";

void after()
{
 
}

int main(void)
 {	
    char l_buf[16];
		char l_buf2[16];
		char l_buf3[16];
    
    static char s_buf[16];
    static char s_buf2[16];
    static char s_buf3[16];
    char *p_buf;
    char *p_buf2;
    char *p_buf3;
	 
		p_buf = (char *)malloc(sizeof(char) * 16);
    p_buf2 = (char *)malloc(sizeof(char) * 16);
    p_buf3 = (char *)malloc(sizeof(char) * 16);
	 
	 delay_init();	    	 //延时函数初始化	  
    NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); //设置NVIC中断分组2:2位抢占优先级,2位响应优先级
    uart_init(115200);	 //串口初始化为115200
	 while(1)
    {
        printf("g_buf: 0x%x\r\n", g_buf);
        printf("g_buf2: 0x%x\r\n", g_buf2);
        printf("g_buf3: 0x%x\r\n", g_buf3);
        printf("g_buf4: 0x%x\r\n", g_buf4);
 
        printf("g_i_buf: 0x%x\r\n", g_i_buf);
        printf("g_i_buf2: 0x%x\r\n", g_i_buf2);
        printf("g_i_buf3: 0x%x\r\n", g_i_buf3);
 
        printf("l_buf: 0x%x\r\n", l_buf);
        printf("l_buf2: 0x%x\r\n", l_buf2);
        printf("l_buf3: 0x%x\r\n", l_buf3);
 
        printf("s_buf: 0x%x\r\n", s_buf);
        printf("s_buf2: 0x%x\r\n", s_buf2);
        printf("s_buf3: 0x%x\r\n", s_buf3);
 
        printf("p_buf: 0x%x\r\n", p_buf);
        printf("p_buf2: 0x%x\r\n", p_buf2);
        printf("p_buf3: 0x%x\r\n", p_buf3);
 
        printf("before: 0x%x\r\n", before);
        printf("after: 0x%x\r\n", after);
        printf("main: 0x%x\r\n", main);     
				//printf("hello huyue!\r\n"); 				
				printf("hello guyuewangyue!\r\n"); 
				delay_ms(20000);
				
    }
}
 

主闪存存储器烧录验证

硬件连接
连接STlink仿真器;在这里插入图片描述
BOOT0置0,BOOT1置0。
在这里插入图片描述
配置STlink(注意需要下载安装STlink的驱动)

在这里插入图片描述
点击下载即可!
在这里插入图片描述
实验结果
在这里插入图片描述

系统存储器烧录验证

硬件连接

连接串口;
在这里插入图片描述
BOOT0置1,BOOT1置0。
在这里插入图片描述
串口下载程序
在这里插入图片描述
实验结果
在这里插入图片描述

内置SRAM烧录验证

硬件连接可以参考主闪存存储器烧录验证

配置
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
注意:VECT_TAB_SRAM在前面用应为逗号隔开。

当需要切换工程版本时,点击MDK 工程名的下拉菜单可选择目标工程,在不同的工程中,所有配置都是独立的,例如芯片型号、下载配置等等,但如果两个工程共用了同一个文件,对该文件的修改会同时影响两个工程,例如这两个工程都使用同一个main 文件,我们在main 文件修改代码,两个工程都会被修改。

配置完成后,点击下载就会下载到SRAM中,在此不再演示。

  • 0
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值