硬汉嵌入式论坛

 找回密码
 立即注册
查看: 5745|回复: 3
收起左侧

[有问必答] F4系列 sdio fatfs格式化解决思路

[复制链接]

1

主题

2

回帖

5

积分

新手上路

积分
5
发表于 2021-8-6 20:04:00 | 显示全部楼层 |阅读模式
想了想,还是发在这里~用着硬汉哥的SDIO驱动蛮稳定的(目前使用大半年)。当然也魔改了一点点的。本来项目里sd卡用的操作不多,就新增、读、写、删除;
今天偶然用来格式化sd卡,发现有问题。乱码;容量不对,偏大的32g变500g;偏小的写成fat磁盘格式(16mb大小)
光修改入参,最好的条件是写成fat磁盘格式。能用,但浪费了32g那么大的容量,怎么能忍。


后面查了下驱动代码,改了disk_ioctl函数就好了。
下面是解题思路;哈哈哈

测试环境基于stm32f407zg、标准库、 fatfs是R0.10b 版本的
稳定版本驱动来源是硬汉哥的sdio dma驱动;下面这个
  1. https://forum.anfulai.cn/forum.php?mod=viewthread&tid=98560&highlight=sdio
复制代码


disk_ioctl更改后的函数
  1. DRESULT disk_ioctl (
  2.         BYTE pdrv,                /* Physical drive nmuber (0..) */
  3.         BYTE cmd,                /* Control code */
  4.         void *buff                /* Buffer to send/receive control data */
  5. )
  6. {
  7.                 DRESULT res;

  8.         switch (pdrv) {
  9.         case FS_SD :
  10.             switch(cmd)
  11.             {
  12.                     case CTRL_SYNC:
  13.                                 res = RES_OK;
  14.                         break;         
  15.                     case GET_SECTOR_SIZE:
  16.                                 *(DWORD*)buff = 512;
  17.                         res = RES_OK;
  18.                         break;         
  19.                     case GET_BLOCK_SIZE:
  20.                                 *(WORD*)buff = SDCardInfo.CardBlockSize;
  21.                         res = RES_OK;
  22.                         break;         
  23.                     case GET_SECTOR_COUNT:
  24.                         *(DWORD*)buff = SDCardInfo.CardCapacity/512;
  25.                         res = RES_OK;
  26.                         break;
  27.                     default:
  28.                         res = RES_PARERR;
  29.                         break;
  30.             }
  31.                 return res;

  32.         case FS_NAND :
  33.                 res = RES_OK;
  34.                 return res;
  35.         }
  36.         return RES_PARERR;
  37. }
复制代码
分析原因就是在格式化的时候,调用disk_ioctl 并没有返回合适的sd卡尺寸大小,导致无法选为fat32格式。

在格式化的前面,需要马上挂载文件系统;f_mount(&fs, FS_VOLUME_SD, 1);

操作完了,马上卸载文件系统即可;f_mount(NULL, FS_VOLUME_SD, 1);
貌似是不能延迟挂载的。

评分

参与人数 2金币 +108 收起 理由
KSL123456 + 8 很给力! 亲测可用,硬汉哥驱动,R0.12c文.
eric2013 + 100 很给力!

查看全部评分

回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
117563
QQ
发表于 2021-8-7 09:51:56 | 显示全部楼层
感谢楼主分享。
回复

使用道具 举报

1

主题

12

回帖

15

积分

新手上路

积分
15
发表于 2021-8-7 15:42:59 | 显示全部楼层
最新的FATFS 0.14b出来了 支持exFAT (0.12b已经支持)

轻松上128g
回复

使用道具 举报

1

主题

2

回帖

5

积分

新手上路

积分
5
 楼主| 发表于 2021-8-8 12:44:08 | 显示全部楼层
sudywolf 发表于 2021-8-7 15:42
最新的FATFS 0.14b出来了 支持exFAT (0.12b已经支持)

轻松上128g

嗯,下次有空试试,暂时没试新版本的。工业控制首要考虑是稳定性;一旦应用没问题不好更新,所以还用着0.10老版本。也知道这边版本很老了,假如不是非常严重的bug;一般都不动了
回复

使用道具 举报

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

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2025-8-14 16:15 , Processed in 0.041467 second(s), 25 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

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