stm32上电启动流程

 

 

 先说说MDK编译好后的显示的。

上图第三行是烧写到FLASH的大小,第二行(可修改的数据)是占用SRAM的大小


1、stm32一开始上电的时候,按理来说是从0x0000 0000开始读取第一条指令的,但M3系列的不同,通过boot0,boot1上电状态的不同,进入不同的工作模式,取得第一条指令的地址也就不同了。

  • 通过boot引脚设置可以将中断向量表定位于SRAM区,即起始地址为0x2000000,同时复位后PC指针位于0x2000000处;
  • 通过boot引脚设置可以将中断向量表定位于FLASH区,即起始地址为0x8000000,同时复位后PC指针位于0x8000000处;
  • 通过boot引脚设置可以将中断向量表定位于内置Bootloader区,本文不对这种情况做论述;

(当然,上述地址也是可以更改的)

 

 

 

 

 

 

同时,stm32内部的该寄存器记录了,向量表偏移量的值

 

2、0x08000000(代码区)的一开始位置有一张中断向量表,其第一个表项是栈顶地址,第二个表项是复位中断服务入口地址

 

 程序会先取出0x08000000的值,给sp寄存器。

再接着取0x08000004的值(即复位中断程序),给pc寄存器,去执行它

 

 

 如图,sp=0x20000690     pc=80001101

 

我们可以从生成的******.map文件中看到

 

 pc指向的位置就是复位中断服务的入口,进入之后,时钟初始化,然后跳转__main函数,最后进入mian函数,来到C的世界

 

 

3、那么sp的值大小有时怎么算出来的呢

就是根据最上面RW SIZE的数值大小,加上MDK里设置的0x20000000的初始值,得出的

但其实,有时候会发现自己写的程序(初始化的全局变量,静态变量之类)并没有占有这么大的空间。那RW SIZE的数值大小有时哪来的呢

上图为.map文件里的内容

看得出只有.data和.bss才是用户自己添加的代码占用空间大小

其他的HEAP,STACK都是别文件里添加上的,比如启动文件

 

posted @ 2021-12-08 12:48  kingzhan  阅读(1311)  评论(0编辑  收藏  举报