STM32启动文件内容详解

前言

使用STM32单片机时候,必须导入对应型号的启动文件。这个笔记在于对于启动文件的内容的分析,基于基本的stm32F103型号的单片机的启动文件stm32f10x.hd.s进行进行分析。具体的参考资料和分析参考《STM32F10X-中文参考手册》中的第九章-中断和事件:表 55 其他 STM32F10xxx 产品(小容量、中容量和大容量)的向量表; MDK 中的帮助手册—ARM Development Tools:用来查询ARM 的汇编指令和编译器相关的指令。

启动文件简介

启动文件由ARM的汇编语言编写,是系统上位复位所执行的第一个程序,存在的意义在对单片机进行一定的初始化工作,主要的工作如下:

  1. 初始化堆栈指针 SP=_initial_sp
  2. 初始化PC指针 Reset_Handler
  3. 初始化中断向量表
  4. 配置系统的时钟
  5. 调用 C 库函数 _main 初始化用户堆栈

在阅读启动文件的时候,必须要知道其使用的ARM的汇编语言。不过也不多,具体的细节可以参考《CM3 权威指南 CnR2》第四章:指令集以及 MDK->Help->Uvision Help
在这里插入图片描述

为了方便分析我将使用的ARM汇编语言整理成下表IF

指令名称 作用
EQU 给变量取一个符号名字,类似C语言中的define
AREA 汇编一个新的代码段或者数据段
SPACE 分配内存空间
PRESERVE8 当前的文件的堆栈必须按照8字节进行对齐
EXPORT 声明一个标号为全局变量,可以被外部的文件引用
DCD 以字为单位分配内存,要求4字节对齐,并对分配的内存进行初始化
PROC 定义子程序,和ENDP成对的出现
WEAK 弱定义,如果外部声明一个标号,则优先使用外部文件定义的标号, 如果外部没有定义也不会出错,注意:不是ARM的指令而是汇编器keil本身的指令
IMPORT 声明标号来自外部文件,和C语言中的EXTERN可以类似比较
B 跳转到另一个标号
ALIGN 编译器对指令或者数据的存放的地址进行对齐,缺省表示4字节对齐,这个同样是汇编器的指令
END 文件结束
IF ELSE ENDIF 汇编的判断语句

有以上的汇编的基础这时候进行阅读启动文件就可以比较清楚明白代码的含义

启动文件分析

为了比较清楚的分析启动文件,我对其进行分块的分析,

栈的初始化
Stack_Size      EQU     0x00000400

                AREA    STACK, NOINIT, READWRITE, ALIGN=3
Stack_Mem       SACE   Stack_Size
__initial_sp

定义Stack_Size的长度为1KB,对栈命名为STACK NOINIT表示不初始化,可读可写,对其方式为2^3字节对齐。

这里补充一下栈的作用,一般程序中的全局变量和局部变量以及函数的开销自动在栈上分配的。必须注意的是栈的大小不能超过内部的SRAM的大小。如果编写的程序的变量过多的话,并且出现一些奇怪的错误,这个时候软件排除bug后,错误依然存在,就要考虑这个栈是不够大。__initial_sp表示栈的

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值