stm32启动过程

一、stm32启动模式

在这里插入图片描述
这三种模式请看下列图示
在这里插入图片描述
三个不同作用的空间在单片机里面占了三个空间,单片机引导哪个空间资源启动,由BOOT1和BOOT0决定!
正常来说一般是从flash启动!!!

二、从flash启动过程

2.1 数据在堆栈中存储方式

启动的程序是在sram上运行!!有一个很关键数据结构的知识点,运行时sram会分成以下四个部分:常量区,堆,栈,静态存储区!
在这里插入图片描述

例如:

#include <stdio.h>
int a=0;  	 	//全局初始化区
char *p1;  	 	//全局未初始化区

void main()

{

int b;   					//栈

char s[]="abc";   			//栈

char *p3= "1234567"; 	    //在文字常量区Flash

static int c =0 ;   		//静态初始化区

p1= (char *)malloc(10);     //堆区,运行完需要free释放

strcpy(p1,"123456");       //"123456"放在常量区

strcpy(p3,"abcde");        //错误示范!常量区的数据不能被修改,只读

free(p1);
}

2.2 stm32的正常启动过程

stm32未上电时,数据是存flash里面的,上电后,sram开始接收到数据工作,那么单片机做了什么工作呢?实际上stm32的启动过程就是给单片机的资源设置初始化的过程!
等同于:stm32的启动过程等于给单片机的寄存器赋值过程
关键的寄存器就是可以在sram里面设置堆、栈的寄存器
PC寄存器(程序计数)和SP寄存器(堆栈指针)

在启动代码里面可以看到
在这里插入图片描述
单片机启动会先设置栈的空间600字节和堆的空间200字节,也就是设置堆栈指针到响应的地址
其响应的地址是在链表文件配置
在这里插入图片描述
即是:堆和栈设置地址为0x20000000,堆是向上找空间,栈是向下找空间!
在这里插入图片描述
实际上,依据map的地址分配
在这里插入图片描述

它应该还会先设置静态储存器,再设置堆和栈!
所以栈的地址为0x20000658

而我理解的R/O就是read only,即是为文字常量区!

接着就是设置中断向量表,分为:异常向量表和外部中断向量表
(若程序异常则会先继续执行异常状态)
接着就执行_mian
在这里插入图片描述
正式进入main循环,执行时钟分配,外设初始化等工作!

三、总结

stm32启动过程:

汇编文件:

  1. 设置sp寄存器,即使设置指向堆栈的地址的指针;
  2. 设置pc寄存器,即使设置程序计数器;
  3. 设置中断向量表;
  4. 时钟初始化,也会在汇编文件里面启动sysinit

c文件正常执行:

  1. main中的时钟初始化
  2. 外设初始化
  3. loop()工作
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

_翩翩少年

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值