STM32启动文件的学习记录

本文记录了STM32启动文件的学习过程,详细讲解了其在初始化SP、PC、设置向量表和配置时钟等方面的角色。通过汇编语言解析,阐述了栈和堆空间的分配,以及向量表的映射。同时,讨论了中断服务函数的预留和用户堆栈的初始化方法,深入理解了嵌入式系统的启动流程。
摘要由CSDN通过智能技术生成

STM32启动文件的学习记录

最近我正在学习嵌入式系统,目前正在学习汇编语言,正好也在学习STM32,想要看一下STM32启动文件中的内容,随便记录以下。

在第一个注释框中主要介绍了这个文件的作用、实现的功能。这个文件主要是实现初始化SP、初始化PC、用额外的ISR地址设置向量表项、配置时钟系统,同时安装SRAM作为数据存储器。

接下来就是进行汇编语言的解释:

  1. 设置栈空间的大小

    用于局部变量,函数调用,函数形参等的定义,但是栈的大小不能超过内部SRAM的大小,当某一天出现了硬fault的时候,要考虑栈的溢出问题。

    下图中开辟栈的大小为0X00000400(1KB),名字为STACK,NOINIT是指不进行初始化,可读可写,8(2^3)字节对齐。
    请添加图片描述

    EQU 指令是对数字常量取一个符号名称,相当于C语言中的define。

    AREA 指令是一个新的代码段或者数据段

    SPACE 指令是分配内存的空间,单位为字节

    __initial_sp 指令代表着栈空间的结束地址,栈顶的地址。

  2. 设置堆空间的大小

    堆空间主要用来设置动态内存的分配,如果程序上没有使用malloc()函数的时候,就用不到这里的代码。

    下图中是开辟堆的空间的大小为0X00000200(512字节),名字为HEAP,不进行初始化,可读可写,8字节对齐。

    __heap_base是堆的起始地址。

    __heap_limit是堆的结束地址。
    请添加图片描述

    PRESERVE8 指令是指当前文件的堆栈按照8字节对齐

    THUMB 指令是表示后面的指令能兼容THUMB指令

  3. 向量表映射到0地址,作为重启的入口,处理中断。

    当程序发生异常的时候,会开启对应的异常服务例程(ESR),但是ESR的例程的起始地址在哪里需要使用向量表来查找,向量表是一个WORD(32位整数)的数组。向量表从FLASH的0地址开始,以4字节为一个单位,栈顶指针存放在地址0的位置,0X04是存放的复位中断的地址,依次类推得到最后的向量表。

    下图中是定义了一个数据段,名称为RESET,可读。
    请添加图片描述

    EXPORT 指令是定义一个全局的属性,可以让外部的文件使用。
    DCD 指令是分配一个或者多个字节为单位的内存,以四字节对齐,并且初始化内存,在向量表中,DCD分配了一堆内存,并使用ESR的入口地址初始化。

    下图中是对向量表的定义

    __Vectors是指向量表的开始

    __Vectors_End是指向量表的结束

    下面利用DCD指令来分配一些内存
    请添加图片描述

  4. 复位子程序–上电之后首先执行的程序
    请添加图片描述

    PROC 指令是定义子程序的伪指令。

    WEAK 指令是弱定义,若在别的地方定义了这个函数,那么调用别的地方的函数,若在别的地方没有定义则调用这个地方的函数。

    IMPORT指令是导入其他文件中的函数。

    LDR 指令是指从存储器中加载到寄存器中

    BL 指令是跳转到寄存器给出的地址,并把跳转前的下条指令地址保存到LR中。

    BLX 指令是跳转到由寄存器给出的地址,并根据寄存器的LSE确定处理器的状态,把跳转之前的下一条指令地址保存到LR中。

    BX 指令是跳转到由寄存器给出的地址,不用返回。

    ENDP指令是结束一个子程序。

  5. 文件中定义了很多空的中断服务,如下图所示,在使用某一个外设的时候,开启中断,就需要调用并重写这里面的中断服务函数。
    请添加图片描述

  6. 进行用户堆栈的初始化
    请添加图片描述

    首先判断是否定义了__MICROLIB,如果定义了这个宏,则定义下面的三个全局属性,如果没有定义这个宏,则使用双段存储器模式,并声明一个全局属性,让用户来自己初始化堆栈。

    Align指令是对数据或者指令的存放方式进行地址对齐,后面跟一个立即数,如果不写则表示4字节对齐。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值