startup_stm32f10x_hd.s:
1. 开辟栈空间
Stack_Size EQU 0x00000400 ;
AREA STACK, NOINIT, READWRITE, ALIGN=3
Stack_Mem SPACE Stack_Size
__initial_sp
开辟大小为0x00000400(1kb)的栈,名为STACK,NOINIT即不初始化,READWRITE表可读可写,ALIGN=3表8(2^3)字节对齐
EQU: 宏定义的伪指令,类似于c语言中的#define
AREA: 告诉汇编器开辟一个新的代码段或者数据段
SPACE: 用于分配一个一定大小的内存空间,以字节为单位,这里指定的大小为Stack_size
__initial_sp: 这是一个标号,它紧接在SPACE之后,表栈的开始地址。注意,栈的开始地址是栈顶,ARM是满降栈的,也就是栈由高向低生长。
2. 开辟堆空间
Heap_Size EQU 0x00000200
AREA HEAP, NOINIT, READWRITE, ALIGN=3
__heap_base
Heap_Mem SPACE Heap_Size
__heap_limit
PRESERVE8
THUMB
堆是用于内存动态分配malloc的,这里开辟大小为0x00000200(512字节)的堆,名字为HEAP,不初始化,可读可写,8字节对齐。__heap_base表示堆的起始地址,__heap_limit表示堆的结束地址。堆是由低向高生长的。
PRESERVE8表指定当前文件的堆栈按照8字节对齐,THUMB表示接下来的指令兼容THUMB指令。THUMB是ARM老的16bit的指令集,现在Cortex-M系列的ARM都使用32bit的THUMB-2指令集,它兼容16bit和32bit的指令。
3. 定义向量表
AREA RESET, DATA, READONLY
EXPORT __Vectors
EXPORT __Vectors_End
EXPORT __Vectors_Size
“AREA RESET, DATA, READONLY”是定义一个名为RESET的数据段,只读。
“__Vectors”、”__Vectors_End”、”__Vectors_Size”用EXPORT声明的标号,使其具有全局属性,可供外部文件调用。
这个数据段充当一张异常向量表。__Vectors为向量表起始地址,__Vectors_End为向量表的结束地址。两个相减即可算出向量表的大小。当内核去响应一个异常后,对应的异常服务函数就会得到执行。异常向量表则是决定这些服务程序的入口地址。异常向量表其实是一个32位整型数组,每个数组元素代表一种异常,数组元素的值等于服务程序的入口地址。异常向量表的起始地址可以通过NVIC(嵌套向量中断控制器)设置的,NVIC对应该设置地址功能的位复位值为0,所以地址0必须是一张中断向量表。
由手册存储器映像图获知,STM32的0地址处是用来映射的。
STM32启动的方式如下:
(1)用户闪存存储器: 用户代码烧录在这里,STM32正常启动时就是从这里启动
(2)系统存储器: 实现ISP下载功能。ISP(in-system programming)意为在系统编程。烧录程序时不需要烧录器,PC机通过串口把BIN/HEX文件直接烧录到单片机内部FLASH中
(3)内嵌SRAM: 实现调试器调试功能用
当选择从用户闪存存储器(flash)启动时候,0x0地址就会把flash的起