STM32F103系列(十三):启动文件

本文深入剖析嵌入式系统的启动文件,详细介绍了启动过程、堆栈初始化、中断向量表配置及复位程序等内容。重点讲解了ARM汇编指令在启动文件中的应用,以及如何配置系统时钟和初始化用户堆栈。

1、启动文件简介
启动文件由汇编语言编写,是系统上电复位后第一个执行的程序,主要做了以下工作:
1)初始化堆栈指针:SP=_initial_sp。
2)初始化程序指针:PC=Reset_Handler。
3)初始化中断向量表。
4)配置系统时钟。
5)调用C库函数_main初始化用户堆栈,最终调用main函数进入C语言世界。

2 、查找ARM汇编指令
在讲解启动代码的时候,会涉及ARM的汇编指令和Cortex内核的指令,有关Cortex内核的指令可以参考《CM3权威指南Cn R2》第4章。剩下的ARM的汇编指令可以在MDK->Help->Uvision Help中检索到,以EQU为例,检索过程如图1-1所示。
在这里插入图片描述
图1-1 ARM汇编指令检索示例
检索出来的结果会有很多,我们只需要看Assembler User Guide这部分即可。表1-1列出了启动文件中使用到的ARM汇编指令,该表中的指令全部是从ARM Development Tools这个帮助文档里面检索而来。其中编译器相关的指令WEAK和ALIGN为了方便讲解也放在这个表格中了。
表1-1 启动文件使用的ARM汇编指令汇总
在这里插入图片描述
3 、启动文件代码讲解
1.Stack——栈

    1 Stack_Size       EQU     0x00000400
    2
    3                   AREA    STACK, NOINIT, READWRITE, ALIGN=3
    4 Stack_Mem        SPACE   Stack_Size
    5 __initial_sp

开辟栈的大小为0x00000400(1k B),名字为STACK,NOINIT即不初始化,可读可写,8(23)字节对齐。
栈是用于局部变量、函数调用、函数形参等的开销,栈的大小不能超过内部SRAM的大小。如果编写的程序比较大,定义的局部变量很多,那么就需要修改栈的大小。如果某一天,你写的程序出现了莫名奇怪的错误,并进入了硬fault,这时就要考虑下是不是栈不够大,溢出了。

EQU:宏定义的伪指令,相当于等于,类似于C中的define。
AREA:告诉汇编器汇编一个新的代码段或者数据段。STACK表示段名,这个可以任意命名;NOINIT表示不初始化;READWRITE表示可读可写,ALIGN=3,表示按照23对齐,即8字节对齐。
SPACE:用于分配一定大小的内存空间,单位为字节。这里指定大小等于Stack_Size。
标号__initial_sp紧

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值