文章目录
前言
虽然应对一些开发需求较简单项目时可能用不到存储器相关的知识,但掌握存储器仍然是学习STM32的基础,尤其是项目碰到Flash空间不够需要做代码优化、或者需要对Flash进行读写操作的时候。
一、什么是存储器映射?
存储器指可以存储数据的设备,本身没有地址信息,对存储器(Flash、SRAM、外设寄存器等)分配地址的过程称为存储器映射
二、STM32的寻址范围?
想要解答这个问题,我们需要清楚以下两点
1、32位的单片机可以有32根地址线
每根地址线有两种状态:导通或不导通。因此,STM32的寻址能力为2^32 = 4GByte
STM32的最大寻址范围为0x0000 0000~0xFFFF FFFF
2、单片机内存地址访问的存储单元是按字节编址的(而不是bit)
简而言之,每个地址占用一个字节
从上图可知,页0的地址范围为0x0800 0000 ~ 0x0800 03FF,大小为0x400,转换为十进制为1024。由于一个地址占用一个字节,因此一页的存储空间为1KByte,因此上图所示flash大小为32KByte
三、存储器地址
STM32F1将4GB(2^32)的存储器空间分成8个块,每个块为512MB
其中最重要的是存放Flash内容(代码存放在Flash中)的block 0,分配给SRAM的block 1,以及存放片上外设寄存器的block 2,至于其他block用于系统保留或扩展接口。
其中block 0和block 1为实际存储介质(Flash/SRAM),需要标注物理容量,而其他block 是地址映射的逻辑框架,用于整合外设控制、扩展接口和系统功能。
各个块的功能和作用可以参考下面这篇文章:
四、思考
1、为什么STM32有4GB的寻址范围,但STM32F103系列的SRAM仅20KB,Flash最大才128KB?
答:STM32的寻址能力上限为4GB,但并不意味着必须搭配4GB的实际物理存储器使用,由上面的存储器地址图可知,很大一部分区域被保留(Reserved)了,无实际存储单元。基于实际应用场景和成本等因素考虑,并不需要使用。
当然,预留地址允许ST未来推出更大容量芯片(如将Flash从128KB升级到2MB)或新增外设,而无需改动架构。
2、物理存储和逻辑映射有何区别?
答:物理存储是真实的存储介质,如Flash、SRAM,而逻辑映射是地址空间的虚拟划分,并非实际存储介质。
总结
STM32存储器映射是连接硬件与软件的桥梁,通过逻辑地址统一管理物理资源,使开发者能高效、安全地控制芯片功能。理解其分区逻辑(如block划分)和寄存器映射机制,是深入STM32开发的基础。