一个60MB左右的SD卡,FAT16格式,未存入任何文件。

单片机将SD卡的CSD寄存器中获取到BlockNbr和BlockSize(有几个块、每个块几个字节),把这两个数相乘就是SD卡逻辑容量大小(单位字节),具体计算方法网上很多这里不介绍了。

如果是用CubeMX生成的程序,生成的SD初始化程序已经把CSD寄存器值的内容解析出来放在hsd结构变量内,BlockNbr和BlockSize在“stm32f4xx_hal_sd.h”下的“HAL_SD_CardInfoTypeDef”结构体里,把hsd.SdCard.LogBlockNb和hsd.SdCard.LogBlockSize乘起来就是容量大小(Block和LogBlock的值一般是一样的)。

由于此处程序标注“LogBlockNbr”为卡以块为单位的逻辑容量,以下说的“逻辑容量”均为SD卡计算出来的容量,非专业名称。

emmc 指令链表 emmc block size_stm32 SDHC

 

 

单片机读出容量是63,569,920 Bytes

emmc 指令链表 emmc block size_stm32 SDHC_02

 

 

这里是Win10显示的容量:63,303,680 Bytes

emmc 指令链表 emmc block size_emmc 指令链表_03

 

 

AIDA64上显示的也是:61820KB × 1024 = 63,303,680 Bytes

emmc 指令链表 emmc block size_stm32 SDHC_04

 

 

直到用DiskGenius软件查看容量才和单片机读出来的一样:63,569,920 Bytes

emmc 指令链表 emmc block size_SD卡 TF卡 内存 外置 存储卡_05

 

发现数据起始扇区前有520个扇区是FAT格式需要占用的区域,我们使用不了,520×512字节=260KB;

格式化后还会生成一些正常情况下看不见的文件:一个文件夹,文件夹内两个文件,一共用了3个簇来储存,每个簇1024字节(格式化时候设定的),也就是一个簇两个扇区,3×1024字节=3KB;

260+3=263KB,这就是为什么这里显示初始化后已用空间是263KB;

至于为什么Win10显示总容量是63,303,680字节,其实是减去那260KB后的容量,就是63569920-520×512=63303680字节,那个已用3KB是看不见的那几个文件占用簇大小。可以认为Win10显示的是文件格式内的容量而不是逻辑容量(计算出来的容量)。

 

emmc 指令链表 emmc block size_寄存器_06

借此机会对一张三星16GB的SD卡看看平常购买的储存设备为什么容量会比标称值小?16016998400字节合为14.9GB是没错的,Win10显示也是14.9GB,其实就是存储厂商对容量单位换算约定为1kB=1000B(kilo),1kiB=1024B(kilo binary)。

不过得说一下,显示出来的总字节数(逻辑容量)都是通过读取SD卡中CSD的值计算出来的,CSD值是厂商写进去的,辨别假容量卡得通过往SD卡填满数据才能核实。

 

扯远了;

所以如果想比对自己用单片机读出的SD容量是否正确,不要直接和Win10显示的数值比较哦,Win10显示的通常会比实际逻辑容量更小。