浅析stm32启动文件
文章目录
1.什么是启动文件?
我们来看gpt给出的答案:
STM32的启动文件是一个关键的汇编语言源文件,它负责在微控制器上电或复位后执行最初的硬件配置和环境设置,为执行C语言的main函数做好准备。这个文件通常命名为
startup_stm32xxxx.s
,其中xxxx
代表特定的STM32系列和型号,例如startup_stm32f429_439xx.s
或startup_stm32f10x_md.s
。启动文件的主要功能包括但不限于:
初始化栈指针 (
Stack Pointer
,SP):设置栈区的起始地址,确保函数调用和中断处理时有地方存放局部变量和保存CPU状态。初始化程序计数器寄存器 (
Program Counter
,PC):设置程序开始执行的地址,通常是复位向量地址。配置中断向量表:定义中断服务程序的入口地址,确保在发生中断时能正确跳转到对应的处理函数。
系统时钟配置 :某些启动文件或与其配合的C代码(
system_stm32f10x.c
)会进行基本的时钟设置,以确保CPU和外设能够按预期频率工作。C库初始化 :调用
_init()
函数来初始化C库,包括全局变量的初始化和静态构造函数的调用。堆(heap)和栈(stack)的配置:尽管启动文件中可能包含对堆的基地址和大小的定义,但实际是否使用堆以及其大小,取决于应用代码中的动态内存分配需求。如果应用未使用堆,那么即使启动文件中有定义,编译后的映射文件(map file)中也不会显示堆的信息。
启动文件中关于栈和堆的大小配置(如
Stack_Size
和Heap_Size
)可以根据具体应用的需求进行调整。如果程序中使用了大量的递归调用或者大的局部变量,可能需要增大栈的大小;如果程序中频繁进行动态内存分配,则可能需要更大的堆空间。此外,中断矢量表的起始地址初始化通常在启动文件的复位处理程序中完成,通过设置系统控制块(
System Control Block
, SCB)的相应寄存器来指向中断向量表的起始位置。
什么意思呢?其实就是启动文件是系统上电后编译的第一个文件,主要完成了以下几个工作:
- 初始化堆栈指针SP=_initial_sp
- 初始化PC指针=Reset_Handler
- 初始化中断向量表
- 配置系统时钟
- 调用C库函数_main初始化用户堆栈,从而最终调用main函数去到C的世界
所以对于不同的芯片型号来说,芯片的启动文件也存在差异,然而那如何来选择启动文件呢?这就需要我们来了解启动文件的命名规则。
2.启动文件的命名规则
从上面这个表格就知道启动文件的类型和选择和芯片型号以及内存大小息息相关,而我们我们如何来确定自己芯片的Flash容量呢,就常见的F103系列就有很多的型号,我们如何来选择适合自己芯片的型号呢?这就需要了解芯片的命名规则。
3.stm32芯片的命名规则
通过手册中的解释我们就知道STM32的芯片型号遵循一定的结构,用以标识其系列、类型、性能、引脚数目、存储容量、封装类型等关键特性。而我们选择启动文件想要了解不同芯片的Flash,就需要关注芯片的存储容量标识:
如6(32K字节)、8(64K字节)、B(128K字节)、C(256K字节)、D(384K字节)、E(512K字节)、G(1M字节)等等。
通过对芯片型号的确定和第二部分各个系列对应的启动文件就可以正确选择启动文件。
(1M字节)等等。
通过对芯片型号的确定和第二部分各个系列对应的启动文件就可以正确选择启动文件。