STM32 启动过程简述

2019-04-13 16:34发布

根据启动模式分析的结论: 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 内容完全相同,如下所示: 整体过程为:   ①上电后硬件设置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