STM32的启动模式和启动文件
每个处理器在出厂是已经固化了其寄存器的默认值,这些值决定了处理器上电时刻的行为。 程序计数器的默认值决定了处理器从那个具体的地址过去第一条需要执行的指令。例如(华大460默认值0x0000 0000) ,则程序从(0x0000 0000)开始运行。至于是从哪个存储设备启动,需要硬件设计来决定,
三种启动模式(通过BOOT【1:0】引脚选择)
(1) BOOT0 = 0 : 主闪存启动(正常工作模式)
(2) BOOT1 = 0, BOOT0 = 1 : 系统存储器启动(启动程序由厂家决定)
(3) BOOT1 = 1, BOOT0 = 1 : 内置SRAM启动(调试时使用)(可解除FLASH的读写保护)
启动文件
Stack_Size EQU 0x00000200
AREA STACK, NOINIT, READWRITE, ALIGN=3
;//伪指令AREA,表示开辟Stack_Size大小的内存空间作为栈,段名是STACK
;//NOINIT:指此数据段仅保留内存单元,内存单元的值无初始化或初始化为0
Stack_Mem SPACE Stack_Size
;//分配连续的Stack_Size字节的存储单元,并初始化为0
__initial_sp ;//栈顶
Heap_Size EQU 0x00000000
AREA HEAP, NOINIT, READWRITE, ALIGN=3
;//ALIGN 8字节对其
__heap_base ;//堆栈空间起始地址
Heap_Mem SPACE Heap_Size
__heap_limit ;//堆栈空间结束地址
IMPORT xPortPendSVHandler ;//IMPORT声明来自外部的文件
IMPORT xPortSysTickHandler
IMPORT vPortSVCHandler
PRESERVE8 ;//当前文件8字节对其
THUMB
; Vector Table Mapped to Address 0 at Reset
AREA RESET, DATA, READONLY ;//只读数据段,段名RESET
EXPORT __Vectors ;//EXPORT为声明外部标号 可在其他文件引用
;// DCD指令:开辟一段空间,后面的__initial_sp,Reset_Handler等类似函数指针的作用,指向中断服务函数
__Vectors DCD __initial_sp ; Top of Stack
DCD Reset_Handler ; Reset Handler
DCD NMI_Handler ; NMI Handler
AREA |.text|, CODE, READONLY ;//可读代码段,段名.text
; Reset Handler
Reset_Handler PROC ;//PROC ENDP 程序分段
EXPORT Reset_Handler [WEAK];//类似弱定义
IMPORT __main ;//IMPORT声明来自外部的文件
LDR R0, =__main ;//__main完成堆栈初始化的工作,最后跳转到 C 程序中的 main 函数,有的文件在这之前会执行SystemInit(),配置时钟
BX R0
ENDP