学习目标:
学习STM32单片机之学习总结
-
掌握 STM32 基础知识
学习内容:
-
学习新建工程之启动文件
用KEIL5 新建一个工程,把工程放在一个事先建好的文件夹内,工程命名为REG 后保存。然后在工程目录下添加
启动文件:startup_stm32f10x_hd.s
,该文件可以从KEIL5 安装目录找到,也可以从ST 库里面找到,然后把启动文件添加到工程里面。
启动文件很重要
单片机运行前,需要检查硬件,启动硬件使硬件唤醒。
启动文件的作用:
STM32 的启动文件主要实现了:1、设置初始SP 。2、设置初始PC=Reset_Handler3、设置向量表入口地址,并初始化向量表。4、调用库函数SystemInit,把系统时钟配置成72M,SystemInit 在库文件system_stm32f10.c 定义。5、跳转到标号_mian,最终来到C 的世界。
该启动文件中有重要的十行代码
1 ; Reset handler
2 Reset_Handler PROC
3 EXPORT Reset_Handler [WEAK]
4 IMPORT __main
5 IMPORT SystemInit
6 LDR R0, =SystemInit
7 BLX R0
8 LDR R0, =__main
9 BX R0
10 ENDP
第一行是程序注释,在
汇编
里面
注释
用的是**“;”**,跟C 语言不一样。
第二行是定义了一个子程序:Reset_Handler
第三行EXPORT 表示Reset_Handler 这个子程序可供其他模块调用。
第四行和第五行IMPORT 说明SystemInit 和__main 这两个标号在其他文件,在链接的时候需要到其他文件去寻找。
//SystemInit 在库文件system_stm32f10x.c 实现,用来初始化STM32 的一系列时钟,把系统时钟设置为72MHZ。STM32 的时钟需要经过一系列的配置才能达到稳定运行的状态。
//__main 其实不是我们定义的,当编译器编译时,只要遇到这个标号就会定义这个函数,该函数的主要功能是:负责初始化栈、堆,配置系统环境,并在最后跳转到用户自定义的main 函数,从此来到C 的世界。
第六行把SystemInit 的地址加载到寄存器R0。
第七行程序跳转到R0 中的地址执行程序,之后系统的时钟就被设置成72MHZ。
第八行把_main 的地址加载到寄存器R0。
第九行程序跳转到R0 中的地址执行程序,执行完毕之后就去到我们熟知的C 世界。
第十行表示子程序的结束。
//系统时钟分为内部时钟LSI和外部时钟LSE
学习总结:
总结下就是,Reset_Handler 这个函数执行了两个函数调用,一个是SystemInit,把系统时钟设置成72M,令一个是__main,初始化好系统环境,最终调用C 的main,从此去到C 的世界。
_main函数由编译器生成,负责初始化栈、堆等,并在最后跳转到用户自定义的main()函数。