STM32单片机的启动方式和内存映射

一、启动方式(自举模式)

首先stm32单片机的启动方式有三种,主要由BOOT0、BOOT1两个引脚决定:

(PS:图片来源是原子的)

解释一下,映射地址的概念:

地址映射是计算机领域中的一个重要概念,特别是在操作系统和计算机体系结构中。

指的是将逻辑地址(或虚拟地址)映射到物理地址的过程;我们知道CPU和内存之间是通过地址来查找数据,将虚拟地址转化位物理地址后,就可以通过物理地址来访问我们的物理内存。

(在现代计算机系统中,应用程序通常使用逻辑地址来访问内存中的数据和指令)

① 逻辑地址:是由 CPU 生成的一种抽象地址,它不直接对应物理内存中的位置;

② 物理地址:是实际的硬件地址,指向内存模块中的特定位置;

关于地址映射的详细解释可看这篇文章:什么叫地址映射 - SY-悦悦 - 博客园 (cnblogs.com)

未映射前,单片机复位后走的流程:

①,从地址 0x0000 0000 处取出堆栈指针 MSP 的初始值,该值就是栈顶地址

②,从地址 0x0000 0004 处取出程序计数器指针 PC 的初始值,该值是复位向量

栈顶地址:

复位向量:

这个过程由内核自动设置运行环境并执行主体程序,因此它被称为自举过程。

虽然内核是固定访问0x00000000和0x00000004地址的,但实际上这两个地址可以被重映射到其它

地址空间

映射后:

1、主闪存 存储器  模式:

也就是我们最常用的内部Flash启动模式

当芯片上电后采样到BOOT0引脚为低电平时,地址映射:

0x0000 0000        >>>        0x0800 0000

0x0000 0004        >>>        0x0800 0004

内核复位后,

读取内部FLASH的0x0800 0000地址空间存储的内容,赋值给栈指针MSP,作为栈顶地址,

再读取内部FLASH的0x0800 0004地址空间存储的内容,赋值给程序指针PC作为将要执行的第

一条指令所在的地址

具备这两个条件后, 内核就可以开始从PC指向的地址中读取指令执行

2、系统储存器 模式:

BOOT0引脚为高电平,BOOT1为低电平,地址映射:

0x0000 0000        >>>        0x1FFF F000

0x0000 0004        >>>        0x1FFF F004

内核复位后,

从系统存储器的0x1FFFF000及0x1FFFF004获取MSP及PC值进行自举。

系统存储器是一段特殊的空间,用户是不能访问的,ST公司在芯片出厂前就在系统存储器中固化

了一段代码(bootloader,用于存放串口下载的引导程序)。因而使用系统存储器启动方式时, 内核会执行该代码,该代码运行时,会为ISP提供支持(In System Program),如检测USART1/2、CAN2及USB通讯接口传输过来的信息, 并根据这些信息更新到自己内部FLASH的内容,达到升级产品应用程序的目的,因此这种启动方式也称为ISP启动方式

这种启动方式,其实就是执行串口下载程序,bootloader会将下载的程序存放进Flash,下载完成

后,需要重新设置启动方式为Flash启动方式,这样复位后才能正常启动程序。

3、内置SRAM:

BOOT0和BOOT1引脚均为高电平,地址映射:

0x0000 0000        >>>        0x2000 0000

0x0000 0004        >>>        0x2000 0004

内核复位后,

从内部SRAM的地址0x20000000和0x20000004, 获取内容进行自举。

由于SRAM没有存储程序的能力,所以这种启动方式只适用于调试程序。SRAM下载程序非常快。

RAM存储器的写入速度比在内部FLASH中要快得多,且没有擦除过程,因此在RAM上调试程序时

程序几乎是秒下的, 对于需要频繁改动代码的调试过程,能节约很多时间,省去了烦人的擦除与

写入FLASH过程。

二、内部存储结构

从上图我们可以得知,单片机的存储器主要是FLASH和SRAM

1、STM32F4系列存储器映射(内存映射):

总框图:

(1)、block0---Code区域

Code区域分析:

Block 0 通常被用于存储程序代码,因此被称为Code区域。

这个区域是专门用于存放你的应用程序代码的,包括主程序、函数、以及其他执行代码。

(Block 0 通常是存放主程序的地方,它包含了启动代码以及其他初始化程序,然后执行你编写的主要应用程序代码。)

Flash存储器通常是Block 0 的一部分,而Flash存储器又是用于存储可重新编程的程序代码和数据

的主要存储器。这个区域的大小会根据不同的微控制器型号而有所不同。

① Flash:                                                   0x0800 0000        ~       0x080F FFFF        (1024k) 

从0800开始的这一部分就是我们存储代码的区域。

② CCM data RAM(64KB data SRAM):0x1000 0000        ~        0x1000 FFFF

(不太了解)

③ System memory + OTP:                        

System memory:

用于存放出厂自带的bootloader程序,是用于串口下载的引导程序;

所以使用系统存储器启动的,就是执行串口下载程序,bootloader会将下载的程序存放到Flash中

使用这种方式下载程序之后,需要重新设置为Flash启动方式,复位之后才能正常启动执行程序。

OTP:

“一次性可编程”(One-Time Programmable)存储器。这种类型的存储器是一种特殊的非易

失性存储器,一旦被编程,其内容就无法再次修改或擦除一次性可编程存储器通常用于存储关键

的系统配置信息、安全密钥或其他一次性设定,以防止未经授权的访问或篡改。这些存储器通常在

生产过程中被编程,并且在使用过程中不可更改,提供了额外的安全性保障。

④ Option Bytes:

这一部分是选项字节,存放一些独立于程序的配置参数,一般我们不用管。

(2)、block1---SRAM区域

SRAM(Static Random Access Memory)区域分析:

SRAM是RAM类型的其中一种,是一种高速随机存取存储器,主要用于临时存储数据和程序运行时

的临时变量。RAM 属于易失性存储器,存储在RAM上的程序掉电后会丢失,不能像FLASH

(FLASH属于广义的ROM)保存数据/程序。

Block 1是SRAM部分:

而关于单片机中的Flash和RAM的更加细致的了解,可以看一下这位博主写的:STM32 内存分配解析及变量的存储位置 - wenzid - 博客园 (cnblogs.com)

(3)、block2---外设区域

从上面的总框图,我们可以看到,Peripheral扩展成对应的AHB1、2和APB1、2这些总线,而这些

总线上挂载的是各自的外设,如GPIO、USART、TIM等;也就是stm32全部的外设寄存器地址,

所以寄存器也是内存的一部分操作寄存器其实就是读写这些内存,进而就可以控制外设;寄存

器是特殊的一段内部存储器

特殊之处在于:

CPU可以向读写普通的内存一样来读写寄存器,寄存器背后连接了相应的外设

CPU —— (读写)外设内存 ——(操作)寄存器 —— (控制)外设

(4)、block3、4、5 --- FSMC区域

FSMC代表Flexible Static Memory Controller,即灵活静态存储器控制器。FSMC是一种专门设计

用于连接外部存储器设备的控制器,它可以支持多种类型的存储器,如SRAM、NOR Flash、

NAND Flash等,并提供了灵活的配置选项和接口,以便与不同类型的存储器设备进行通信。通过

FSMC,STM32F4系列微控制器可以轻松地扩展存储容量,满足更高级别的应用需求。

(5)、block7 --- 内核区域

这一部分属于M4的内核部分,存储着内核里面的外设寄存器地址。

如若想更深层的区了解内存管理这些,可以看看这篇文章:

STM32的内存管理相关(内存架构,内存管理,map文件分析)_stm32内存管理有什么用-CSDN博客

  • 42
    点赞
  • 25
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值