第37章 基于SD卡的FatFs文件系统—零死角玩转STM32-F429系列

 

第37章     基于SD卡的FatFs文件系统

全套200集视频教程和1000PDF教程请到秉火论坛下载:www.firebbs.cn

野火视频教程优酷观看网址:http://i.youku.com/firege

 

 

 

上一章我们已经全面介绍了SD卡的识别和简单的数据读写,也进行了简单的读写测试,不过像这样直接操作SD卡存储单元,在实际应用中是不现实的。SD卡一般用来存放文件,所以都需要加载文件系统到里面。类似于串行Flash芯片,我们移植FatFs文件系统到SD卡内。

对于FatFs文件系统的介绍和具体移植过程参考"基于串行FlashFatFs文件系统",这里就不做过多介绍,重点放在SD卡与FatFs接口函数编写上。与串行FlashFatFs文件系统移植例程相比,FatFs文件系统部分的代码只有diskio.c文件有所不同,其他的不用修改,所以一个简易的移植方法是利用原来工程进行修改。下面讲解利用原来工程实现SD卡的FatFs文件系统。

37.1 FatFs移植步骤

上一章我们已经完成了SD卡驱动程序以及进行了简单的读写测试。该工程有很多东西是现在可以使用的,所以我们先把上一章的工程文件完整的拷贝一份,并修改文件夹名为"SDIO-FatFs移植与读写测试",如果此时使用KEIL软件打开该工程,应该是编译无错误并实现上一章的测试功能。

接下来,我们到串行Flash文件系统移植工程文件的"\SPIFatFs移植与读写测试\User"文件夹下拷贝"FATFS"整个文件夹到现在工程文件的"\SDIOFatFs移植与读写测试\User"文件夹下,如图 371。该文件夹是FatFs文件系统的所有代码文件,在串行Flash移植FatFs文件系统时我们对部分文件做了修改,这里主要是想要保留之前的配置,而不是使用FatFs官方源码还需要重新配置。

371 拷贝FatFs文件夹

现在就可以使用KEIL软件打开"SDIO-FatFs移植与读写测试"工程文件,并把FatFs相关文件添加到工程内,同时把sdio_test.c文件移除,参考图 372

372 FatFs工程文件结构

添加文件之后还必须打开工程选项对话框添加相关路径,参考图 373

373 添加FatFs路径到工程

操作到这来,工程文件结构就算完整了,接下来就是修改文件代码了。这来有两个文件需要修改,为diskio.c文件和main.c文件。main.c文件内容可以参考"SPIFatFs移植与读写测试"工程中的main.c文件,只有做小细节修改而已。这来重点讲解diskio.c文件,也是整个移植的重点。

37.2 FatFs接口函数

FatFs文件系统与存储设备的连接函数在diskio.c文件中,主要有5个函数需要我们编写的。

宏定义和存储设备状态获取函数

代码清单 371 宏定义和disk_status函数

1 //宏定义

2 #define ATA 0 // SD

3 #define SPI_FLASH 1 // 预留外部SPI Flash使用

4 // SD卡块大小

5 #define SD_BLOCKSIZE 512

6

7 //存储设备状态获取

8 DSTATUS disk_status (

9 BYTE pdrv /* 物理编号 */

10 )

11 {

12 DSTATUS status = STA_NOINIT;

13 switch (pdrv) {

14 case ATA: /* SD CARD */

15 status &= ~STA_NOINIT;

16 break;

17

18 case SPI_FLASH: /* SPI Flash */

19 break;

20

21 default:

22 status = STA_NOINIT;

23 }

24 return status;

25 }

FatFs支持同时挂载多个存储设备,通过定义为不同编号以区别。SD卡一般定义为编号0,编号1预留给串行Flash芯片使用。使用宏定义方式给出SD卡块大小,方便修改。实际上,SD卡块大小一般都是设置为512字节的,不管是标准SD卡还是高容量SD卡。

disk_status函数要求返回存储设备的当前状态,对于SD卡一般返回SD卡插入状态,这里直接返回正常状态。

存储设备初始化函数

代码清单 372 disk_initialize函数

1 DSTATUS disk_initialize (

2 BYTE pdrv /* 物理编号 */

3 )

4 {

5 DSTATUS status = STA_NOINIT;

6 switch (pdrv) {

7 case ATA: /* SD CARD */

8 if (SD_Init()==SD_OK) {

9 status &= ~STA_NOINIT;

10 } else {

11 status = STA_NOINIT;

12 }

13

14 break;

15

16 case SPI_FLASH: /* SPI Flash */

17 break;

18

19 default:

20 status = STA_NOINIT;

21 }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值