Investigación básica sobre el modo de arranque bajo STM32

La diferencia entre los tres modos de arranque de stm32

Inserte la descripción de la imagen aquí
BOOT1 = xBOOT0 = 0 Arranque desde la memoria flash del usuario, este es el modo de funcionamiento normal.
BOOT1 = 0BOOT0 = 1 Arranque desde la memoria del sistema La función de programa de este modo la establece el fabricante.
BOOT1 = 1BOOT0 = 1 Arranque desde la SRAM incorporada, este modo se puede usar para depurar

La conmutación específica se convierte de acuerdo con la tapa en la placa base

Compare la ubicación de la dirección después de grabar en diferentes modos de arranque

El código principal del proyecto:

#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);   
		}
	}

La memoria flash principal del usuario se selecciona como arranque

Cambie la tapa de la placa base en el modo de inicio de la memoria flash del usuario.
Grabe el programa y abra el puerto serie para observar los resultados. Se
Inserte la descripción de la imagen aquí
muestran los resultados específicos:

栈区-变量地址
              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

Seleccionado como arranque desde la memoria del sistema

Cambie la tapa de la placa base en el modo de inicio de la memoria del sistema.
Grabe el programa y abra el puerto serie. Observe los resultados: Se
Inserte la descripción de la imagen aquí
muestran los resultados específicos:

栈区-变量地址
                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

Supongo que te gusta

Origin blog.csdn.net/rude_dragon/article/details/111882629
Recomendado
Clasificación