关于STM32下的Boot模式的基本探究

stm32 的三种boot模式的差异

在这里插入图片描述
BOOT1=xBOOT0=0从用户闪存启动,这是正常的工作模式。
BOOT1=0BOOT0=1从系统存储器启动,这种模式启动的程序功能由厂家设置。
BOOT1=1BOOT0=1从内置SRAM启动,这种模式可以用于调试

具体切换按照核心板上的盖帽来转换

对比不同boot模式烧录后的地址位置情况

工程主要代码:

#include "delay.h"
#include "key.h"
#include "sys.h"
#include "usart.h"
#include <stdlib.h>
int k1 = 1;
int k2;
static int k3 = 2;
static int k4;


 int main(void)
 {
    
     
  static int m1=2, m2;
  int i = 1;
  char *p;
  char str[10] = "hello";
  char *var1 = "123456";
  char *var2 = "abcdef";
  int *p1=malloc(4);
  int *p2=malloc(4); 
 	u16 t;  
	u16 len;	
	u16 times=0;
	free(p1);
  free(p2);
	delay_init();	    	 //延时函数初始化	  
	NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); //设置NVIC中断分组2:2位抢占优先级,2位响应优先级
	uart_init(115200);	 //串口初始化为115200
	KEY_Init();          //初始化与按键连接的硬件接口
	
 	while(1)
	{
    
    
			for(t=0;t<len;t++)
			{
    
     
				while(USART_GetFlagStatus(USART1,USART_FLAG_TC)!=SET);//等待发送结束
			}
			USART_RX_STA=0;
			times++;
			if(times%500==0)
			{
    
    
	      printf("栈区-变量地址\r\n");
				printf("              i=%p\r\n", &i);
				printf("              p=%p\r\n", &p);
				printf("             str=%p\r\n", str);
        printf("\n堆区-动态申请地址\r\n");
        printf("                 %p\r\n", p1);
        printf("                 %p\r\n", p2);
        printf("\r\n.bss段");
        printf("\n全局外部无初值 k2:%p\r\n", &k2);
        printf("静态外部无初值 k4:%p\r\n", &k4);
        printf("静态内部无初值 m2:%p\r\n", &m2);
        printf("\r\n.data段");
        printf("\n全局外部有初值 k1:%p\r\n", &k1);
        printf("静态外部有初值 k3:%p\r\n", &k3);
        printf("静态内部有初值 m1:%p\r\n", &m1);
        printf("\r\n常量区\n");
        printf("文字常量地址     :%p\r\n",var1);
        printf("文字常量地址     :%p\r\n",var2);
        printf("\r\n代码区\n");
        printf("程序区地址       :%p\n",&main);
			}
			delay_ms(10);   
		}
	}

用户主闪存存储器被选为启动

切换核心板盖帽处于用户闪存存储器启动模式
烧录程序并打开串口观察结果
在这里插入图片描述
具体结果显示:

栈区-变量地址
              i=2000071c
              p=20000718
             str=2000070c

堆区-动态申请地址
                 20000128
                 20000130
.bss段
全局外部无初值 k2:20000004
静态外部无初值 k4:2000000c
静态内部无初值 m2:20000014

.data段
全局外部有初值 k1:20000000
静态外部有初值 k3:20000008
静态内部有初值 m1:20000010

常量区
文字常量地址     :08000264
文字常量地址     :0800026c

代码区
程序区地址       :08000145
栈区-变量地址
              i=2000071c
              p=20000718
             str=2000070c

堆区-动态申请地址
                 20000128
                 20000130

从系统存储器被选为启动

切换核心板盖帽处于系统储存器启动模式
烧录程序并打开串口观察结果:
在这里插入图片描述
具体结果显示:

栈区-变量地址
                i:2000075c
                p:20000758
              str:2000074c

堆区-动态申请地址
                   20000198
                   200001a0

.bss段

全局外部无初值 k2:20000008
静态外部无初值 k4:20000010
静态内部无初值 m2:20000018

.data段

全局外部有初值 k1:20000004
静态外部有初值 k3:2000000c
静态内部有初值 m1:20000014

常量区
文字常量地址     :080003ac
文字常量地址     :080003b4

代码区
程序区地址       :080001dd

猜你喜欢

转载自blog.csdn.net/rude_dragon/article/details/111882629