相对于 ARM 上一代的主流 ARM7/ARM9 内核架构,新一代 Cortex 内核架构的启动方式有
了比较大的变化。ARM7/ARM9 内核的控制器在复位后,CPU 会从存储空间的绝对地址
0x000000 取出第一条指令执行复位中断服务程序的方式启动,即固定了复位后的起始地址
为 0x000000(PC = 0x000000)同时中断向量表的位置并不是固定的。而 Cortex-M3 内核
则正好相反,有 3 种情况:
1、 通过 boot 引脚设置可以将中断向量表定位于 SRAM 区,即起始地址为 0x2000000,同
时复位后 PC 指针位于 0x2000000 处;
2、 通过 boot 引脚设置可以将中断向量表定位于 FLASH 区,即起始地址为 0x8000000,同
时复位后 PC 指针位于 0x8000000 处;
3、 通过 boot 引脚设置可以将中断向量表定位于内置 Bootloader 区,本文不对这种情况做
论述;
而 Cortex-M3 内核规定,起始地址必须存放堆顶指针,而第二个地址则必须存放复位中断
入口向量地址,这样在 Cortex-M3 内核复位后,会自动从起始地址的下一个 32 位空间取出
复位中断入口向量,跳转执行复位中断服务程序。 对比 ARM7/ARM9 内核,Cortex-M3 内
核则是固定了中断向量表的位置而起始地址是可变化的。
有了上述准备只是后,下面以 STM32 的 2.02 固件库提供的启动文件“stm32f10x_vector.s”为
模板,对 STM32 的启动过程做一个简要而全面的解析。
程序清单一:(汇编语言编写)
;文件“stm32f10x_vector.s”,其中注释为行号
DATA_IN_ExtSRAM EQU 0 ;1
定义是否使用外部 SRAM,为 1 则使用,为 0 则表示不使用。此语行若用 C 语言表达则等
价于:define DATA_IN_ExtSRAM 0
/*********************************定义栈(栈的大小,区域,开辟的新栈 stack 的起始
地址也确定了)
Stack_Size EQU 0x00000400 ;2
第 2 行:定义栈空间大小为 0x00000400 个字节,即 1Kbyte。此语行亦等价于:
#define Stack_Size 0x00000400
AREA STACK, NOINIT, READWRITE, ALIGN = 3 ;3
第 3 行:伪指令 AREA,表示
Stack_Mem SPACE Stack_Size ;4
第 4 行:开辟一段大小为 Stack_Size 的内存空间作为栈。
__initial_sp ;5
第 5 行:标号__initial_sp,表示栈空间顶地址。
/*******************************定义堆(大小,区域,始末地址 heap)
Heap_Size EQU 0x00000400 ;6
第 6 行:定义堆空间大小为 0x00000400 个字节,也为 1Kbyte。
AREA HEAP, NOINIT, READWRITE, ALIGN = 3 ;7
第 7 行:伪指令 AREA,表示
__heap_base ;8