一、启动方式(自举模式)
首先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的内核部分,存储着内核里面的外设寄存器地址。
如若想更深层的区了解内存管理这些,可以看看这篇文章: