STM32启动流程详解 您所在的位置:网站首页 外置flash和单片机闪存 STM32启动流程详解

STM32启动流程详解

2024-07-06 23:39| 来源: 网络整理| 查看: 265

1、简介

STM32有三种启动模式:

从系统存储器启动(0x1FFF F000-0x1FFF F7FF):选用该种启动模式的目的仅为从串口下载程序,我们无法知道该段代码实现。使用串口下载程序的方式称作ISP,在系统编程。

从SRAM启动(0x2000 0000-0x3FFF FFFF):该种方式将SRAM的一部分区域用于存放程序,另一部分区域用于程序运行。以往误认为芯片烧录寿命次数有限,故可采用该种方式进行程序调试,避免多次擦除flash进行烧录,从而影响寿命。事实上并无必要。

从Flash启动(0x0800 0000-0x0807 FFFF),通过JTAG或者SWD方式下载程序即是下载到该地址区域,芯片上电也是从0x0800 0000开始执行。本文主要介绍该种启动方式。

众所周知,基于ARM内核的芯片代码区都是从0x00000000开始执行的,上述三种启动模式只是将对应地址映射到0x0000 0000执行。

2、启动流程

本部分介绍STM32从0x8000 0000开始,直到用户main()之间的执行过程:

1)初始化栈顶指针

从0x0800 0000读取栈顶地址,并将该地址存入MSP中。

栈顶地址的值为0x2000 xxxx,工程所生成bin文件的前两个字节即为栈顶地址。

从0x2000 0000到0x2000 xxxx即为程序所运行的范围,该段内存分布为:RW段、ZI段:其中RW段为可读写的非0数据段,ZI段包括了0数据段、堆区、栈区。

2)跳转至复位中断(Reset_Handler(void))

从0x0800 0004读取中断向量表的首地址(即复位中断入口地址),装入PC程序计数器,跳转执行

3)系统时钟设置(在复位中断程序内被调用)

进行系统时钟的初始化,该函数内含VTOR寄存器设置,即中断向量偏移设置:

SCB->VTOR = FLASH_BASE | VECT_TAB_OFFSET;

产品IAP由bootloader跳转app程序时,需要设置中断向量偏移

4)跳转至标准库_main()程序

LDR R0,=_main

该部分主要进行两部分工作:

数据段加载:把RW段(初始化为非0值的全局变量)从Flash搬运到SRAM中

开辟堆栈:依照启动文件所设置的堆栈大小初始化堆栈区域;

该处需要注意:如果编译勾选了using micro_lib,程序则采用单区存放堆栈的方式;否则,采用双区存储的方式,分别初始化堆区、栈区。

工程师在设计IAP时,需要注意该点可能会带来意料不到的一些问题

5)进入C文件中的main函数

3、启动流程图

最后附上粗略绘制的启动流程图:



【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有