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

[复制链接]
8787|54
 楼主| aizaixiyuanqian 发表于 2018-3-31 20:20 | 显示全部楼层 |阅读模式
实验目标:
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
版本的压缩包。
 楼主| aizaixiyuanqian 发表于 2018-3-31 20:26 | 显示全部楼层
我们解压该压缩包,会得到两个文件夹:
01.png

 楼主| aizaixiyuanqian 发表于 2018-3-31 20:28 | 显示全部楼层
本帖最后由 aizaixiyuanqian 于 2018-3-31 20:30 编辑

其中 doc 文件夹是各种使用说明,有英文版的和日文版的。而 src 文件夹就
是我们要使用的 FATFS 源码: 01.png
 楼主| aizaixiyuanqian 发表于 2018-3-31 20:31 | 显示全部楼层
其中我们不需要修改的文件是:
ff.h FATFS 和应用模块公用的包含文件
ff.c FATFS 模块
diskio.h FATFS 和 disk I/O 模块公用的包含文件
interger.h 数据类型定义
 楼主| aizaixiyuanqian 发表于 2018-3-31 20:37 | 显示全部楼层
里面还有个 option 文件夹,这个是可选的外部功能(比如支持中文等)。一般我们使用中文的话,将 cc936.c 添加到工程里面就好了。 01.png
 楼主| aizaixiyuanqian 发表于 2018-3-31 20:38 | 显示全部楼层
那么我们需要修改的文件也就两个了。
ffconf.h FATFS 模块配置文件
diskio.c FATFS 和 disk I/O 模块接口层文件
 楼主| 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。
 楼主| 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。
 楼主| 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。
 楼主| 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
这几个设置,我们都没有使用到,所以直接保持默认状态就好。
 楼主| aizaixiyuanqian 发表于 2018-3-31 21:03 | 显示全部楼层
diskio.c 移植
diskio.c 是最底层的接口函数。一般需要编写 6 个接口函数,如图: 01.png
 楼主| aizaixiyuanqian 发表于 2018-3-31 21:04 | 显示全部楼层
1) disk_initialize()函数
01.png
 楼主| 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 卡初始化移植部
分。
 楼主| aizaixiyuanqian 发表于 2018-3-31 21:27 | 显示全部楼层
2) disk_status()函数
01.png

 楼主| aizaixiyuanqian 发表于 2018-3-31 21:31 | 显示全部楼层
移植代码如下:
/*-----------------------------------------------------------------------*/
/* Get Disk Status 获取磁盘信息 */
/*-----------------------------------------------------------------------*/
DSTATUS disk_status (
BYTE pdrv /* Physical drive nmuber (0..) */
)
{
pdrv = pdrv;
return 0;
}
这里我们不使用这个函数,所以我们什么都不写,直接返回 0 就好。
 楼主| aizaixiyuanqian 发表于 2018-3-31 21:35 | 显示全部楼层
3) disk_read()函数
1.png
 楼主| 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

粉丝
快速回复 在线客服 返回列表 返回顶部