初始化堆栈段
由于前面只是定义了堆栈段并没有初始化,这里对堆栈段进行初始化。就像定义了:int a; 初始化a = 1;也可以像代码段一样定义的同时就初始化:int b = 2;
下面代码中有个__MICROLIB,对应后面MDK截图的Use MicroLIB,如果选了勾选了Use MicroLIB,IF就为真,否则为假。
ALIGN
IF :DEF:__MICROLIB EXPORT __initial_sp EXPORT __heap_base EXPORT __heap_limit ELSE
IMPORT __use_two_region_memory EXPORT __user_initial_stackheap __user_initial_stackheap
LDR R0, =Heap_Mem LDR R1, = (Stack_Mem + Stack_Size) LDR R2, = (Heap_Mem + Heap_Size) LDR R3, = Stack_Mem BX LR ALIGN ENDIF
END
+++++++++++启动代码分析到此结束++++++++++++++
简化后的启动代码
1.去掉外部中断,去掉__MICROLIB判断,如果需要可以手动添加 2.去掉SystemInit,系统初始化可以在main函数里进行
3.去掉[WEAK],如果用户自己想定义内部中断服务程序可以加上[WEAK] ;定义栈
Stack_Size EQU 0x00000400
AREA STACK, NOINIT, READWRITE, ALIGN=3
Stack_Mem SPACE Stack_Size __initial_sp ;定义堆
Heap_Size EQU 0x00000200
AREA HEAP, NOINIT, READWRITE, ALIGN=3
__heap_base
Heap_Mem SPACE Heap_Size __heap_limit ;MDK关键字
PRESERVE8 THUMB
;定义并初始化中断向量表
AREA RESET, DATA, READONLY EXPORT __Vectors EXPORT __Vectors_End EXPORT __Vectors_Size
__Vectors DCD __initial_sp ; Top of Stack
DCD Reset_Handler ; Reset Handler DCD NMI_Handler ; NMI Handler
DCD HardFault_Handler ; Hard Fault Handler DCD MemManage_Handler ; MPU Fault Handler DCD BusFault_Handler ; Bus Fault Handler DCD UsageFault_Handler ; Usage Fault Handler DCD 0 ; Reserved DCD 0 ; Reserved DCD 0 ; Reserved DCD 0 ; Reserved
DCD SVC_Handler ; SVCall Handler
DCD DebugMon_Handler ; Debug Monitor Handler DCD 0 ; Reserved
DCD PendSV_Handler ; PendSV Handler DCD SysTick_Handler ; SysTick Handler
__Vectors_End __Vectors_Size EQU __Vectors_End - __Vectors ;定义并初始化代码段,程序正真的入口
AREA |.text|, CODE, READONLY
Reset_Handler PROC
; __main为运行时库提供的函数,会调用下面定义的__user_initial_stackheap,初始化堆栈。 IMPORT __main
LDR R0, =__main BX R0 ENDP
;异常服务程序,对应同一个死循环的地址 NMI_Handler HardFault_Handler MemManage_Handler BusFault_Handler UsageFault_Handler SVC_Handler
DebugMon_Handler PendSV_Handler
SysTick_Handler PROC
B . ENDP
;初始化堆栈
ALIGN IMPORT __use_two_region_memory EXPORT __user_initial_stackheap
__user_initial_stackheap
LDR R0, = Heap_Mem
LDR R1, = (Stack_Mem + Stack_Size) LDR R2, = (Heap_Mem + Heap_Size) LDR R3, = Stack_Mem BX LR ALIGN END
;*************************END OF FILE**********************************
;进入main
启动代码实战(点亮一个LED)
1. 打开Keil,新建工程,命名LED保存。
2. 选择芯片型号STM32F107VC,点击OK
3. 是否要默认启动代码,点击否
4. 新建启动文件,保存为start_up.s,并添加到工程中。
5. 新建C程序文件,保存为main.c,并添加到工作中
6. 拷贝启动代码到start_up.s中,并保存。
7. 拷贝C程序到main.c中,并保存。(C程序在最后)