启动文件作用:
- 初始化堆栈指针SP
- 初始化PC指针
- 初始化中断向量表
- 配置系统时钟
- 调用C库函数_main,最终去到C的世界
;1-栈配置,用于变量,函数调用
Stack_Size EQU 0x00000400 ; 1KB
AREA STACK, NOINIT, READWRITE, ALIGN=3 ;名字叫STACK,不初始化,可读可写,8字节对齐
Stack_Mem SPACE Stack_Size
__initial_sp ;初始化sp栈顶地址
; 2-堆配置,用于malloc等函数的动态内存分配
Heap_Size EQU 0x00000200 ;512Byte
AREA HEAP, NOINIT, READWRITE, ALIGN=3 ;名字叫HEAP,不初始化,可读可写,8字节对齐
__heap_base
Heap_Mem SPACE Heap_Size ;大小
__heap_limit
PRESERVE8 ;当前堆栈8字节对齐
THUMB ;兼容 THUMB 指令,老的指令,16bit,现在Cortex-M3的都是THUMB-2指令,兼容16/32位
;3-向量表,存的是中断服务函数的名称,即地址
; Vector Table Mapped to Address 0 at Reset,这里的0地址指的是FLASH的起始地址
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 DMA2_Channel4_5_IRQHandler ; DMA2 Channel4 & Channel5
__Vectors_End
__Vectors_Size EQU __Vectors_End - __Vectors
AREA |.text|, CODE, READONLY
;4-复位程序,系统上电后第一个要执行的程序
; Reset handler
Reset_Handler PROC ;定义子程序与ENDP成对使用
EXPORT Reset_Handler [WEAK] ;弱定义,可以由其他文件实现,如果没定义才执行汇编里的
IMPORT __main ;相当于C语言中的extern
IMPORT SystemInit ;初始化系统时钟,由用户定义
LDR R0, =SystemInit
BLX R0
LDR R0, =__main ;C库函数,实现堆栈的初始化和调用c里面的main函数
BX R0
ENDP
;5-中断服务程序,全部为空,需要自己在C程序里面另外实现,但是函数名字必须跟这里的一样
;如果不一样,则会执行这里的中断服务函数,即无限循环,出现这样的错误很难发现
; Dummy Exception Handlers (infinite loops which can be modified)
;内容省略
;6-用户堆栈初始化,由C库函数_main来完成
;*******************************************************************************
; User Stack and Heap initialization
;*******************************************************************************
IF :DEF:__MICROLIB ;这个宏在IDE(keil/IAR)里面配置
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
总体流程:
初始化栈-》 初始化堆-》 初始化中断向量表-》 编写复位程序-》 编写中断服务程序-》 用户堆栈初始化-》
小结:到现在,STM32的基础知识已经学完了,虽然有的东西还是云里雾里,但是至少留下了一个印象。希望在后面写程序的时候能够记起来,到时候不懂能知道去哪里查。其实还是边写代码边学好一点,拿起键盘就是干!