启动文件由汇编编写,是系统上电复位后第一个执行的程序。 启动文件主要做了以下工作: 即main函数之前要完成如下步骤:
1、初始化堆栈指针 SP = _initial_sp
2、初始化程序计数器指针 PC = Reset_Handler
3、设置堆和栈的大小
4、初始化中断向量表
5、配置外部 SRAM 作为数据存储器(可选)
6、配置系统时钟,通过调用 SystemInit 函数(可选)
7、调用 C 库中的 _main 函数初始化用户堆栈,最终调用 main 函数
stm32启动流程图
启动模式选择(下载方式)
在以前 ARM7/ARM9 内核的控制器在复位后,CPU 会从存储空间的绝对地址STM32 启动文件浅析 0x00000000 取出第一条指令执行复位中断服务程序的方式启动,即固定了复位后的起始地 址为 0x00000000(PC = 0x00000000),同时中断向量表的位置也是固定的。而 Cortex-M3 内核复位后的起始地址和中断向量表的位置可以被重映射。充映射的方法是通过启动模式的 选择,有以下 3 种情况:
• Boot0、Boot1选择启动方式(boot0/1==0/1) 最常用的是主Flash 三种启动方式
汇编语言
IMPORT |
声明标号来自外部文件,跟 C 语言中的 EXTERN 关键字类似 |
EXPORT |
声明一个标号具有全局属性,可被外部的文件使用 |
EQU |
给数字常量取一个符号名,相当于 C 语言中的 define |
AREA |
汇编一个新的代码段或者数据段;用来声明一个内存区域的开始 |
SPACE |
分配内存空间 |
PRESERVE8 |
当前文件堆栈需按照 8 字节对齐 |
DCD |
以字为单位分配内存,要求 4 字节对齐,并要求初始化这些内存 |
PROC |
定义子程序,与 ENDP 成对使用,表示子程序结束 |
WEAK |
弱定义,如果外部文件声明了一个标号,则优先使用外部文件定义的标号,如果外部文件没有定义也不出错。要注意的是:这个不是 ARM的指令,是编译器的,这里放在一起只是为了方便。 |
B |
跳转到一个标号 |
ALIGN |
编译器对指令或者数据的存放地址进行对齐,一般需要跟一个立即数,缺省表示 4 字节对齐。要注意的是:这个不是 ARM 的指令,是编译器的,这里放在一起只是为了方便。 |
END |
到达文件的末尾,文件结束 |
IF,ELSE,ENDIF |
汇编条件分支语句,跟 C 语言的 if else 类似 |
STM32启动文件初探之startup_stm32f10x_hd.s
栈空间的开辟
Stack_Size EQU 0x00004000
AREA STACK, NOINIT, READWRITE, ALIGN=3
Stack_Mem SPACE Stack_Size
__initial_sp
第一行: EQU:宏定义的伪指令,给数字常量取一个符号名,类似与 C 中的 define。定义栈大小为 0x00004000 字节,即 16384B(1KB=1024B,16384/1024=16KB),常量的符号是 Stack_Size。
第二行: AREA 汇编一个新的代码段或者数据段。段名为 STACK,段名可以任意命名; NOINIT 表示不初始 化; READWRITE 表示可读可写;ALIGN=3,表示按照 2^3 对齐, 即 8 字节对齐。
伪指令AREA,表示名字为 STACK,是这个内存区域的名称。在这里,它指代程序的堆栈区域,堆栈是用于存储函数调用时的局部变量、函数参数以及处理器的状态信息等的内存区域
NOINIT 这是一个属性,表示该区域中的数据在程序初始化时不赋予任何初始值。换句话说,这块内存区域的内容在程序开始执行时是未定义的,可能包含随机值。
READ