STM32 启动过程简述

根据启动模式分析的结论:

1、 通过boot引脚设置可以将中断向量表定位于SRAM区,即起始地址为0x02000000,同时复位后PC指针位于0x02000000处;
2、 通过boot引脚设置可以将中断向量表定位于FLASH区,即起始地址为0x08000000,同时复位后PC指针位于0x08000000处;

3、 通过boot引脚设置可以将中断向量表定位于内置Bootloader区,本文不对这种情况做论述;

STM32 将0x8000000 映射到 0x00000000,即如果从内部FLASH启动,会从 0x08000004 处进行取指令 (CM3定义的 0x08000000 用于存放SP指针),故,0x00000000 与 0x8000000 内容完全相同,如下所示:

STM32 启动过程简述_第1张图片

STM32 启动过程简述_第2张图片

整体过程为:

 

①上电后硬件设置SP、跳转到 Reset_Hander

②设置系统时钟(SystemInit)

③软件设置SP

④加载.data、.bss,并初始化栈区(__main)

⑤跳转到C文件的main函数

在.s文件中,已经将中断向量表定义完整,系统会跳转到固定地址进行执行。第一条执行 Reset_handler。接着执行SystemInit设置运行时钟信息(72MHz)。

__main函数是内部的一个库函数,在此函数中调用了_scatter_load, _scatterload_null, _scatterload_copy 等函数,负责初始化堆栈,RW-DATA搬运,ZI段初始化等等操作。并最终跳转到 main 函数。

值得注意的是:Keil编译完成后:

Code:代表程序代码段

RO_DATA:代表只读数据段

RW_DATA:代表已经初始化全局数据

ZI_DATA:代表未初始化全局数据

由于程序在 FLASH 中直接通过总线进行访问,程序运行在 FLASH 上,而可更改的数据存于 SRAM 中,故:

RO_SIZE = Code + RO_DATA(占用 Flash )

RW_DATA = RW_DATA + ZI_DATA(占用 SRAM)

ROM_SIZE = Code + RO_DATA + RW_DATA ( 烧写到 FLASH 大小空间 )

针对 ZI 数据,是不存 FLASH 中,直接在 SRAM 中初始化为 0 

 

你可能感兴趣的:(MCU)