0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

STM32启动文件简介、详细步骤及代码讲解

CHANBAEK 来源:南山府嵌入式 作者:南山府嵌入式 2023-01-19 17:57 次阅读

01启动文件简介

startup_stm32f429_439xx.s是STM32的启动文件。

刚开始我一直认为STM32程序开始执行是从main函数开始。后来网上查查不是。原来在执行main函数之前,需要先执行一段汇编程序和完成C语言资源硬件的初始化工作。就是以下几个功能:

1--初始化栈指针MSP=_initial_sp。

2--初始化复位程序计数寄存器值=Reset_Handler。

3--初始化异常/ 中断向量表。

4--系统时钟配置。

5--C库函数_main初始化用户堆栈的调用 。

02文件启动步骤

1-在启动的时候,先对堆栈的大小定义,并在代码区的起始位置建立异常中断向量表。然后在复位中断中服务程序中跳转执行C标准库main函数,以上这些完成后,跳转到主程序中的main函数执行相关函数应用。但是假如STM32F429单片机被设置成从内部flash启动的,这时候,片内Flash被映射到程序启动空间,异常/中断向量表实际的开始地址为0x8000000(查看STM32F4参考手册可得到),则栈顶地址存放在0x8000000处,复位中断存放在0x8000004处,若STM32F4遇到复位信号,则从0x8000004处取出复位中断服务入口地址,继而执行中断服务函数,绕后跳转到main函数,最终进入main函数。由此我们可以得下面这个图:

在这里插入图片描述

03启动代码讲解

01栈(Stack)

我们可以在.s这个文件中看到堆栈信息如图:

Alt

根据上面的图片我们可以知道。

在startup_stm32f429_439xx.s文件中,将栈的大小设为0x00000400(1KB)F429是0x30000(192KB),Stack_Mem为栈名,不初始化可读可写,8字节对齐。Stack_Size是栈的大小,__initial_sp表示结束地址(栈顶地址,栈是由高字节向低字节生长的)。

栈的主要作用是用于局部变量、函数调用、函数形参的开销大小应小于内部RAM大小,考虑到局部变量的需求,防止栈溢出。

EQU:宏定义的伪指令,相当于等于,类似与 C 中的 define;

AREA:告诉汇编器汇编一个新的代码段或者数据段;

SPACE:用于分配一定大小的内存空间,单位为字节;这里的大小等于Stack_Size。

DCD:数据定义( Data Definition )伪指令,单位是字(4字节);

伪指令(Pseudo instruction):用于告诉汇编器如何进行汇编的指令,不生成可执行代码。

总结如下图所示:

Dingtalk_20221206154648.jpg

02堆(Heap)

在.s54行中如下图这些代码:

在这里插入图片描述

这些代码中,堆的大小设为0x00000200(512B),其中Heap_ Mem是栈名,不初始化,可读可写,8(23)字节对齐。Heap_Size为堆的大小, heap_base为堆的起始地址,heap_limit为堆的结束地址,因为堆是由低地址向高地址生长的。

堆的作用是用于malloc()函数申请的动态内存的分配。

04中断向量表

在这里插入图片描述

PRESERVE8:指定当前文件的堆栈按照 8 字节对齐THUMB:表示后面指令为 THUMB 指令。THUBM 是 ARM 以前的指令集, 16bit,现在 Cortex-M 系列的都使用 THUMB-2 指令集, THUMB-2 是 32 位的,兼容 16 位和 32 位的指令,是 THUMB 的超级!

Dingtalk_20221206154648.jpg

EXPORT:声明一个标号具有全局属性,可被外部的文件使用。如果是 IAR 编译器,则使用的是 GLOBAL 这个指令。

在这里插入图片描述

——Vectors是异常/中断向量表的起始位置,_Vectors_End是中断向量表的结束位置,vectors__Size中断向量表的大小。

TM32F42XX/STM32F43XX部分中断向量表

在中断向量表中的每一个位置存储都是一个4字节服务程序入口地址,如果有中断请求并且MCU进行了请求的响应,那么MCU就会找到向量表中找到对应的中断位置,找到中断复位程序入口地址到程序计数寄存器,进而执行中断。

在这里插入图片描述

在这里插入图片描述

具体的详细中断向量表请参看数据手册以及启动文件。

05复位中断服务程序

在这里插入图片描述

这句话的意思是定义一个名为.text代码段,可读

在这里插入图片描述

复位中断服务程序是系统上电后第一个执行的程序,调用Systemlnit函数初始化系统时钟,然后调用C库函数mian,最终调用 main 函数进入C程序的世界。

LDR:从存储器加载字到一个寄存器

BL:跳转到由寄存器/标号给出的地址,并把跳转前的下条指令地址保存到链接寄存器。

BLX:跳转到由寄存器给出的地址,并根据寄存器的LSE确定处理器的状态,还要把跳转前的下条指令地址保存到链接寄存器。

BX:跳转到由寄存器/标号给出的地址,不用返回。

WEAK:表示弱定义,如果外部文件优先定义了该标号,则首先引用该标号,可以在C语言中重新定义中断服务程序;如果在启动文件之外没有重新定义中断服务程序,则在对应的异常/中断向量表位置处存储的是汇编文件定义的中断服务程序入口地址。如果在启动文件外,在另外一个C文件中重新定义了中断服务程序,则在对应的异常/中断向量表位置处存储的是C文件中的中断服务程序入口地址。需要注意的是,启动文件中的中断服务程序的名称和C文件中重新定义的中断服务程序名称必须保持一致。

IMPORT:表示该标号来自外部文件,跟C语言中的关键字EXTERN类似。这里表示Systemlnit 和main 这两个函数均来自外部的文件。

Systemlnit是一个标准的库函数,在system_stm32f4xx.c这个库文件中定义,主要作用是配置系统时钟,在调用这个函数之后,STM32F429的系统时钟被配置为180MHz。

main是一个标准的C库函数,主要作用是初始化用户堆栈,最终调用main函数进入C程序的世界。在C应用程序中,必须有一个main函数。需要注意的是,_main不是用户C程序的main 函数。

异常和中断服务程序

Dingtalk_20221206154648.jpg

Dingtalk_20221206154648.jpg

07用户堆栈初始化

Dingtalk_20221206154648.jpg

判断是否定义了__MICROLIB,如果定义了则赋予标号__initial_sp(栈顶地址)、__heap_base(堆起始地址)、__heap_limit(堆结束地址)全局属性,可供外部文件调用。如果没有定义(实际的情况就是我们没定义__MICROLIB),则使用默认的C库函数,然后初始化用户堆栈大小,这部分由C库函数__main来完成,当初始化完堆栈之后,就调用main函数去到C程序的世界。

IF、ELSE、ENDIF:汇编的条件分支语句,跟C语言的if、else类似。

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • STM32
    +关注

    关注

    2240

    文章

    10675

    浏览量

    348866
  • C语言
    +关注

    关注

    180

    文章

    7534

    浏览量

    128852
  • 函数
    +关注

    关注

    3

    文章

    3904

    浏览量

    61311
  • 启动文件
    +关注

    关注

    0

    文章

    15

    浏览量

    2144
收藏 人收藏

    评论

    相关推荐

    详解STM32启动文件

    本文对STM32启动文件startup_stm32f10x_hd.s的代码进行讲解,此
    发表于 06-10 17:19 716次阅读
    详解<b class='flag-5'>STM32</b><b class='flag-5'>启动</b><b class='flag-5'>文件</b>

    STM32Cube用法以及自动生成的代码讲解

    文章目录前言操作步骤打开软件新建工程配置时钟配置GPIO生成源代码编写代码实验验证源码讲解delay相关while循环自动生成前言本文主要介绍STM
    发表于 08-10 06:21

    学习STM32启动代码的方法步骤

    学习STM32启动代码的方法步骤
    发表于 11-29 06:34

    STM32单片机的启动文件简介

    启动文件简介启动文件由汇编编写,是系统上电复位后第一个执行的程序。主要做了以下工作:1、初始化堆栈指针SP=_initial_sp2、初始化
    发表于 12-06 08:09

    STM32启动文件步骤启动代码讲解

    。5--C库函数_main初始化用户堆栈的调用。2、文件启动步骤启动代码讲解1--栈(Stack
    发表于 02-21 07:27

    STM32启动文件资料免费下载

    本文档的主要内容详细介绍的是STM32启动文件资料免费下载。
    发表于 06-22 08:00 37次下载
    <b class='flag-5'>STM32</b>的<b class='flag-5'>启动</b><b class='flag-5'>文件</b>资料免费下载

    stm32启动文件浅析(二)

    stm32启动文件浅析(二)1. 启动文件使用ARM汇编指令汇总指令功能EQU伪指令,为一个常量取一个名称,类似于C语言中的 #define
    发表于 11-23 18:06 8次下载
    <b class='flag-5'>stm32</b><b class='flag-5'>启动</b><b class='flag-5'>文件</b>浅析(二)

    STM32启动文件内容详解

    的参考资料和分析参考《STM32F10X-中文参考手册》中的第九章-中断和事件:表 55 其他 STM32F10xxx 产品(小容量、中容量和大容量)的向量表; MDK 中的帮助手册—ARM Development Tools:用来查询ARM 的汇编指令和编译器相关的指令
    发表于 11-30 13:21 8次下载
    <b class='flag-5'>STM32</b><b class='flag-5'>启动</b><b class='flag-5'>文件</b>内容详解

    stm32启动文件分析

    stm32启动文件分析
    发表于 12-09 13:06 16次下载
    <b class='flag-5'>stm32</b><b class='flag-5'>启动</b><b class='flag-5'>文件</b>分析

    STM32启动文件分析

    STM32启动文件分析前言启动文件解析首先进行堆和栈的初始化接下来初始化中断向量表复位中断函数其余中断函数
    发表于 12-22 19:05 9次下载
    <b class='flag-5'>STM32</b><b class='flag-5'>启动</b><b class='flag-5'>文件</b>分析

    3-STM32启动文件详解

    。5--C库函数_main初始化用户堆栈的调用。2、文件启动步骤启动代码讲解1--栈(Stack
    发表于 12-27 18:41 13次下载
    3-<b class='flag-5'>STM32</b><b class='flag-5'>启动</b><b class='flag-5'>文件</b>详解

    关于STM32启动文件startup_stm32f10x_hd.s的代码

    本文对STM32启动文件startup_stm32f10x_hd.s的代码进行讲解,此
    的头像 发表于 07-06 17:26 3557次阅读

    STM32启动文件分享

    STM32启动文件分享
    发表于 09-28 11:20 8次下载

    STM32启动文件startup_stm32f10x_hd.s的代码讲解

    本文对STM32启动文件startup_stm32f10x_hd.s的代码进行讲解,此
    的头像 发表于 06-22 10:31 2801次阅读
    <b class='flag-5'>STM32</b><b class='flag-5'>启动</b><b class='flag-5'>文件</b>startup_<b class='flag-5'>stm32</b>f10x_hd.s的<b class='flag-5'>代码</b><b class='flag-5'>讲解</b>

    STM32启动文件

    STM32启动文件
    发表于 08-21 10:27 1次下载