1)初始化栈顶指针
从0x0800 0000读取栈顶地址,并将该地址存入MSP中。
栈顶地址的值为0x2000 xxxx,工程所生成bin文件的前两个字节即为栈顶地址。
从0x2000 0000到0x2000 xxxx即为程序所运行的范围,该段内存分布为:RW段、ZI段:其中RW段为可读写的非0数据段,ZI段包括了0数据段、堆区、栈区。
2)跳转至复位中断(Reset_Handler(void))
从0x0800 0004读取中断向量表的首地址(即复位中断入口地址),装入PC程序计数器,跳转执行
3)系统时钟设置(在复位中断程序内被调用)
进行系统时钟的初始化,该函数内含VTOR寄存器设置,即中断向量偏移设置:
SCB->VTOR = FLASH_BASE | VECT_TAB_OFFSET;
产品IAP由bootloader跳转app程序时,需要设置中断向量偏移
4)跳转至标准库_main()程序
LDR R0,=_main
该部分主要进行两部分工作:
数据段加载:把RW段(初始化为非0值的全局变量)从Flash搬运到SRAM中
开辟堆栈:依照启动文件所设置的堆栈大小初始化堆栈区域;
该处需要注意:如果编译勾选了using micro_lib,程序则采用单区存放堆栈的方式;否则,采用双区存储的方式,分别初始化堆区、栈区。
工程师在设计IAP时,需要注意该点可能会带来意料不到的一些问题
5)进入C文件中的main函数
|