stm32上电启动流程

stm32上电启动流程

 

 

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

stm32上电启动流程

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


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

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

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

stm32上电启动流程

 

 

stm32上电启动流程

 

 

stm32上电启动流程

 

 

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

 

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

stm32上电启动流程

 

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

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

stm32上电启动流程

 

 

 如图,sp=0x20000690     pc=80001101

 

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

stm32上电启动流程

 

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

stm32上电启动流程

 

 

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

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

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

stm32上电启动流程

上图为.map文件里的内容

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

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

stm32上电启动流程

 

上一篇:STM32 + UIP + ENC28J60 实现TCP 简单通讯


下一篇:STM32 HAL库快速实战【六】《蓝牙控制》--基于黑龙江科技大学机电工业机器人实训