STM32内存大小与地址的对应关系以及计算方法
文章目录
1、概述
在计算机中要访问存储区,都是通过地址来进行访问的,包括所有的外设(比如串口、内存、硬盘等),都对应有一个访问地址,地址就相当于门牌号,有了门牌号,我们才知道操作的是哪一个区域、哪一个外设。
最被大家熟知的是计算机内存,计算机内存有4G、8G,16G等等,对于程序员而言,要在代码中操作这些内存,肯定得知道内存的地址,此外,还需要会计算 【地址】 与 【内存大小】 的 【计算方法】 与 【对应关系】。STM32作为微型计算机,原理也是一样。
本篇博客则以STM32F103为例,主要对地址的计算相关的问题进行阐述。
2、公式
2.1 G/M/K/Byte/bit 单位换算公式
基本概念1:单位换算公式
2.2 地址与字节大小的关系
基本概念2:在计算机中,一个地址,代表一个字节(1Byte)。
基本概念3:我们常说的8位机、16位机、32位机、64位机,指的是地址的长度。
即:地址最长可以有几个比特位,例如:8位机地址最长8个比特位,最大地址0xFF。
基本概念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个字节
比如:地址0x0000 0000就占一个字节,
地址0x0000 0001也占一个字节,
地址0x0000 0002也占一个字节,
…
地址0x0000 000F也占一个字节,
也就是说:
0x0000 0000 - 0x0000 000F总共有16个地址,占16个字节。
可以推出公式:
备注:十六进制1位 = 二进制4位,计算机只能识别二进制:1101 0101这种,所以要换算成二进制计算
{
0
x
0000
,
000
F
=
0
b
.
.
.
.
,
0000
,
1111
=
2
4
=
16
(个字节)
\begin{cases} 0x0000,000F &= \quad 0b....,0000,1111\\ &= \quad 2^4 \\ &= \quad 16(个字节)\\ \end{cases}
⎩
⎨
⎧0x0000,000F=0b....,0000,1111=24=16(个字节)
所以套用成通用公式表示的话,可以表示为如下几个公式。
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)
换句话说,其实就是换算成二进制格式以后,1占多少个bit,大小就为
【
2
b
i
t
】
\color{blue}【{2^{bit}} 】
【2bit】字节。因为十六进制1位,等价于二进制4位(如:F == 1111),所以n个F占
【
4
∗
n
】
\color{blue}{【4 * n 】}
【4∗n】位,所以此公式为
【
2
(
4
∗
n
)
】
\color{blue}【{2^{(4 * n)}} 】
【2(4∗n)】
2.4 公式2:0xmFF…FF (m后跟n个F)大小
公式2:地址 0xmFF…FF (n个F)的地址大小,等价于(m + 1)个0xFF…FF大小之和
0 x m F F . . . F F M e m o r y S i z e = ( m + 1 ) ∗ 2 ( 4 ∗ n ) \color{red}{ \boldsymbol{ 0xmFF...FF \quad MemorySize = (m + 1) * 2^{ \: (4 \, * \, n)}\\ } } 0xmFF...FFMemorySize=(m+1)∗2(4∗n)
推导过程: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)
即:
{
0
x
m
F
F
.
.
.
F
F
M
e
m
o
r
y
S
i
z
e
=
(
m
+
1
)
∗
0
x
F
.
.
.
F
=
(
m
+
1
)
∗
2
(
4
∗
n
)
\begin{cases} 0xmFF...FF \quad MemorySize &= (m + 1) * 0xF...F\\ &= (m + 1) * 2^{ \: (4 \, * \, n)}\\ \end{cases}
{0xmFF...FFMemorySize=(m+1)∗0xF...F=(m+1)∗2(4∗n)
举例:
{
0
x
2
F
F
.
.
.
F
F
M
e
m
o
r
y
S
i
z
e
=
(
2
+
1
)
∗
0
x
0
F
.
.
.
F
=
(
2
+
1
)
∗
2
(
4
∗
n
)
=
3
∗
2
(
4
∗
n
)
\begin{cases} 0x2FF...FF \quad MemorySize &= (2 + 1) * 0x0F...F\\ &= (2 + 1) * 2^{ \: (4 \, * \, n)}\\ &= 3 * 2^{ \: (4 \, * \, n)}\\ \end{cases}
⎩
⎨
⎧0x2FF...FFMemorySize=(2+1)∗0x0F...F=(2+1)∗2(4∗n)=3∗2(4∗n)
2.5 公式3:0xm00…00 (m后跟n个0)大小
公式3:地址 0xm00…00 (m后跟n个0)的地址大小等价于(m-1)个0xFF…FF之和,再加1
0
x
m
00...00
M
e
m
o
r
y
S
i
z
e
=
m
∗
2
(
4
∗
n
)
+
1
\color{red}{ \boldsymbol{ 0x\,m00...00 \quad MemorySize = m * 2^{ \: (4 \, * \, n)} + 1\\ } }
0xm00...00MemorySize=m∗2(4∗n)+1
推导过程:
0xm00...00 = 0x(m-1)FF...FF + 1
故:
{
0
x
m
00...00
M
e
m
o
r
y
S
i
z
e
=
0
x
(
m
−
1
)
F
.
.
.
F
+
1
B
y
t
e
=
(
m
−
1
)
个
0
x
F
.
.
.
F
+
1
B
y
t
e
=
(
m
−
1
+
1
)
∗
2
(
4
∗
n
)
+
1
=
m
∗
2
(
4
∗
n
)
+
1
\begin{cases} 0x \, m00...00 \quad MemorySize &= 0x(m-1)F...F \quad+ \quad1 \quad Byte \\ &= (m-1)\,个\,0xF...F \quad + \quad 1 \quad Byte \\ &= (m-1+1) * 2^{ \: (4 \, * \, n)}\quad + \quad1\\ &= m * 2^{ \: (4 \, * \, n)} \quad + \quad 1\\ \end{cases}
⎩
⎨
⎧0xm00...00MemorySize=0x(m−1)F...F+1Byte=(m−1)个0xF...F+1Byte=(m−1+1)∗2(4∗n)+1=m∗2(4∗n)+1
举例:
{
0
x
200...00
M
e
m
o
r
y
S
i
z
e
=
0
x
1
F
F
.
.
.
F
F
+
1
B
y
t
e
=
(
1
+
1
)
∗
2
(
4
∗
n
)
+
1
B
y
t
e
=
2
∗
2
(
4
∗
n
)
+
1
\begin{cases} 0x200...00 \quad MemorySize &=0x1FF...FF + 1 \quad Byte \\ &= (1+1) * 2^{ \: (4 \, * \, n)} + 1 \quad Byte \\ &= 2 * 2^{ \: (4 \, * \, n)} + 1\\ \end{cases}
⎩
⎨
⎧0x200...00MemorySize=0x1FF...FF+1Byte=(1+1)∗2(4∗n)+1Byte=2∗2(4∗n)+1
3、如何通过地址计算内存大小
STM32是32位单片机,其地址范围为:0x0000 0000 ——0xFFFF FFFF
要查找每个外设对应的地址,可以在对应的用户手册的Memory mapping章节,查询各个外设对应的起始地址、结束地址(比如SPI、串口、IIC、Flash等),
例如下图中,可以查询到:
外设SPI1的地址范围为:0x4001 3000 —— 0x4001 3400
外设Flash的地址范围为:0x0800 0000 —— 0x0801 FFFF
我们在这里以Flash Memory为例,计算一下STM32F103系列单片机的Flash Memory大小。
3.1、上图中可以查到Flash Memory地址范围为:
- 起始地址:0x0800 0000
- 结尾地址:0x0801 FFFF
3.2、则Flash Memory最大内存 = 地址差
= 结尾地址 - 起始地址
= 0x0001,FFFF
描述 描述 描述 | 计算公式 计算公式 计算公式 |
---|---|
0 x 0001 , F F F F 可以表示的地址个数 0x0001,FFFF可以表示的地址个数 0x0001,FFFF可以表示的地址个数 | 2 ∗ 2 16 = 2 ∗ 65536 = 131072 个地址 2*2^{16}= 2*65536 =131072个地址 2∗216=2∗65536=131072个地址 |
即: F l a s h M e m o r y 内存大小一共是 即:Flash Memory内存大小一共是 即:FlashMemory内存大小一共是 | 131072 B y t e (字节) 131072Byte(字节) 131072Byte(字节) |
换算成 K 换算成K 换算成K | 131072 B y t e 1024 = 128 K \dfrac{131072Byte}{1024} = 128K 1024131072Byte=128K |
故:STM32F103系列单片机最大Flash Memory最大可以达到128K的内存,查询手册,在Description章节,可以看到介绍如下图:
如蓝色阴影部分描述,Flash Memory最大可以达到128K,说明上述计算正确。
3.3、小细节
上述计算的地址范围为:0x0 0000——0x1 FFFF,大小为128K
可以平均分为两个部分,每个部分占64K:
地址范围 地址范围 地址范围 | 大小 大小 大小 |
---|---|
0 x 0 , 0000 —— 0 x 0 , F F F F 0x0,0000 —— 0x0,FFFF 0x0,0000——0x0,FFFF | 64 K 64K 64K |
0 x 1 , 0000 —— 0 x 1 , F F F F 0x1,0000 —— 0x1,FFFF 0x1,0000——0x1,FFFF | 64 K 64K 64K |
4、常用内存对照表
描述 描述 描述 | 内存范围 内存范围 内存范围 | 最大内存大小 最大内存大小 最大内存大小 |
---|---|---|
16 位机 16位机 16位机 | 0 x 00 , 00 − 0 x F F , F F 0x00,00-0xFF,FF 0x00,00−0xFF,FF | 2 16 = 65536 B y t e = 64 K 2^{16}=65536Byte=64K 216=65536Byte=64K |
32 位机 32位机 32位机 | 0 x 0000 , 0000 − 0 x F F F F , F F F F 0x0000,0000-0xFFFF,FFFF 0x0000,0000−0xFFFF,FFFF | 2 32 = 4294967296 B y t e 2^{32}=4294967296Byte 232=4294967296Byte = 4194304 K =4194304K =4194304K = 4096 M =4096M =4096M = 4 G =4G =4G |
更多推荐
所有评论(0)