基于STM32F407的FatFs文件系统在SD卡驱动上的移植
2014-02-27 10:18
351 查看
基于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卡中看到正确的文档,哈哈,测试成功。
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卡中看到正确的文档,哈哈,测试成功。
相关文章推荐
- 基于SD卡的FatFs文件系统(FatFs移植到STM32)
- 基于FreeRTOS与MQTT的物联网技术应用系列——步进电机控制(三)SD卡驱动、FatFS等的移植和ini配置文件读取的实现
- LPC1768 SPI模式下SD卡FatFs文件系统移植
- 为STM32移植FATFS,读取SD卡上FAT12/16/32文件系统
- 基于sys文件系统的LED驱动的移植【原创】
- STM32CubeMX基于SD卡的FATFS文件系统测试(附源码)
- tinyxml移植(基于fatfs文件系统)
- mini2440移植fatFS 0.1时,识别带有MBR的SD卡文件系统,产生错误原因
- 第37章 基于SD卡的FatFs文件系统—零死角玩转STM32-F429系列
- 基于STM32的SD卡FATFS文件系统学习笔记
- 为STM32移植FATFS,读取SD卡上FAT12/16/32文件系统
- RT-Thread 学习笔记(九)---开启基于SD卡中的 Elm FatFS 文件系统
- 基于FATFS文件系统使用SDIO的4线模式在SD卡上写入数据(一)
- 为STM32移植FATFS,读取SD卡上FAT12/16/32文件系统
- 第37章 基于SD卡的FatFs文件系统—零死角玩转STM32-F429系列
- tinyxml移植(基于fatfs文件系统)
- SD卡与fatfs文件系统(2)
- U-boot移植 (v2012.04.1 S3C2440平台) (五) DM9000驱动支持,yaffs文件系统下载支持
- fatfs移植和使用(在SPI_FLASH上建立文件系统)
- 基于S3C2440的Linux内核移植和yaffs2文件系统制作--Linux内核移植