关于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