OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 5233|回复: 11

SD卡如何保留部分空间

[复制链接]

11

主题

29

帖子

0

精华

初级会员

Rank: 2

积分
52
金钱
52
注册时间
2013-6-7
在线时间
23 小时
发表于 2016-10-28 14:58:49 | 显示全部楼层 |阅读模式
10金钱
各位好,

我想在4G的SD卡中保留10M空间来存储字符之类的数据,剩余作为一个通用存储,并在通过USB连上电脑时模拟一个U盘,这样可行吗?目前使用整个SD卡来做一个U盘是没问题了,可我不知道保留部分空间如何操作,还请指教

最佳答案

查看完整内容[请看2#楼]

首先是扇区尺寸为512字节,其次是总容量比如SD容量为115M那么需要换算成字节和扇区数,结果就是 SectorSize =512; //文件系统每扇区字节数 MemroySize =115*1024*1024; //总存储容量(单位:字节) SectorNumber =115*1024*1024/SectorSize; (SD卡总扇区数,也就是总容量/扇区尺寸=总扇区数量) 以上就是容量的配置,然后还有一个参数就是簇的大小每簇占用的扇区数量,比如一个最小的文件占用系统就是4k,那么这个文件系统 ...
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

54

主题

372

帖子

0

精华

高级会员

Rank: 4

积分
979
金钱
979
注册时间
2016-6-15
在线时间
474 小时
发表于 2016-10-28 14:58:50 | 显示全部楼层
首先是扇区尺寸为512字节,其次是总容量比如SD容量为115M那么需要换算成字节和扇区数,结果就是

SectorSize =512; //文件系统每扇区字节数
MemroySize =115*1024*1024;  //总存储容量(单位:字节)
SectorNumber =115*1024*1024/SectorSize; (SD卡总扇区数,也就是总容量/扇区尺寸=总扇区数量)

以上就是容量的配置,然后还有一个参数就是簇的大小每簇占用的扇区数量,比如一个最小的文件占用系统就是4k,那么这个文件系统就是每簇占用8个扇区
回复

使用道具 举报

11

主题

1044

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
3722
金钱
3722
注册时间
2011-5-23
在线时间
2013 小时
发表于 2016-10-28 15:18:04 | 显示全部楼层
对TF卡进行分区。

或格式化时留出保留空间,确保这部分不被文件系统使用。
这样,这部分空间就可以被自己任意使用了。
RT-Thread RTOS 音频,WIFI,蓝牙
回复

使用道具 举报

11

主题

29

帖子

0

精华

初级会员

Rank: 2

积分
52
金钱
52
注册时间
2013-6-7
在线时间
23 小时
 楼主| 发表于 2016-10-28 16:07:09 | 显示全部楼层
aozima 发表于 2016-10-28 15:18
对TF卡进行分区。

或格式化时留出保留空间,确保这部分不被文件系统使用。

额,能否具体点,不是很熟悉这块
回复

使用道具 举报

11

主题

29

帖子

0

精华

初级会员

Rank: 2

积分
52
金钱
52
注册时间
2013-6-7
在线时间
23 小时
 楼主| 发表于 2016-10-28 16:09:03 | 显示全部楼层
aozima 发表于 2016-10-28 15:18
对TF卡进行分区。

或格式化时留出保留空间,确保这部分不被文件系统使用。

用的FATFS,如何操作呢,另外在连上电脑时也可能被电脑端格式化,这个时候也不能格式化这部分保留空间
回复

使用道具 举报

54

主题

372

帖子

0

精华

高级会员

Rank: 4

积分
979
金钱
979
注册时间
2016-6-15
在线时间
474 小时
发表于 2016-10-28 16:28:15 | 显示全部楼层
本帖最后由 shuaigew88 于 2016-10-28 16:30 编辑
yanzhongsan 发表于 2016-10-28 16:09
用的FATFS,如何操作呢,另外在连上电脑时也可能被电脑端格式化,这个时候也不能格式化这部分保留空间

很简单,如SD卡容量128M,扇区是512字节这是固定的,那么128M的卡实际容量大概在120M左右如果你想腾出5M的空间那么在FATFS中格式化的时候容量参数写115M/512BYTE=235520 SectorNumber。
如果是用读卡器插在电脑上就没办法了。
回复

使用道具 举报

11

主题

29

帖子

0

精华

初级会员

Rank: 2

积分
52
金钱
52
注册时间
2013-6-7
在线时间
23 小时
 楼主| 发表于 2016-10-31 09:34:19 | 显示全部楼层
shuaigew88 发表于 2016-10-28 16:28
很简单,如SD卡容量128M,扇区是512字节这是固定的,那么128M的卡实际容量大概在120M左右如果你想腾出5M ...

多谢你的回答,我的SD卡是固定在板上的,所以不存在取下来直接用读卡器的问题;现在我的操作是在STORAGE_GetCapacity_FS这个函数内修改返回值,将block_num减小20480,即减小10M;单问题是保留的空间地址是从何处开始?是整个空间的最后部分?那保留部分的地址起始是不是:总容量-10M?
函数代码如下:
int8_t STORAGE_GetCapacity_FS (uint8_t lun, uint32_t *block_num, uint16_t *block_size)
{
  /* USER CODE BEGIN 3 */   
  //*block_num  = STORAGE_BLK_NBR;
  //*block_size = STORAGE_BLK_SIZ;
  if (RES_OK == SD_Driver.disk_ioctl(lun, GET_SECTOR_COUNT, block_num)) {
      //*block_size = STORAGE_BLK_SIZ;
      if (RES_OK == SD_Driver.disk_ioctl(lun, GET_BLOCK_SIZE, block_size)) {
          return (USBD_OK);
      }
  }
  return (USBD_FAIL);
  /* USER CODE END 3 */
}
回复

使用道具 举报

54

主题

372

帖子

0

精华

高级会员

Rank: 4

积分
979
金钱
979
注册时间
2016-6-15
在线时间
474 小时
发表于 2016-10-31 12:52:39 | 显示全部楼层
yanzhongsan 发表于 2016-10-31 09:34
多谢你的回答,我的SD卡是固定在板上的,所以不存在取下来直接用读卡器的问题;现在我的操作是在STORAGE_ ...

总地址的最后区域。
回复

使用道具 举报

11

主题

29

帖子

0

精华

初级会员

Rank: 2

积分
52
金钱
52
注册时间
2013-6-7
在线时间
23 小时
 楼主| 发表于 2016-10-31 14:43:49 | 显示全部楼层
shuaigew88 发表于 2016-10-28 16:28
很简单,如SD卡容量128M,扇区是512字节这是固定的,那么128M的卡实际容量大概在120M左右如果你想腾出5M ...

"在FATFS中格式化的时候容量参数写115M/512BYTE=235520 SectorNumber",这句话不是很懂,FATFS中格式化的函数是f_mkfs, 其原型为:
FRESULT f_mkfs (
        const TCHAR* path,        /* Logical drive number */
        BYTE sfd,                        /* Partitioning rule 0:FDISK, 1:SFD */
        UINT au                                /* Size of allocation unit in unit of byte or sector */
)
你是指将第三个参数设置为保留后的大小?

另外我尝试修改 STORAGE_GetCapacity_FS 函数,将block_num修改为保留空间后的大小后,插入电脑端发现总容量大小居然没有变化,请问这是什么情况?难道不是这个函数返回给电脑端U盘的容量大小?
回复

使用道具 举报

54

主题

372

帖子

0

精华

高级会员

Rank: 4

积分
979
金钱
979
注册时间
2016-6-15
在线时间
474 小时
发表于 2016-10-31 17:04:28 | 显示全部楼层
yanzhongsan 发表于 2016-10-31 14:43
"在FATFS中格式化的时候容量参数写115M/512BYTE=235520 SectorNumber",这句话不是很懂,FATFS中格式化的 ...

第三个参数应该是簇的大小,跟容量没关系。
回复

使用道具 举报

11

主题

29

帖子

0

精华

初级会员

Rank: 2

积分
52
金钱
52
注册时间
2013-6-7
在线时间
23 小时
 楼主| 发表于 2016-10-31 17:55:54 | 显示全部楼层
shuaigew88 发表于 2016-10-31 17:04
第三个参数应该是簇的大小,跟容量没关系。

刚刚在单片机内重新格式化了一遍,发现电脑端跟着发生了变化,估计电脑端的容量是根据文件SD卡内的文件系统表来获取的,所以我改那个USB端口获取容量的函数没有效果,现在应该已经保留了部分内容;我再想办法写些数据到保留区测试下,多谢
回复

使用道具 举报

54

主题

372

帖子

0

精华

高级会员

Rank: 4

积分
979
金钱
979
注册时间
2016-6-15
在线时间
474 小时
发表于 2016-11-1 08:57:15 | 显示全部楼层
yanzhongsan 发表于 2016-10-31 17:55
刚刚在单片机内重新格式化了一遍,发现电脑端跟着发生了变化,估计电脑端的容量是根据文件SD卡内的文件系 ...

当存储介质没有文件系统时,存储总量需要用户提供之后文件系统才可以根据容量来合理格式化,之后容量就在文件系统中。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-6-15 23:34

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表