打印
[STM32F1]

STM32基础篇——FAT 文件系统实验

[复制链接]
7110|54
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
实验目标:
1. 了解 FAT 文件系统
2. 学会移植 FATFS
3. 学会使用 FATFS
沙发
aizaixiyuanqian|  楼主 | 2018-3-31 20:20 | 只看该作者
我们学习了 SD 卡的使用,并且学会了怎么对 SD 卡进行读写操作,不过要
真正应用 SD 卡,必须学习使用文件系统。什么是文件系统呢,操作系统用于明
确磁盘或分区上的文件的方法和数据结构,即在磁盘上组织文件的方法。我们电
脑的 windows 系统使用的就是 FAT 文件系统,大家都知道,一般我们新买的 SD
卡,如果没有使用过,插入电脑的时候都要先格式化,为什么呢?就是因为 SD
卡里面没有建立 FAT 文件系统,所以格式化之后,建立了 FAT 文件系统,电脑
才能识别 SD 卡上面的内存和文件。FAT 文件系统根据字节长度,有 FAT12、
FAT16、FAT32。

使用特权

评论回复
板凳
aizaixiyuanqian|  楼主 | 2018-3-31 20:22 | 只看该作者
FATFS  简介
FATFS 是一个完全免费开源的 FAT 文件系统模块,专门为小型的嵌入式系
统而设计。它完全用标准 C 语言编写,所以具有良好的硬件平**立性,可以
移植到 8051、PIC、AVR、SH、Z80、H8、ARM 等系列单片机上而只需做简
单的修改。它支持 FATl2、FATl6 和 FAT32,支持多个存储媒介;有独立的缓
冲区,可以对多个文件进行读/写,并特别对 8 位单片机和 16 位单片机做了优
化。

使用特权

评论回复
地板
aizaixiyuanqian|  楼主 | 2018-3-31 20:25 | 只看该作者
FATFS  的移植
FATFS 源码文件说明
我们这里移植示范使用的是 R0.09b 版本,在我们例程文件下有一个 R0.09b
版本的压缩包。

使用特权

评论回复
5
aizaixiyuanqian|  楼主 | 2018-3-31 20:26 | 只看该作者
我们解压该压缩包,会得到两个文件夹:


使用特权

评论回复
6
aizaixiyuanqian|  楼主 | 2018-3-31 20:28 | 只看该作者
本帖最后由 aizaixiyuanqian 于 2018-3-31 20:30 编辑

其中 doc 文件夹是各种使用说明,有英文版的和日文版的。而 src 文件夹就
是我们要使用的 FATFS 源码:

使用特权

评论回复
7
aizaixiyuanqian|  楼主 | 2018-3-31 20:31 | 只看该作者
其中我们不需要修改的文件是:
ff.h FATFS 和应用模块公用的包含文件
ff.c FATFS 模块
diskio.h FATFS 和 disk I/O 模块公用的包含文件
interger.h 数据类型定义

使用特权

评论回复
8
aizaixiyuanqian|  楼主 | 2018-3-31 20:37 | 只看该作者
里面还有个 option 文件夹,这个是可选的外部功能(比如支持中文等)。一般我们使用中文的话,将 cc936.c 添加到工程里面就好了。

使用特权

评论回复
9
aizaixiyuanqian|  楼主 | 2018-3-31 20:38 | 只看该作者
那么我们需要修改的文件也就两个了。
ffconf.h FATFS 模块配置文件
diskio.c FATFS 和 disk I/O 模块接口层文件

使用特权

评论回复
10
aizaixiyuanqian|  楼主 | 2018-3-31 20:49 | 只看该作者
ffconf.h 配置说明
这 ffconf.h 的头文件里面是关于 FATFS 的各种设置,我们可以根据自己的需
要来裁剪 FATFS,已达到自己想要的标准。我们来看一下它都有那些设置:
1) _FS_TINY
这个设置是配置是使用标准模式,还是微小模式。我们使用标准模式,
这里设置为:0。
2) _FS_READONLY
是否使用只读模式,我们选择可读可写。设置为:0。
3) _FS_MINIMIZE
这个设置是选择是否裁剪掉一些函数,具体裁剪那些,大家可以查看下
面的设置说明,我们这里使用的全功能模式。设置为:0。
4) _USE_STRFUNC
这个用来设置是否支持字符串类操作,我们选择使用。设置为:1。
5) _USE_MKFS
使用使用格式化,我们这里选择使用。设置为:1。

使用特权

评论回复
11
aizaixiyuanqian|  楼主 | 2018-3-31 20:51 | 只看该作者
6) _USE_FASTSEEK
使用使能快速定位,我们选择使用。设置为:1。
7) _USE_LABEL
是否启用磁盘卷标功能。使用也可以,不使用也可以。我们这里使用。
设置为:1。
8) _USE_FORWARD
这个是在 TINY 模式下的设置,我们这里使用标准模式,不理它。
9) _CODE_PAGE
这个用于设置语言类型。我们使用的中文。设置为:936
10) _USE_LFN
该选项用于设置是否支持长文件名(还需要_CODE_PAGE 支持),取值
范围为 0~3。0,表示不支持长文件名,1~3 是支持长文件名,但是存储地方
不一样。我们这里就默认使用 FATFS 本身的存储方式了。设置为:1。

使用特权

评论回复
12
aizaixiyuanqian|  楼主 | 2018-3-31 20:52 | 只看该作者
11) _MAX_LFN
设置最大文件名长度,我们直接设置最大。设置为:255。
12) _LFN_UNICODE
是否使用 FATFS 的字符编码。我们不使用。设置为:0
13) _FS_RPATH
这里也是一些函数裁剪,我们这里设置为:1。
14) _VOLUMES
这里设置的是支持的卷轴数量,我们挂载 SD 卡,有时候可以挂载下
FLASH,所以这里我们设置为两个:2。
15) _MAX_SS
这里是设置扇区缓冲的最大值,我们设置为:512。

使用特权

评论回复
13
aizaixiyuanqian|  楼主 | 2018-3-31 20:52 | 只看该作者
16) _MULTI_PARTITION
是否使用多重分区分配。我们这里设置为:0。
17) _USE_ERASE
使用使用扇区擦除。我们这里不那么麻烦,想使用的时候在设置。设置
为:0。
18) _WORD_ACCESS
这里定义使用权限。一般不使用。我们设置为:0。
19) _FS_REENTRANT
20) _FS_TIMEOUT
21) _SYNC_t
22) _FS_LOCK
这几个设置,我们都没有使用到,所以直接保持默认状态就好。

使用特权

评论回复
14
aizaixiyuanqian|  楼主 | 2018-3-31 21:03 | 只看该作者
diskio.c 移植
diskio.c 是最底层的接口函数。一般需要编写 6 个接口函数,如图:

使用特权

评论回复
15
aizaixiyuanqian|  楼主 | 2018-3-31 21:04 | 只看该作者
1) disk_initialize()函数

使用特权

评论回复
16
aizaixiyuanqian|  楼主 | 2018-3-31 21:21 | 只看该作者
移植代码如下:
/*-----------------------------------------------------------------------*/
/* Inidialize a Drive 初始化磁盘 */
/*-----------------------------------------------------------------------*/
DSTATUS disk_initialize (
BYTE pdrv /* Physical drive nmuber (0..) */
)
{
DRESULT res = RES_ERROR;
int result;
switch (pdrv) {
case SD_CARD :
result = SD_Init();
if(result == 0)
{
res = RES_OK;
}
break;

case USB :
break;
default:
break;
}
return res;
}
其实修改并不多,在这个函数里面,红色字体部分就是 SD 卡初始化移植部
分。

使用特权

评论回复
17
aizaixiyuanqian|  楼主 | 2018-3-31 21:27 | 只看该作者
2) disk_status()函数


使用特权

评论回复
18
aizaixiyuanqian|  楼主 | 2018-3-31 21:31 | 只看该作者
移植代码如下:
/*-----------------------------------------------------------------------*/
/* Get Disk Status 获取磁盘信息 */
/*-----------------------------------------------------------------------*/
DSTATUS disk_status (
BYTE pdrv /* Physical drive nmuber (0..) */
)
{
pdrv = pdrv;
return 0;
}
这里我们不使用这个函数,所以我们什么都不写,直接返回 0 就好。

使用特权

评论回复
19
aizaixiyuanqian|  楼主 | 2018-3-31 21:35 | 只看该作者
3) disk_read()函数

使用特权

评论回复
20
aizaixiyuanqian|  楼主 | 2018-3-31 21:35 | 只看该作者
移植代码如下:
/*-----------------------------------------------------------------------*/
/* Read Sector(s) 读取扇区 */
/*-----------------------------------------------------------------------*/
DRESULT disk_read (
BYTE pdrv, /* Physical drive nmuber (0..) */
BYTE *buff,  /* Data buffer to store read data */
DWORD sector, /* Sector address (LBA) */
BYTE count /* Number of sectors to read (1..128) */
)
{
DRESULT res = RES_ERROR;
int result;
switch (pdrv) {
case SD_CARD :
result = SD_ReadDisk(buff, sector, count);
if(result)
{
res = RES_ERROR;
}
else
{
res = RES_OK;
}
break;

case USB :
break;
default:
break;
}
return res;
}
SD 卡移植是红色字体部分。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

62

主题

1353

帖子

6

粉丝