工业控制 > 工业自动化 > 详情

STM32启动文件初探之startup_stm32f10x_hd.s(Reset_Handler函数)

发布时间:2023-08-28 发布时间:
|

该文件主要实现目的:


设置初始SP

设置初始PC=Reset_Handler

设置向量表入口地址,并初始化向量表

调用SystemInit,把系统时钟配制成72M,SystemInit在库文件system_stm32f10.c定义

调转到标号_main,最终来到C程序文件

; Reset handler

Reset_Handler   PROC

                EXPORT  Reset_Handler             [WEAK]

                IMPORT  __main

                IMPORT  SystemInit

                LDR     R0, =SystemInit

                BLX     R0               

                LDR     R0, =__main

                BX      R0

                ENDP


第一行是程序注释,在汇编里面注释用的是“;”。


第二行是定义了一个子程序:Reset_Handler。


PROC 是子程序定义伪指令。一般用法为: 

1 子程序名PROC NEAR ( 或FAR ) 

2 …… 

3 ret 

4子程序名ENDP 

其中NEAR 和FAR 是属性词。 NEAR属性(段内近调用): 

调用程序和子程序在同一代码段中,只能被相同代码段的其他程序调用。 

FAR属性(段间远调用):调用程序和子程序不在同一代码段中,可以被相同或不同代码段的程序调用。


第三行EXPORT 表示Reset_Handler 这个子程序可供其他模块调用。


关键字[WEAK] 

表示弱定义,如果编译器发现在别处定义了同名的函数,则在链接时用别处的地址进行链接,如果其它地方没有定义,编译器也不报错,以此处地址进行链接。


第四行和第五行IMPORT 说明SystemInit 和__main 这两个标号在其他文件,在链接的时候需要到其他文件去寻找。


SystemInit在库文件system_stm32f10x.c 实现,用来初始化STM32的一系列时钟,把系统时钟设置为72MHZ。STM32的时钟比51 单片机复杂,需要经过一系列的配置才能达到稳定运行的状态。

__main 其实不是我们定义的,当编译器编译时,只要遇到这个标号就会定义这个函数,该函数的主要功能是:负责初始化栈、堆,配置系统境,并在最后跳转到用户自定义的main函数,从此来到C的世界。


第六行把SystemInit 的地址加载到寄存器R0。


第七行程序跳转到R0 中的地址执行程序,之后系统的时钟就被设置成72MHZ。


第八行把_main 的地址加载到寄存器R0。


第九行程序跳转到R0 中的地址执行程序,执行完毕之后就去到我们熟知的C 世界。


第十行表示子程序的结束。



『本文转载自网络,版权归原作者所有,如有侵权请联系删除』

热门文章 更多
大族激光深陷业绩寒冬.如何自救摆脱困境?