stm32启动代码概述
启动文件的作用:
启动文件是用汇编语言编写的一小段代码,用来初始化硬件电路以及为C语言应用程序作好运行前的准备,是任何微控制器(单片机)上电复位后程序运行的入口点。
为什么需要启动文件:
C语言运用程序往往从main函数开始执行。但一个经常会被忽略的问题是:微控制器(单片机)上电后,是如何寻找到并执行main函数的呢?学习单片机很长一段时间都以为单片机一上电就开始跑main函数,其实是错的。很显然微控制器无法从硬件上定位main函数的入口地址,因为使用C语言作为开发语言后,变量/函数的地址便由编译器在编译时自行分配(这里涉及到编译原理知识),这样一来main函数的入口地址在微控制器的内部存储空间中不再是绝对不变的。这时就需要相对应的启动文件。
启动代码包含的内容:
1、定义堆栈的大小(即分配堆和栈的大小)
2、中断向量表的定义
3、地址重映射及中断向量表的转移
4、设置系统时钟频率
5、堆栈的初始化
6、跳转到main函数入口
以stm32—Cortex-M0内核的启动代码为例,逐一解释启动代码的内容。
注意:stm32—ARM7/ARM9内核跟Cortex-M0的启动代码有些不同。
下面是代码详细解释:
1.定义堆栈大小
;定义栈的大小
Stack_Size EQU 0x00000400 ;定义stack_size为0x00000400
AREA STACK, NOINIT, READWRITE, ALIGN=3 ;定义栈,可初始化为0,8字节对齐
Stack_Mem SPACE Stack_Size ;分配0x400个连续字节,并初始化为0
__initial_sp ;汇编代码地址标号 (栈空间顶地址)
;定义堆的大小
Heap_Size EQU 0x00000200 ;定义heap_size为0x00000200
AREA HEAP, NOINIT, READWRITE, ALIGN=3 ;定义堆,可初始化为0,8字节对齐
__heap_base ;堆空间的起始地址
Heap_Mem SPACE Heap_Size ;分配0x400个连续字节,并初始化为0