STM32内存大小与地址的对应关系以及计算方法 您所在的位置:网站首页 地址空间和内存 STM32内存大小与地址的对应关系以及计算方法

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

2024-07-17 06:33| 来源: 网络整理| 查看: 265

文章目录 1、概述2、公式2.1 G/M/K/Byte/bit 单位换算公式2.2 地址与字节大小的关系2.3 公式1:0xFF…FF (n个F)大小2.4 公式2:0xmFF...FF (m后跟n个F)大小2.5 公式3:0xm00...00 (m后跟n个0)大小 3、如何通过地址计算内存大小3.1、上图中可以查到Flash Memory地址范围为:3.2、则Flash Memory最大内存 = 地址差3.3、小细节 4、常用内存对照表

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(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


【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

      专题文章
        CopyRight 2018-2019 实验室设备网 版权所有