stm32启动模式和启动过程
Stm32 启动模式和启动过程
启动模式
从上图中我们可以知道,首先是需要从 0x00000000
和 0x00000004
地址处读取 MSP
和 PC
的值,然后根据 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启动模式和启动过程/