stm32 上电过程浅析

在STM32上电时刻,处理器并不是立刻处于复位状态。在这个时刻,处理器处于未定义的状态,各个寄存器的值都是不确定的。处理器会在上电后经过一系列的初始化步骤后才会进入复位状态。

当处理器上电时,会首先读取存储在Flash中的启动代码,即启动文件startup_stm32xxxx.s。该文件的作用是检查硬件环境(包括外部晶振时钟的稳定等)、进行各种初始化操作(包括清空BSS段、初始化数据段、初始化时钟等)。最后,启动文件会将Reset_Handler()函数的地址存储到向量表中,并跳转到Reset_Handler()函数的入口处。

当处理器经过上述初始化步骤之后,进入Reset状态,并向所有外设发出复位信号。此时,处理器的基本寄存器、外设寄存器以及存储器都被重置为其初始状态,开始执行Reset_Handler()函数中的代码。

因此,在STM32上电时刻,处理器是处于未定义的状态,但并没有进入复位状态,只有在初始化之后才会进入复位状态。

复位序列 硬件复位之后,CPU 内的时序逻辑电路首先完成如下两个工作(程序代码下载到内部flash为例,flash首地址 0x0800 0000)

  • 将 0x08000000 位置存放的堆栈栈顶地址存放到 SP 中(MSP)。
  • 将 0x08000004 位置存放的向量地址装入 PC 程序计数器。

CPU 从 PC 寄存器指向的物理地址取出第 1 条指令开始执行程序,也就是开始执行复位中断服务程序 Reset_Handler。复位中断服务程序会调用SystemInit()函数来配置系统时钟、配置FMC总线上的外部SRAM/SDRAM,然后跳转到 C 库中__main 函数。由 C 库中的__main 函数完成用户程序的初始化工作(比如:变量赋初值等),最后由__main 函数调用用户写的 main()函数开始执行 C 程序。

你可能感兴趣的:(单片机,stm32,嵌入式硬件)