1.初始化堆栈指针 SP=_initial_sp,初始化 PC 指针=Reset_Handler;
2.初始化中断向量表;
3.配置系统时钟;
4.调用 C 库函数_main 初始化用户堆栈,然后进入 main 函数。
在学习STM32程序的执行顺序之前,我们需要首先了解STM32的启动方式,这个在STM32的参考手册里有的,如下图:
一、STM32有三种启动方式:
每个STM32工程都会有启动文件的,在建立工程的时候,已经将启动文件放在工程内了,这里我查看的是STM32f10x系列的启动文件,接下来我将一段一段的分析启动文件。
启动文件的名称是“system_stm32f10x.c”。
1. 这个文件提供了2个函数和1个全局变量:
SystemInit():设置系统时钟(系统时钟源、PLL锁相环(用于倍频)、AHB/APBx预分频器、Flash设置),这个函数被用作复位之后和主程序分支之前。
SystemCoreClock variable:系统内核时钟变量,包含内核时钟,它被用于用户应用程序设置SysTick定时器或配置其他参数。
SystemCoreClockUpdate():更新变量SystemCoreClock和在程序执行期间调用可以更改核心时钟。
2. 每个设备复位之后,HSI内部高速时钟(8MHz)被用于系统时钟源。然后在“startup_stm32f10x_xx.s”文件中调用 SystemInit() 函数,以配置分支到主程序之前的系统时钟。
3. 如果用户选择的系统时钟源启动失败,则SystemInit() 函数将不做任何事情,HSI仍然用作系统时钟源。 用户可以在SetSysClock()函数中添加一些代码来处理这个问题。
4. HSE晶振的默认值设置为8 MHz(或25 MHz,开启使用的产品),请参阅“stm32f10x.h”文件中的“HSE_VALUE”定义。当HSE直接或通过PLL用作系统时钟源时,您使用不同的晶体,您必须根据自己的 HSE 值进行调整配置。
总结一下,复位之后HSI内部高速时钟(8MHz)被用于系统时钟源,然后调用SystemInit() ,通过它配置时钟。