stm32启动模式和启动过程

Stm32 启动模式和启动过程

启动模式

从上图中我们可以知道,首先是需要从 0x000000000x00000004 地址处读取 MSPPC 的值,然后根据 PC 的值跳转到对应的程序执行。

但是,芯片厂商是可以将这两个地址映射的其他地址上面的,所以就导致下面出现的几种不同的启动模式。

对于 F1 系列的芯片来说,具有三种启动模式:

  • BooT1为:x BooT0为 0 时的主闪存存储器 <最主要的>
  • BooT1为:0 BooT0为 1 时的系统存储器
  • BooT1为:1 BooT0为 1 时的内置SRAM

一般来说我们多是使用前两种启动模式,主闪存启动主要就是从调试器启动,而系统存储器启动主要就是从串口启动。对于 SRAM 来说,也可以使用 FSMC 重映射到外部的SRAM来启动,这需要配置 SYSCFG_MEMRMP 寄存器。

程序无法下载的问题,有时候可以通过更换启动模式来解决。即从主闪存启动转到系统存储器启动。这种问题一般是对于芯片的配置不正确所导致的。

STM32的启动过程

首先我们需要大致了解一下 STM32 启动的主要流程:

其中,MSP 表示的是栈底地址,而 PC 表示的是程序计数器,它指向程序的第一条指令。

其中我们主要就是对于文件 startup_stm32f10x_xx.s 中的代码进行分析。

下面是 F1 系列的芯片的启动流程,并且将启动模式设置为,Flash启动:

根据上面的这个图,我们可以知道:

  • 0x08000000 地址中存储的值是 MSP 的值,这个值实际上就是存储的就是 堆栈指针 的地址。
  • 0x08000004 地址中存储的值是 PC 的值,这个值实际上就是存储的就是 程序计数器,表示程序的第一条指令的地址 的值。
  • 根据 MSP 给出的栈底的地址,和 .s 文件中设置的栈、堆大小,可以计算出栈和堆的所有信息。

startup_stm32f10x_xx.s 代码分析

从上图可以看出,初始化函数是可选的。如果你不需要使用的话,可以在该 .s 文件中注释掉 Reset_Handler 函数即可。

对于堆栈大小的设置

  • 这里的栈被设置为 1KB
  • 这里的堆被设置为 512B

同时,这里的堆栈的大小实际上也是可以自己设置的。如果不需要堆可以将大小设置为 0 。

中断向量表


stm32启动模式和启动过程
https://ysc2.github.io/ysc2.github.io/2024/08/18/stm32启动模式和启动过程/
作者
Ysc
发布于
2024年8月18日
许可协议