OpenEdv-开源电子网

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

fatfs管理的磁盘大小怎么来的?

[复制链接]

12

主题

30

帖子

0

精华

初级会员

Rank: 2

积分
176
金钱
176
注册时间
2016-10-19
在线时间
52 小时
发表于 2021-5-13 15:51:18 | 显示全部楼层 |阅读模式
1金钱
在使用fatfs时,看到管理spiflash的时候,原子哥实验说的:#define FATFS_FLASH_SECTOR_SIZE         512       
#define FATFS_FLASH_SECTOR_COUNT         1024*25*2               
#define FATFS_FLASH_BLOCK_SIZE           8                    

对于W25Q256(32M),FATFS管理的是25M。这个25M的大小似乎不是人为设置的吧,而是W25Q256内部决定的。找了代码没有看到人为设置的地方。
FRESULT f_getfree (
        const TCHAR* path,        /* Path name of the logical drive number */
        DWORD* nclst,                /* Pointer to a variable to return number of free clusters */
        FATFS** fatfs                /* Pointer to return pointer to corresponding file system object */
)
{
        FRESULT res;
        FATFS *fs;
        DWORD nfree, clst, sect, stat;
        UINT i;
        BYTE *p;
        _FDID obj;


        /* Get logical drive number */
        res = find_volume(&path, &fs, 0);
        if (res == FR_OK) {
                *fatfs = fs;                                /* Return ptr to the fs object */
                /* If free_clst is valid, return it without full cluster scan */
                if (fs->free_clst <= fs->n_fatent - 2) {
                        *nclst = fs->free_clst;
                } else {
                        /* Get number of free clusters */
                        nfree = 0;
                        if (fs->fs_type == FS_FAT12) {        /* FAT12: Sector unalighed FAT entries */
                                clst = 2; obj.fs = fs;
                                do {
                                        stat = get_fat(&obj, clst);
                                        if (stat == 0xFFFFFFFF) { res = FR_DISK_ERR; break; }
                                        if (stat == 1) { res = FR_INT_ERR; break; }
                                        if (stat == 0) nfree++;
                                } while (++clst < fs->n_fatent);
                        } else {
#if _FS_EXFAT
                                if (fs->fs_type == FS_EXFAT) {        /* exFAT: Scan bitmap table */
                                        BYTE bm;
                                        UINT b;

                                        clst = fs->n_fatent - 2;
                                        sect = fs->database;
                                        i = 0;
                                        do {
                                                if (i == 0 && (res = move_window(fs, sect++)) != FR_OK) break;
                                                for (b = 8, bm = fs->win; b && clst; b--, clst--) {
                                                        if (!(bm & 1)) nfree++;
                                                        bm >>= 1;
                                                }
                                                i = (i + 1) & (SS(fs) - 1);
                                        } while (clst);
                                } else
#endif
                                {        /* FAT16/32: Sector alighed FAT entries */
                                        clst = fs->n_fatent; sect = fs->fatbase;
                                        i = 0; p = 0;
                                        do {
                                                if (i == 0) {
                                                        res = move_window(fs, sect++);
                                                        if (res != FR_OK) break;
                                                        p = fs->win;
                                                        i = SS(fs);
                                                }
                                                if (fs->fs_type == FS_FAT16) {
                                                        if (ld_word(p) == 0) nfree++;
                                                        p += 2; i -= 2;
                                                } else {
                                                        if ((ld_dword(p) & 0x0FFFFFFF) == 0) nfree++;
                                                        p += 4; i -= 4;
                                                }
                                        } while (--clst);
                                }
                        }
                        *nclst = nfree;                        /* Return the free clusters */
                        fs->free_clst = nfree;        /* Now free_clst is valid */
                        fs->fsi_flag |= 1;                /* FSInfo is to be updated */
                }
        }

        LEAVE_FF(fs, res);
}

直接使用读取函数读出来也是25M左右。这个大小是怎么来的,有大佬能讲一下吗。


最佳答案

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

自己定义的,宏定义里面可以自己改,改成20M也行。SPI Flash是32M字节的,自己随意分配,只要小于32M字节就行,超过32M字节就会挂载文件系统失败。
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

6

主题

45

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
312
金钱
312
注册时间
2016-12-3
在线时间
46 小时
发表于 2021-5-13 15:51:19 | 显示全部楼层
自己定义的,宏定义里面可以自己改,改成20M也行。SPI Flash是32M字节的,自己随意分配,只要小于32M字节就行,超过32M字节就会挂载文件系统失败。
回复

使用道具 举报

4

主题

896

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
4310
金钱
4310
注册时间
2019-9-4
在线时间
897 小时
发表于 2021-5-13 16:39:29 | 显示全部楼层
自己分配的
回复

使用道具 举报

12

主题

30

帖子

0

精华

初级会员

Rank: 2

积分
176
金钱
176
注册时间
2016-10-19
在线时间
52 小时
 楼主| 发表于 2021-5-13 17:47:49 | 显示全部楼层
zhang90283 发表于 2021-5-13 16:36
自己定义的,宏定义里面可以自己改,改成20M也行。SPI Flash是32M字节的,自己随意分配,只要小于32M字节就 ...

那个宏定义不起作用吧,改了之后读出来还是25M
回复

使用道具 举报

12

主题

30

帖子

0

精华

初级会员

Rank: 2

积分
176
金钱
176
注册时间
2016-10-19
在线时间
52 小时
 楼主| 发表于 2021-5-13 17:50:48 | 显示全部楼层

程序上没有体现啊
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165377
金钱
165377
注册时间
2010-12-1
在线时间
2111 小时
发表于 2021-5-14 01:58:57 | 显示全部楼层
村头柯师傅 发表于 2021-5-13 17:47
那个宏定义不起作用吧,改了之后读出来还是25M

改了之后,你得重新格式化才会生效。。。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

12

主题

30

帖子

0

精华

初级会员

Rank: 2

积分
176
金钱
176
注册时间
2016-10-19
在线时间
52 小时
 楼主| 发表于 2021-5-14 08:41:42 | 显示全部楼层
正点原子 发表于 2021-5-14 01:58
改了之后,你得重新格式化才会生效。。。

好滴我试一下,那像NANDFLASH和SD卡这些可以设置大小吗。
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-2-27 20:44

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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