基于STM32F407的FatFs文件系统在SD卡驱动上的移植

基于STM32F407的FatFs文件系统在SD卡驱动上的移植

DanielLee_USTB

2014-2-26

         最近在做SD卡驱动,以前移植过efsl,觉得用的人不是很多,现在移植个FatFs,也跟上队伍。

         第一步,保证SD卡底层驱动函数正确,包括SD卡初始化、SD扇区读写等。

         第二步,下载FatFs源码,名为ff9b.zip,解压在src文件夹中可以得到diskio.c、ff.c、以及\option\cc936.c这三个源码文件,在STM32F407工程文件中创建FatFs文件夹,加入这几个源码以及相应头文件,并且在系统Include Path中加入这个文件夹的位置,以编译时找到其头文件。

         第三步开始移植。diskio.c这个文件中定义了fatfs文件系统与硬件存储器之间的接口函数,供文件系统调用,包括disk_initialize、disk_status、disk_read、disk_write、disk_ioctl五个函数。ff.c中存放了FatFs文件操作的常用函数,包括文件以及文件夹的操作。cc936.c是简体汉字编码文件。

         首先在ffconf.h中配置文件系统。将#define_CODE_PAGE         932 改为936以支持简体中文,原来默认支持日文,不知道为啥,莫非这个东东是日本人写的?先不研究。编译一下,发现如下错误:

         #if !_USE_LFN || _CODE_PAGE != 936

         #error This file is not needed incurrent configuration. Remove from the project.

         #endif

         其中宏定义_USE_LFN表明是否使用长文件名,修改为1,使用静态区BSS存储,最长文件名为255个字符。重新编译,发现有很多没有定义的函数,包括例如ATA_disk_initialize、ATA_disk_status、ATA_disk_read、ATA_disk_write等,由于我们使用的介质是SD卡,删掉其他ATA、USB以及MMC相关的函数,只留下SD_disk_initialize、SD_disk_status、SD_disk_read、SD_disk_write、SD_disk_ioctl以及get_fattime这几个函数。

         下面就逐步实现这几个函数。

         disk_initialize,对应底层函数为SD_Init。

         disk_status中简单让其返回0,表示成功。

         disk_read可看出输入有四个参数值,分别为设备类型pdrv、数据缓存区指针buff、扇区地址sector以及扇区个数count。这可以看出disk_read一次可以读取多个扇区,在函数体内添加

        for(cnt=0; cnt<count; cnt++){

            res =SD_ReadSingleBlock(sector+cnt, buff+cnt*512);

            if(res != RES_OK) return RES_ERROR;

        }

类似的,在disk_write也如此处理。最后将disk_ioctl中直接返回状态RES_OK。改其他小错误后编译通过。

         下面开始测试,在SD卡中编写一个创建文件测试用例:

         创建文件系统以及文件对象:

         FATFS fs;

         FIL file;

         ①result = f_mount(FS_SD, &fs);挂载文件系统,说明在系统中存在了FS_SD这个设备以及文件系统

         ②result = f_opendir(&DirInf, "/");打开根目录,在这个函数中又调用了chk_mounted,对SD卡进行了初始化

         ③result = f_open(&file, "helloYou.txt",FA_CREATE_ALWAYS | FA_WRITE);在根目录下创建一个文本文件

         ④result = f_write(&file,text,strlen(text), &bw); 写入测试文档,为了可以测试写入多个块儿是不是正确,直接找了一大段天龙八部写了进去,可以在SD卡中看到正确的文档,哈哈,测试成功。



要在STM32F407移植FATFS文件系统,首先需要了解FATFS是一个开源的文件系统,它可以在嵌入式设备上实现存储器的文件读写操作。 在移植FATFS之前,需要准备一些基本的材料,如软件开发环境、相关的文档和资料。可以从FATFS的官方网站下载最新版本的库文件和相关的示例代码。 首先,创建一个新的工程,并在工程中添加所需的库文件和头文件。将fatfs.c和diskio.c两个源文件添加到工程,并在工程设置中包含相关的头文件目录。 接下来,在工程中添加适配底层硬件的代码,在这里是针对STM32F407的。需要编写适配FATFS的底层I/O读写操作的代码,包括初始化SD卡、读取扇区数据和写入扇区数据。 然后,根据具体需求配置FATFS的参数。可以在fatfs_conf.h文件中修改相关的参数,如簇大小、扇区大小和最大文件数等。这些参数根据实际应用需求进行调整。 最后,编写应用程序代码。可以利用FATFS提供的API来实现文件的打开、读取和写入等操作。需要注意的是在使用FATFS API之前,需要先调用f_mount函数挂载文件系统。 完成以上步骤后,就可以进行编译和烧录操作,将程序下载到STM32F407上进行测试。可以通过读取和写入文件来验证FATFS的正常工作。 总结来说,STM32F407移植FATFS文件系统需要准备相关的材料,包括库文件和文档。然后添加相关的源文件和头文件到工程中,并编写适配底层硬件的代码。之后根据需求配置FATFS参数,并编写应用程序代码。最后进行编译和烧录操作,进行测试。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值