STM32入门系列-启动文件介绍

发布者:变形金刚最新更新时间:2022-11-17 来源: 知乎关键字:STM32  入门系列  启动文件 手机看文章 扫描二维码
随时随地手机看文章

在启动文件内部使用的都是汇编语言,这个文件的作用是负责执行微控制器从“复位”到“开始执行 main 函数”中间这段启动时间所必须进行的工作。它完成的具体工作有:


初始化堆栈指针SP=_initial_sp

初始化PC指针=Reset_Handler

初始化中断向量表

配置系统时钟

调用C库函数_main初始化用户堆栈,从而转向我们用户应用程序的main。

汇编指令


打开STM32的启动文件会发现,里面全部都是汇编语句,对于汇编指令不了解的朋友来说可能一头雾水。下面我们按照启动文件内指令出现的顺序来介绍,相信可以了解到大概情况。


EQU:给数字常量取一个符号名, 相当于C语言中的预处理命令define。其常用格式如下:


Stack_Size EQU 0x00000400


表示将0x00000400这个数值,用Stack_Size名代替。


AREA:汇编一个新的代码段或者数据段。常用格式如下:


AREA STACK, NOINIT, READWRITE, ALIGN=3


表示汇编一个数据段,名字是STACK,NOINIT表示不初始化,READWRITE表示可读可写,ALIGN表示字节对齐,通常后面会赋一个立即数,比如ALIGN=3表示的就是2^3字节对齐,即8字节对齐。


SPACE:分配一定大小的内存空间,单位为字节。常用格式如下:


Stack_Mem SPACE Stack_Size


表示给Stack_Mem分配一个Stack_Size大小的内存空间。通常它后面还会跟随一个__initial_sp语句,表示栈的结束地址,即栈顶地址,因为栈是由高向低生长的。


PRESERVE8:当前文件堆栈需按照8字节对齐。格式:直接写此指令即可。


THUMB:表示后面指令兼容THUMB指令。在ARM以前的指令集中有16位的THUMBM指令,现在Cortex-M系列使用的都是THUMB-2指令集,THUMB-2是32位的,兼容16位和32位的指令,是THUMB的超级版。格式:直接写此指令即可。


EXPORT:声明一个具有全局属性的标号,可被外部文件使用。常用格式如下:


EXPORT __Vectors


表示__Vectors标号具有全局属性,外部文件可以调用它。


DCD:以字为单位分配内存, 要求4字节对齐, 并要求初始化这些内存。常用格式如下:


DCD Reset_Handler ; Reset Handler


表示给Reset_Handler名称的地址分配内存并初始化, 这个名称地址可以在“STM32F4xx中文参考手册”-“中断和事件”-“中断和异常向量”章节中找到。在那个函数名后面还有一个“;”, 在汇编程序中“;”即注释,和C语言中的//类似效果。在后面的学习中会接触很多的中断函数,这些中断函数名都可在DCD这部分找到。


PROC:定义子程序。常用格式:


; Reset handler


Reset_Handler PROC


EXPORT Reset_Handler [WEAK]


IMPORT SystemInit


IMPORT __main


LDR R0, =SystemInit


BLX R0


LDR R0, =__main


BX R0


ENDP


表示定义一个全局的子程序Reset_Handler,需与ENDP成对使用,表示子程序结束。在


EXPORT Reset_Handler [WEAK]


后面有一个[WEAK],这个是弱定义,如果外部文件声明了一个标号,则优先使用外部文件定义的标号,如果外部文件没有定义也不出错。要注意的是:这个并不是ARM的指令,是编译器的。


LDR:从存储器中加载字到一个寄存器中。常用格式:


LDR R0, =SystemInit


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


BLX R0


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


BX R0


IMPORT:声明标号来自外部文件,和C语言中的extern关键字类似。


IMPORT SystemInit


IMPORT __main


上述代码中表示声明SystemInit和main为外部文件,所以 在创建寄存器模板的时候写一个SystemInit()空函数。如果想修改main.c文件中的main函数名,在这个地方就可以改动,然后后面


LDR R0, =__main


中的main也需要改动,对汇编不了解的不建议改动。


B:跳转到一个标号。常用格式如下:


B .


在B后面有一个“.”,在汇编语言中表示循环。这句话的意思就是说跳进了循环。


IF,ELSE,ENDIF:汇编条件分支语句,与C语言的if else类似。其常用格式:


IF :DEF:__MICROLIB


EXPORT __initial_sp


EXPORT __heap_base


EXPORT __heap_limit


ELSE


IMPORT __use_two_region_memory


EXPORT __user_initial_stackheap


ENDIF


END:到达文件的末尾,文件结束。


到这里启动文件指令就介绍完了, 有的朋友在学习过程中还会遇到其他的汇编指令,那么怎么查找它们的功能和用法呢?其实很简单,KEIL5软件内已经给我们提供了帮组文档,打开Help选项就会弹出帮助文档,如下图所示。

帮助文档的界面如下图所示,如果要查找AREA指令,只需要选择搜索,输入要搜索的指令,选择列出主题即可。选择对应的指令,右侧就会显示指令的具体介绍和格式说明。

堆栈


学习过C语言的朋友对堆栈这一词很熟悉。在启动文件开始处就定义了一堆栈的大小,代码如下:


;栈空间的开辟


Stack_Size EQU 0x00000400


AREA STACK, NOINIT, READWRITE, ALIGN=3


Stack_Mem SPACE Stack_Size


__initial_sp ;栈的结束地址


;堆空间的开辟


Heap_Size EQU 0x00000200


AREA HEAP, NOINIT, READWRITE, ALIGN=3


__heap_base


Heap_Mem SPACE Heap_Size


__heap_limit ;堆的结束地址


在程序开头开辟了一个0x00000400即1KB的Stack_Size栈空间。 栈主要用于存放函数的参数值、局部变量的值等,其操作方式类似于数据结构中的栈。栈的大小不能超过内部RAM的大小。假如开发的程序占用的RAM比较大,局部变量使用的比较多,那么可以在启动文件内修改这个Stack_Size值。


如果程序出现了莫名其妙的错误,并进入了硬fault的时候,你就要考虑下是不是栈不够大,溢出了的问题。通常我们修改最多的还是栈值。


程序紧接着又开辟了一个0x00000200即512字节的Heap_Size堆空间。堆中的内存一般由程序员分配和释放,若程序员不释放,程序结束时可能由操作系统回收。分配方式类似于数据结构中的链表。堆和栈生长方式是相反的,堆是由低向高生长的,而栈是由高向低生长的。


关键字:STM32  入门系列  启动文件 引用地址:STM32入门系列-启动文件介绍

上一篇:STM32入门系列-使用库函数点亮LED软硬件分析
下一篇:STM32入门系列-库目录及文件介绍

推荐阅读最新更新时间:2024-11-11 18:35

STM32学习笔记之点亮LED灯
实验程序: /*******************************led.c*********************************/ #include stm32f4xx.h //在SYSTEM目录下可以找到,把ST官方的部分库抽取出来,组成了一个SYSTEM目录 #include sys.h void LED_Init(void){ RCC- AHB1ENR = 1 5; //使能GPIO端口的F时钟 /* 方法一: */ // GPIOF- ODR |= 0x1 9; // GPIOF- MODER |= 0x1 18; /
[单片机]
<font color='red'>STM32</font>学习笔记之点亮LED灯
STM32开发笔记68: keil中使用ST-Link不能成功下载的真实原因
单片机型号:STM32F091RCT6 在STM32开发笔记67: 在keil中使用ST-Link不能成功下载的解决方法提到解决keil中使用ST-Link不能成功下载的一种方法,经仔细分析其实原因还在于程序上。 不能成功下载的程序中,包含如下程序,: CInit::CInit(uint8_t mode) { //底层初始化 HAL_Init(); //GPIO时钟使能 __HAL_RCC_GPIOA_CLK_ENABLE(); __HAL_RCC_GPIOB_CLK_ENABLE(); __HAL_RCC_GPIOC_CLK_ENABLE(); __HAL_RCC_GPIOD_CLK_ENAB
[单片机]
Keil5软件配置与新建STM32工程教程
新建工程文件夹 建立名字为LED的文件夹存放工程文件,其中再建立两个文件夹,Listing文件夹用于存放编译器编译时候产生的C语言、汇编、链接文件,Output文件夹用于存放编译产生的调试信息、hex文件、预览信息、封装库等。 文件夹建好之后,在LED文件夹下存放startup_stm32f10x_hd.s、stm32f10x.h、main.c文件。前两个文件可以在STM32F1xx的固件库中找到,第三个文件是空文件。 在Keil5中新建工程的步骤 如下图所示,Project-New,新建工程,工程名为Led,点击保存。 点击保存之后,弹出如下窗口,选择芯片型号。根据你开发板使用的芯片具体的型号来选择。如果这里没有出现你想
[单片机]
Keil5软件配置与新建<font color='red'>STM32</font>工程教程
STM32之限位开关
一、简介 本文介绍如何在STM32上使用限位开关。 二、实验平台 库版本:STM32F10x_StdPeriph_Lib_V3.5.0 编译软件:MDK4.53 硬件平台:STM32开发板(主芯片stm32f103c8t6) 仿真器:JLINK 三、版权声明 四、实验前提 在进行本文步骤前,请先阅读并实现以下博文: 1、《STM32之NVIC》:http://blog.csdn.net/feilusia/article/details/52819709 五、基础知识 1、限位开关是什么? 答:限位开关其实就是会复原开关的开关按键。 也就是说按下限位开关的开关能触发STM32的IO
[单片机]
<font color='red'>STM32</font>之限位开关
STM32学习笔记一一外部中断
1.STM32 外部中断简介 STM32 的每个 IO 都可以作为外部中断的中断输入口。 STM32F103 的中断控制器支持 19 个外部中断/事件请求。每个中断设有状态位,每个中断/事件都有独立的触发和屏蔽设置。代码主要分布在固件库的 stm32f10x_exti.h 和 stm32f10x_exti.c 文件。 STM32F103的 19 个外部中断为: 线 0~15:对应外部 IO 口的输入中断。 线 16:连接到 PVD 输出。 线 17:连接到 RTC 闹钟事件。 线 18:连接到 USB 唤醒事件 触发方式:STM32 的外部中断是通过边沿来触发的,不支持电平触发。 2.外部中断分组
[单片机]
<font color='red'>STM32</font>学习笔记一一外部中断
STM32进入睡眠模式下的GPIO配置参考
1. GPIO内部电路图 1.根据设备原理图查看IO外部引脚连接电路,闲置状态为低电平时,设置为下拉输入;闲置状态为高电平时,设置为上拉输入;闲置状态为悬空时设置为模拟输入;输出引脚根据功能需要设置就行 原因:当IO通过外围电路电阻接地被拉低时,如果设置为上拉输入,则在芯片内部的上拉电阻和外围的下拉电阻构成回路,电流损耗取决于这两个电阻;当IO通过外围电路电阻接电源被拉高时,则在芯片内部的下拉电阻和外围的上拉电阻构成回路,电流损耗也取决于这两个电阻;当悬空时,斯密特触发器是打开的,要判断输入的是高电平还是低电平,需要一点电流损耗,但是设备模拟输入,这个触发器是关闭的 --------------------- 假设你的这个GP
[单片机]
<font color='red'>STM32</font>进入睡眠模式下的GPIO配置参考
一例使用STM32外设库设置串口速度与实际不一样的解决
最近手上有了块金牛的stm32实验板,兴致勃勃的测试各种功能,但是碰到一个问题,用stm32 的外设库写串口程序,发现串口速度与实际不一样。一度怀疑是外设库的问题,但是用mdk的外设监控查看后,发现实际的串口速度为自定义的3倍,如图 很疑惑,本人有一种钻牛角尖的精神,因此一度debug下去,发现这个设置是在如下关键语句 (位于 外设库 中的 USART_Init定义语句,在stm32f10x_usart.c中) USART_Init初始化函数 RCC_GetClocksFreq(&RCC_ClocksStatus); if (usartxbase == USART1_BASE) { apbclock = RCC_ClocksSt
[单片机]
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
随便看看

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved