1.20 Cubemx_STM32F4 —IAP升级1(存储理论知识)

以下均以STM32F429IGT6为例

一、存储器映射

存储器本身不具有地址信息,它的地址是由芯片厂商或用户分配,给存储器分配地址的过程就称为存储器映射,具体见图 5-5。如果给存储器再分配一个地址就叫存储器重映射。

在这里插入图片描述

1、存储区域功能规划:

在这 4GB 的地址空间中,ARM 已经粗线条的平均分成了 8 个块,每块 512MB,每个块也都规定了用途,具体分类见表格 5-1。每个块的大小都有 512MB,显然这是非常大的,芯片厂商在每个块的范围内设计各具特色的外设时并不一定都用得完,都是只用了其中的一部分而已。
在这里插入图片描述

在这 8 个 Block 里面,有 3 个块非常重要,也是我们最关心的三个块。Boock0 用来设计成内部 FLASH,Block1 用来设计成内部RAM,Block2 用来设计成片上的外设,下面我们简单的介绍下这三个 Block 里面的具体区域的功能划分。

1.1 Block0

在这里插入图片描述在这里插入图片描述
Block0 主要用于设计片内的 FLASH, F429 系列片内部 FLASH 最大是 2MB,我们使用的 STM32F429IGT6 的 FLASH 是 1MB。要在芯片内部集成更大的 FLASH 或者 SRAM都意味着芯片成本的增加,往往片内集成的 FLASH 都不会太大

1.2 Block1

在这里插入图片描述
Block1 用于设计片内的 SRAM。F429 内部 SRAM 的大小为 256KB,其中 64KB 的CCM RAM 位于 Block0,剩下的 192KB 位于 Block1,分 SRAM1 112KB,SRAM2 16KB,SRAM3 64KB,Block 内部区域的功能划分具体见表格

1.3 Block2

在这里插入图片描述
Block2 用于设计片内的外设,根据外设的总线速度不同,Block 被分成了 APB 和 AHB两部分,其中 APB 又被分为 APB1 和 APB2,AHB 分为 AHB1 和 AHB2,具体见表格 5-4。

在存储器 Block2 这块区域,设计的是片上外设,它们以四个字节为一个单元,共32bit,每一个单元对应不同的功能,当我们控制这些单元时就可以驱动外设工作。我们可以找到每个单元的起始地址,然后通过 C 语言指针的操作方式来访问这些单元,如果每次都是通过这种地址的方式来访问,不仅不好记忆还容易出错,这时我们可以根据每个单元功能的不同,以功能为名给这个内存单元取一个别名,这个别名就是我们经常说的寄存器,这个给已经分配好地址的有特定功能的内存单元取别名的过程就叫寄存器映射
比如:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

举例1:绝地地址访问SDRAM

#define BYTE2K   2048
#define BYTE1K   1024
#define BYTE4K   4096
#define BYTE8K   8192
#define USE_MESSAGEQUEUE_MEMORY 	0xC0100000
#define CAN_SENQUEUE              USE_MESSAGEQUEUE_MEMORY

const osMessageQueueAttr_t canSendMsgQ_attr = {
	.mq_mem = (void*)(CAN_SENQUEUE),
	.mq_size = BYTE8K
};

举例2::绝地地址访问SDRAM

#define USE_DATA_MEMORY 0xc1400000
#define CAN_RCV_DATA_MEMORY USE_DATA_MEMORY
#define TCP_RCV_BUF   CAN_RCV_DATA_MEMORY+BYTE2K
rcvMessage_t uart3_RcvData __attribute__((at(TCP_RCV_BUF))); // 接受数据缓冲区 

举例3:绝对地址读SDRAM

typedef struct
{
	 int32_t degree_4[CURRENT_CHANNEL];
	 int32_t degree_55[CURRENT_CHANNEL];
	 int32_t degree_72[CURRENT_CHANNEL];
	 int32_t degree_95[CURRENT_CHANNEL];
	 int32_t Have;
}TempModify_t;
TempModify_t tempModify
tempModify = *(TempModify_t *)(0x08040000);

1.4 Block3/4/5/6

还有一个 AHB3 包含了 Block3/4/5/6,这四个 Block 用于扩展外部存储器,如 SDRAM,NORFLASH 和 NANDFLASH 等
在这里插入图片描述

2、STM32的外设地址映射

2.1 总线基地址

片上外设区分为四条总线,根据外设速度的不同,不同总线挂载着不同的外设,APB挂载低速外设,AHB 挂载高速外设。相应总线的最低地址我们称为该总线的基地址,总线基地址也是挂载在该总线上的首个外设的地址。其中APB1 总线的地址最低,片上外设从这里开始,也叫外设基地址
在这里插入图片描述

2.2 外设基地址

在这里插入图片描述
从表格 5-6 看到,GPIOA 的基址相对于 AHB1 总线的地址偏移为 0,我们应该就可以猜到,AHB1 总线的第一个外设就是 GPIOA

2.3 外设寄存器

在这里插入图片描述

二、内部FLASH

内部FLASHSTM32 的内部 FLASH 包含主存储器、系统存储器、OTP 区域以及选项字节区域,它们的地址分布及大小见表 53-1
在这里插入图片描述
 主存储器分为两块,共 2MB,每块内分 12 个扇区,其中包含 4 个 16KB扇区、1 个 64KB 扇区和 7 个 128KB 的扇区。如我们实验板中使用的STM32F429IGT6 型号芯片,它的主存储区域大小为 1MB,所以它只包含有表中的扇区 0-扇区 11。
STM32 针对 1MB FLASH 的产品还提供了一种双块的存储格式,见表 53-2。
在这里插入图片描述
通过配置 FLASH 选项控制寄存器 FLASH_OPTCR 的 DB1M 位,可以切换这两种
格式,切换成双块模式后,扇区 8-11 的空间被转移到扇区 12-19 中,扇区细分了,
总容量不变。
 系统存储区
系统存储区是用户不能访问的区域,它在芯片出厂时已经固化了启动代码,它负
责实现串口、USB 以及 CAN 等 ISP 烧录功能。
 OTP 区域
OTP(One Time Program),指的是只能写入一次的存储区域,容量为 512 字节,写
入后数据就无法再更改,OTP 常用于存储应用程序的加密密钥。
 选项字节
选项字节用于配置 FLASH 的读写保护、电源管理中的 BOR 级别、软件/硬件看门
狗等功能,这部分共 32 字节。可以通过修改 FLASH 的选项控制寄存器修改

三、内部SRAM

存放临时数据

四、map文件分析

打开 map 文件后,查看文件最后部分的区域,可以看到一段以“ Memory Map of the image”开头的记录(若找不到可用查找功能定位),见代码清单 53-1
在这里插入图片描述

Load Region LR_ROM1”及“ Execution Region ER_IROM1”开头的内容,它们分别描述程序的加载及执行空间。在芯片刚上电运行时,会加载程序及数据,例如它会从程序的存储区域加载到程序的执行区域,还把一些已初始化的全局变量从 ROM 复制到 RAM 空间,以便程序运行时可以修改变量的内容。加载完成后,程序开始从执行区域开始执行。

在上面 map 文件的描述中,我们了解到加载及执行空间的基地址(Base)都是0x08000000,它正好是 STM32 内部 FLASH 的首地址,即 STM32 的程序存储空间就直接是执行空间;它们的大小(Size)分别为 0x00000b50 及 0x00000b3c,执行空间的 ROM 比较小的原因就是因为部分 RW-data 类型的变量被拷贝到 RAM 空间了;它们的最大空间(Max)均为 0x00100000,即 1M 字节,它指的是内部 FLASH 的最大空间。计算程序占用的空间时,需要使用加载区域的大小进行计算,本例子中应用程序使用的内部 FLASH 是从 0x08000000 至(0x08000000+0x00000b50)地址的空间区域

观察表中的最后一项,它的基地址是 0x08000b1c,大小为 0x00000020,可知它占用的最高的地址空间为 0x08000b3c,跟执行区域的最高地0x00000b3c 一样,但它们比加载区域说明中的最高地址 0x8000b50 要小,所以我们以加载区域的大小为准。对比表 53-1 的内部 FLASH 扇区地址分布表,可知仅使用扇区 0 就可以完全存储本应用程序,所以从扇区 1(地址 0x08004000)后的存储空间都可以作其它用途,使用这些存储空间时不会篡改应
用程序空间的数据。

在这里插入图片描述
在这里插入图片描述

如上图编译后:
Code:代码域,它指的是编译器生成的机器指令,这些内容被存储到ROM区。
RO-data: Read Only data,只读数据域,它指程序中用到的只读数据,这些数据被存储在ROM区,因而程序不能修改其内容。C语言中const关键字定义的变量就是典型的RO-data。
RW-data: Read Write data,可读写数据域,它指初始化为“非0值”的可读写数据,程序刚运行时,这些数据具有非0的初始值,且运行的时候它们会常驻在RAM区,因而应用程序可以修改其内容。C语言中定义的全局变量,且定义时赋予“非0值”给该变量进行初始化。
ZI-data: Zero Initialie data,即0初始化数据,它指初始化为“0值”的可读写数据域。它与RW-data的区别是程序刚运行时这些数据初始值全都为 0,而后续运行过程与RW-data的性质一样,它们也常驻在RAM区,因而应用程序可以更改其内容。例如C语言中使用定义的全局变量,且定义时赋予“ 0 值”给该变量进行初始化(若定义该变量时没有赋予初始值,编译器会把它当ZI-data来对待,初始化为 0);

程序占用:FLASH=Code+RO-data+RW-data即map文件中ROM size
程序占用:RAM = RW-data+ZI-data

  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值