开启辅助访问 切换到窄版

打印 上一主题 下一主题

STM32教程(六)HAL库之STM32启动文件详细分析!

[复制链接]
作者:admin 
版块:
MCU单片机技术 stm 发布时间:2018-6-8 15:01:33
14400
楼主
跳转到指定楼层
| 只看该作者 回帖奖励 |倒序浏览 |阅读模式

今天介绍下STM32 的启动文件分析,所谓的启动文件,就和我们PC开机进入系统之前运行的BIOS程序类似,主要是对硬件设备系统进行的最初的配置。
我们以STM32F407系列为例,启动文件为startup_stm32f407xx.s,打开文件可以看到如下介绍:
启动文件主要完成如下过程,即程序执行过程:
-设置堆栈指针SP=_initial_sp
-设置PC指针=Reset_Handler
-配置系统时钟
-配置外部SRAM用于程序变量等数据存储(可选)
-跳转到C库的_main,最终调用我们自己写的main()函数
具体一点的过程大致如下:
硬件复位之后,CPU 内的时序逻辑电路首先将 0x0800 0000 位置存放的堆栈栈顶地址装入 SP 寄存器。紧接着将 0x0800 0004 位置存放的向量地址装入 PC 程序计数器。CPU 从 PC 寄存器指向的物理地址取出第 1 条指令开始执行程序,也就是开始执行复位中断服务程序 Reset_Handler.
复位中断服务程序会调用 SystemInit()函数(C 语言的) 来配置系统时钟、配置 FSMC 总线上的外部SRAM,然后跳转到 C 库中__main 函数。由 C 库中的__main 函数完成用户程序的初始化工作(比如:变量赋初值等),最后由__main 函数调用用户写的 main()函数开始执行 C 程序。
明白了启动文件的作用和工作流程后,如果我们在以后的项目中需要修改启动文件中的参数(很少会),我们得明白启动文件中那些常见的汇编指令:我给大家标识出来,供大家查阅


EQU 是表示宏定义的伪指令,类似于 C 语言中的#define
STACK :表示这个段的名字,可以任意命名
NOINIT:表示此数据段不需要填入初始数据
READWRITE:表示此段可读可写
ALIGN=3 :表示首地址按照 2 的 3 次方对齐,也就是按照 8 字节对齐
__heap_base 表示堆的开始地址
__heap_limit 表示堆的结束地址


AREA 定义一块代码段,只读,段名字是 RESET
READONLY 表示只读,缺省就表示代码段了
DCD 表示分配 1 个 4 字节的空间。每行 DCD 都会生成一个 4 字节的二进制代码。中断向量表存放的实际上是中断服务程序的入口地址。当异常(也即是中断事件)发生时,CPU 的中断系统会将相应的入口地址赋值给 PC 程序计数器,之后就开始执行中断服务程序。


WEAK 声明其他的同名标号优先于该标号被引用,就是说如果外面声明了的话会调用外面的
利用 PROC、ENDP 这一对伪指令把程序段分为若干个过程,使程序的结构加清晰。
IMPORT:伪指令用于通知编译器要使用的标号在其他的源文件中定义
SystemInit 函数在文件 system_stm32f4xx.c 里面
最后通过__main 标号进入C/C++标准实时库函数里的一个初始化子程序__main 的入口地址,再经过一些初始化之后才正式进入我们自己写的C语言的main函数。
下期讲解STM32 HAL库串口的使用。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

快速回复 返回顶部 返回列表