SD/TF卡使用FATFS的f_mkfs()函数格式化后容量减小

        使用 f_mkfs() 函数进行格式化之前,应该先调用 f_mount() 函数挂载文件系统,否则会出现FR_NOT_ENABLED(逻辑驱动器没有工作区)报错并格式化失败。

  static FATFS   fs[2]; //文件系统设备结构体
  #define FS_VOLUME_SD		"0:"


  //挂载文件系统
  result = f_mount(&fs[0], FS_VOLUME_SD, 1);
  if(result != FR_OK)
  {
    printf("挂载文件系统失败 (%d)\r\n", result);
  }
  else
  {
    printf("挂载文件系统成功\r\n");
  }
  
  //格式化SD卡
  result = f_mkfs(FS_VOLUME_SD,0,0);
  if(result != FR_OK)
  {
    printf("格式化失败 (%d)\r\n", result);
  }
  else
  {
    printf("格式化成功\r\n");
  }
  

        但是使用 f_mkfs() 函数格式化成功之后把SD卡插入电脑会发现内存少了很多。

        原因是: f_mkfs() 函数之间调用了底层函数 disk_ioctl() ,disk_ioctl() 之中调用了 sd_card_info_struct 类型结构体里的 card_capacity 来获取块的大小和扇区数量。但是在SDCard.h 文件中 card_capacity 的数据类型是 uint32_t ,uint32_t 类型数据只能容纳4G左右的地址范围,可能导致SD卡容量读取错误,以至于获取的块的大小和扇区数量错误。

        解决方法:在 SDCard.h 文件中把 card_capacity 的数据类型改为 uint64_t ,同时把 c_size 的数据类型也改为 uint64_t ,这样就能够正常读取SD卡内存和地址范围了。使用 f_mkfs() 函数格式化成功之后,SD卡的容量也正常了。

DRESULT disk_ioctl (
  BYTE pdrv,  /* Physical drive nmuber (0..) */
  BYTE cmd,   /* Control code */
  void *buff  /* Buffer to send/receive control data */
)
{
  sd_card_info_struct sdInfo; //SD卡信息

  switch (pdrv) {
  
  //SD卡控制
  case FS_SD :

    //获取SD卡信息
    sd_card_information_get(&sdInfo);
    switch(cmd)
    {
      //同步操作
      case CTRL_SYNC:
        return RES_OK; 
      
      //获取扇区大小
      case GET_SECTOR_SIZE:
        *(WORD*)buff = 512; 
        return RES_OK;

      //获得块大小
      case GET_BLOCK_SIZE:
        *(WORD*)buff = sdInfo.card_blocksize;
        return RES_OK;

      //获得扇区数量
      case GET_SECTOR_COUNT:
        *(DWORD*)buff = sdInfo.card_capacity / 512;
        return RES_OK;
      
      //非法参数
      default:
        return RES_PARERR;
    }

  //Nand Flash控制
  case FS_NAND :
    return RES_PARERR;
  
  }
  return RES_PARERR;
}

修改前:

修改后:

        容量已经变小的SD卡怎么恢复正常,可以参考:

TF卡/SD卡/U盘容量“变小”的问题_sd卡使用f_mkfs后变小了-CSDN博客

  • 15
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
f_mkfs函数fatfs文件系统库中的一个函数,用于在指定的磁盘上创建一个指定格式的文件系统。下面是f_mkfs函数的完全解释: 函数原型: FRESULT f_mkfs ( const TCHAR* path, // 磁盘驱动器路径 BYTE opt, // 格式化选项 DWORD au, // 簇大小(字节单位) void* work, // 工作区 UINT len // 工作区长度 ); 参数说明: 1. path:磁盘驱动器路径,例如,"0:"表示逻辑驱动器0。 2. opt:格式化选项,可以是以下几个值之一: FM_FAT: 创建一个FAT12/FAT16/FAT32格式的文件系统。 FM_FAT32: 创建一个FAT32格式的文件系统。 FM_EXFAT: 创建一个exFAT格式的文件系统。 FM_ANY: 根据磁盘的容量和类型自动选择文件系统格式。 3. au:簇大小,即每个簇所包含的扇区数。在创建文件系统时,需要指定簇大小。簇大小会影响文件系统的性能和空间利用率。一般情况下,簇大小应该根据磁盘容量进行选择。例如,对于1GB以下的磁盘,可以选择4KB的簇大小;对于1GB到32GB的磁盘,可以选择8KB的簇大小;对于32GB以上的磁盘,可以选择16KB的簇大小。如果au为0,则会自动选择簇大小。 4. work:工作区指针,用于存储临时数据。创建文件系统时,需要分配一些内存用于临时存储数据,例如,文件分配表(FAT)和根目录表。如果work为NULL,则会自动分配内存。 5. len:工作区长度,即工作区所包含的字节数。如果work为NULL,则len应该为0。如果work不为NULL,则len应该是工作区所需要的最小字节数。 返回值说明: f_mkfs函数的返回值类型为FRESULT,表示文件系统操作的结果。常见的返回值包括: - FR_OK:操作成功。 - FR_DISK_ERR:磁盘错误。 - FR_INT_ERR:内部错误。 - FR_NOT_READY:磁盘未准备好。 - FR_NO_FILESYSTEM:磁盘没有文件系统。 - FR_MKFS_ABORTED:格式化操作被取消。 - FR_INVALID_PARAMETER:参数无效。 注意事项: 1. f_mkfs函数会清除磁盘上的所有数据,因此在调用该函数前应该备份磁盘上的数据。 2. f_mkfs函数需要在磁盘准备好之后才能调用,否则会返回FR_NOT_READY错误。 3. 在创建文件系统时,需要根据磁盘容量和类型选择合适的文件系统格式和簇大小,以确保文件系统的性能和空间利用率。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

shenshen.

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值