Investigación básica sobre el modo de arranque bajo STM32
La diferencia entre los tres modos de arranque de stm32
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
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
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