打印
[其他ST产品]

STM32内存大小与地址的对应关系以及计算方法

[复制链接]
1228|38
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
概述
在计算机中要访问存储区,都是通过地址来进行访问的,包括所有的外设(比如串口、内存、硬盘等),都对应有一个访问地址,地址就相当于门牌号,有了门牌号,我们才知道操作的是哪一个区域、哪一个外设。

最被大家熟知的是计算机内存,计算机内存有4G、8G,16G等等,对于程序员而言,要在代码中操作这些内存,肯定得知道内存的地址,此外,还需要会计算 【地址】 与 【内存大小】 的 【计算方法】 与 【对应关系】。STM32作为微型计算机,原理也是一样。

本篇博客则以STM32F103为例,主要对地址的计算相关的问题进行阐述。

使用特权

评论回复
沙发
丢丢手绢666|  楼主 | 2023-7-31 16:46 | 只看该作者
2、公式
2.1 G/M/K/Byte/bit 单位换算公式
基本概念1:单位换算公式

1G = 1024M
1M = 1024K
1K = 1024Byte
1Byte = 8bit

2.2 地址与字节大小的关系
基本概念2:在计算机中,一个地址,代表一个字节(1Byte)。
基本概念3:我们常说的8位机、16位机、32位机、64位机,指的是地址的长度。
       即:地址最长可以有几个比特位,例如:8位机地址最长8个比特位,最大地址0xFF。

使用特权

评论回复
板凳
丢丢手绢666|  楼主 | 2023-7-31 16:47 | 只看该作者
基本概念3含义详细解释如下:(备注:此处直接阐述结果,后面有详细的计算方法。)
因为计算机只能识别二进制0/1,寻址的时候也一样是通过二进制0101来寻址的,我们常说的32位机、64位机,指的是地址的2进制长度。比如:
8位机,地址长度是  8个二进制bit,最长0xFF。       地址范围:0x0 - 0xFF,       即:最大可以表示2^8  == 256个地址,即:256个字节
16位机,地址长度是 16个二进制bit,最长0xFFFF。     地址范围:0x0 - 0xFFFF,     即:最大可以表示2^16 == 64k个地址,即:64k个字节
32位机,地址长度是 32个二进制bit,最长0xFFFF FFFF。地址范围:0x0 - 0xFFFF FFFF,即:最大可以表示2^32 == 4G 个地址,即:4G个字节
64位机,地址长度是 64个二进制bit,最长0xFFFF FFFF FFFF FFFF(16个F)。地址范围:0x0 - 0xFFFF FFFF FFFF FFFF(16个F),即:最大可以表示2^64==2GG个地址,即:2GG个字节

使用特权

评论回复
地板
丢丢手绢666|  楼主 | 2023-7-31 16:48 | 只看该作者
比如:地址0x0000 0000就占一个字节,

   地址0x0000 0001也占一个字节,

   地址0x0000 0002也占一个字节,

       …

   地址0x0000 000F也占一个字节,

也就是说:

   0x0000 0000 - 0x0000 000F总共有16个地址,占16个字节。

可以推出公式:

   备注:十六进制1位 = 二进制4位,计算机只能识别二进制:1101 0101这种,所以要换算成二进制计算

使用特权

评论回复
5
丢丢手绢666|  楼主 | 2023-7-31 16:49 | 只看该作者
2.3 公式1:0xFF…FF (n个F)大小

公式1:地址 0xFF…FF (n个F)的地址大小为:
0 x F F . . . F F M e m o r y S i z e   =   2   ( 4   ∗   n ) \color{red}{ \boldsymbol{ 0xFF...FF \quad MemorySize \, = \, 2^{ \: (4 \, * \, n)} } }
0xFF...FFMemorySize=2
(4∗n)

使用特权

评论回复
6
丢丢手绢666|  楼主 | 2023-7-31 16:50 | 只看该作者
2.4 公式2:0xmFF…FF (m后跟n个F)大小

公式2:地址 0xmFF…FF (n个F)的地址大小,等价于(m + 1)个0xFF…FF大小之和

使用特权

评论回复
7
丢丢手绢666|  楼主 | 2023-7-31 16:50 | 只看该作者
推导过程:0xmFF…FF可以拆分为(m+1)个0xFF…FF地址大小之和,即:
   0xmFF...FF地址范围分割(共m+1行)           大小
    0x0 00...00 ——> 0x0 FF...FF            2^(4*n)
    0x1 00...00 ——> 0x1 FF...FF            2^(4*n)
    0x2 00...00 ——> 0x1 FF...FF            2^(4*n)
          ...             ...               ...
    0xm 00...00 ——> 0xm FF...FF            2^(4*n)

使用特权

评论回复
8
丢丢手绢666|  楼主 | 2023-7-31 16:50 | 只看该作者
即:

使用特权

评论回复
9
丢丢手绢666|  楼主 | 2023-7-31 16:50 | 只看该作者
2.5 公式3:0xm00…00 (m后跟n个0)大小

公式3:地址 0xm00…00 (m后跟n个0)的地址大小等价于(m-1)个0xFF…FF之和,再加1

使用特权

评论回复
10
丢丢手绢666|  楼主 | 2023-7-31 16:51 | 只看该作者
推导过程:
    0xm00...00 = 0x(m-1)FF...FF + 1

使用特权

评论回复
11
丢丢手绢666|  楼主 | 2023-7-31 16:51 | 只看该作者
故:

使用特权

评论回复
12
丢丢手绢666|  楼主 | 2023-7-31 16:51 | 只看该作者
3、如何通过地址计算内存大小
STM32是32位单片机,其地址范围为:0x0000 0000 ——0xFFFF FFFF

要查找每个外设对应的地址,可以在对应的用户手册的Memory mapping章节,查询各个外设对应的起始地址、结束地址(比如SPI、串口、IIC、Flash等),

例如下图中,可以查询到:
外设SPI1的地址范围为:0x4001 3000 —— 0x4001 3400
外设Flash的地址范围为:0x0800 0000 —— 0x0801 FFFF

使用特权

评论回复
13
丢丢手绢666|  楼主 | 2023-7-31 16:51 | 只看该作者

使用特权

评论回复
14
丢丢手绢666|  楼主 | 2023-7-31 16:51 | 只看该作者
我们在这里以Flash Memory为例,计算一下STM32F103系列单片机的Flash Memory大小。

3.1、上图中可以查到Flash Memory地址范围为:
起始地址:0x0800 0000
结尾地址:0x0801 FFFF

使用特权

评论回复
15
丢丢手绢666|  楼主 | 2023-7-31 16:52 | 只看该作者
3.2、则Flash Memory最大内存 = 地址差
                                                                      =  结尾地址 - 起始地址
                                                                      =  0x0001,FFFF

使用特权

评论回复
16
丢丢手绢666|  楼主 | 2023-7-31 16:52 | 只看该作者
故:STM32F103系列单片机最大Flash Memory最大可以达到128K的内存,查询手册,在Description章节,可以看到介绍如下图:

如蓝色阴影部分描述,Flash Memory最大可以达到128K,说明上述计算正确。

使用特权

评论回复
17
丢丢手绢666|  楼主 | 2023-7-31 16:52 | 只看该作者
3.3、小细节
上述计算的地址范围为:0x0 0000——0x1 FFFF,大小为128K
可以平均分为两个部分,每个部分占64K:

使用特权

评论回复
18
丢丢手绢666|  楼主 | 2023-7-31 16:53 | 只看该作者
4、常用内存对照表

使用特权

评论回复
19
zerorobert| | 2023-8-4 13:46 | 只看该作者
32位寄存器,即战4个地址,然后从ISER[0]开始,地址偏移为0x00,到ICER[0],总共有(8+24)*4=80个地址,所以其偏移量就是0X080了。

使用特权

评论回复
20
adolphcocker| | 2023-8-4 14:01 | 只看该作者
要计算某个特定地址的实际物理地址,可以使用以下公式:

物理地址 = 基地址 + 偏移量

其中,基地址指的是相应内存区域(如Flash、SRAM等)的起始地址,偏移量指的是相对于基地址的偏移量,以字节为单位。

举例来说,如果要计算Flash存储器中偏移量为100字节的地址对应的物理地址,可以使用如下公式:

物理地址 = FLASH_BASE + 100

同样,如果要计算SRAM中偏移量为50字节的地址对应的物理地址,可以使用如下公式:

物理地址 = SRAM_BASE + 50

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

33

主题

394

帖子

0

粉丝