参考文档地址:https://www.cnblogs.com/strongwong/p/8657639.html

关于nrf52832上电启动分析:

启动所需要做的事:

堆栈的初始化、初始化中断向量表、在进入main之前初始化时钟

启动过程中用的.s文件

arm_startup_nrf52.s

关于nrf52832上电启动分析

定义堆栈,堆栈的数据都时在RAW中

然后定义RESET区域

关于nrf52832上电启动分析

然后是定位中断向量表:

关于nrf52832上电启动分析

第一条指令对应的堆栈,从第二条指令开始进入Reset Handler

关于nrf52832上电启动分析

在Reset_Handler中会先经SystemInit函数导入,可以理解成初始化时钟

对于SystemInit的理解:为啥需要在main之前初始化时钟,以前看过最标准的理解是,CPU启动工作的这段时间,内存、外设等设备还没有启动,需要CPU分配时钟来启动外设,然后分配堆栈空间,并且将存在到flash的数据copy到RAW然后在跳入到main中。

仔细观察SystemInit函数,发现没有变量,操作的都是寄存器,个人理解,局部变量就需要分配堆栈地址,而堆栈又是在内存,无法实现。

关于nrf52832上电启动分析

之后在初始化库函数,然后最终进入main函数

然后是具体的分析.hex文件

.hex文件和.s文件是一一对应

关于nrf52832上电启动分析

从图中可以看到0x00000000的位置是RAW的0x2002080也就数栈的位置

函数地址

 

Reset_Handler      0x00000004 

NMI_Handler        0x00000008

.........

和向量表中的位置是一一对应

 

 

 

 

 

相关文章: