1、概述

在计算机中要访问存储区,都是通过地址来进行访问的,包括所有的外设(比如串口、内存、硬盘等),都对应有一个访问地址,地址就相当于门牌号,有了门牌号,我们才知道操作的是哪一个区域、哪一个外设。

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

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



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。
基本概念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(4n)
换句话说,其实就是换算成二进制格式以后,1占多少个bit,大小就为 【 2 b i t 】 \color{blue}【{2^{bit}} 】 2bit字节。因为十六进制1位,等价于二进制4位(如:F == 1111),所以n个F占 【 4 ∗ n 】 \color{blue}{【4 * n 】} 4n位,所以此公式为 【 2 ( 4 ∗ n ) 】 \color{blue}【{2^{(4 * n)}} 】 2(4n)

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(4n)


推导过程: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(4n)
举例:
{ 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(4n)=32(4n)

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=m2(4n)+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(m1)F...F+1Byte=(m1)0xF...F+1Byte=(m1+1)2(4n)+1=m2(4n)+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(4n)+1Byte=22(4n)+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个地址 2216=265536=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,000xFF,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,00000xFFFF,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
Logo

旨在为数千万中国开发者提供一个无缝且高效的云端环境,以支持学习、使用和贡献开源项目。

更多推荐