2021/08/09 STM32启动文件学习 启动文件作用:
- 初始化堆栈指针SP
- 初始化PC指针
- 初始化中断向量表
- 配置系统时钟
- 调用C库—main函数进入到主程序
启动文件使用的ARM汇编指令: EQU:等于 AREA:汇编一个代码段或数据段 STACK:段名,可更改 NIINIT:可初始化 READWRITE:可读可写 ALIGH=3:2的3次方8字节对齐 SPACE:分配内存空间 PRESERVE8:当前文件堆栈需要按照8字节对齐 EXPOERT:声明一个标号具有全局属性,可被外部文件使用 DCD:以字为单位分配内存,要求4字节对齐,并要求初始化这些内存 PROC:定义子程序,与ENDP成对使用,表示子程序结束 WEAK:弱定义(编译器指令),优先使用外部文件定义的标号 IMPORT:声明标号来自外部文件,和C中EXTERN类似 B:跳转到一个标号 END:到达文件的末尾,文件结束
1.配置栈:变量(局部、全局),函数调用 Stack_Size EQU 0x00000800
AREA STACK, NOINIT, READWRITE, ALIGN=3
Stack_Mem SPACE Stack_Size __initial_sp //紧挨着SPACE语句放置,表示栈的结束地址,即栈顶地址,栈是由高向低生长的。 入栈由高地址往低地址偏移 2.配置堆:主要用于动态内存的分配,malloc() Heap_Size EQU 0x00000200;0x10000000;0x00000200
AREA HEAP, NOINIT, READWRITE, ALIGN=3
__heap_base Heap_Mem SPACE Heap_Size __heap_limit
PRESERVE8
THUMB
3.初始化中断向量表 AREA RESET, DATA, READONLY EXPORT __Vectors EXPORT __Vectors_End EXPORT __Vectors_Size 定义一个数据段,名为RESET,只读。并声明_Vectors、__Vectors_End、__Vectors_Size这三个标号具有全局属性,可供外部的文件调用。
4.复位程序; Reset handler Reset_Handler PROC EXPORT Reset_Handler [WEAK] IMPORT SystemInit IMPORT __main LDR R0, =SystemInit //从存储器中加载字到R0寄存器中 BLX R0 //跳转到由寄存器给出的地址,并根据寄存器的LSE确定处理器的状态,还要把跳转前的下条指令地址保存到LR LDR R0, =__main BX R0 ENDP //跳转到由寄存器/标号给出的地址,不用返回
- 中断服务函数
- 堆栈初始化,这个由C库函数—main来实现的
|