打印

百为STM32开发板教程之十八——SDIO + FATFS

[复制链接]
6942|8
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
xi_liang|  楼主 | 2013-10-19 09:50 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
百为STM32开发板教程之十八——SDIO + FATFS

实验目的:在STM32学习任务十八——SDIO里我们已经介绍SD卡协议和SD卡读写测试,但是还没有增加文件系统,没法读SD卡内的文件。
在这节里我们将增加最常用的文件系统FATFS,并编程程序读写SD卡内的文件。

一、FATFS简介
二、FATFS移植
三、编程实现读写SD卡的文件

一、FATFS简介
FATFS官网主页:
http://elm-chan.org/fsw/ff/00index_e.html

FATFS是用C写的一个FAT文件系统。它的应用层和驱动层是完全分开的,所以很容易移植到其他处理器,如AVR, 8051, PIC, ARM等等。

应用层接口(Application Interface):


驱动层接口(Disk I/O Interface):



二、FATFS移植
我们移植主要是要实现驱动层接口的函数。
SDIO的移植参看"STM32学习任务十八——SDIO"

首先到FATFS官网下载FATFS最新版R0.10
下载地址: http://elm-chan.org/fsw/ff/ff10.zip

然后解压把ff10/src里面的内容拷贝到工程目录Utilities\FatFS_R0.10目录下

然后在工程里添加组FatFS,添加Utilities\FatFS_R0.10目录下的ff.c diskio.c文件。
添加Utilities\FatFS_R0.10\option目录下的.c文件。

2013-10-11 13:33 上传
下载附件 (12.47 KB)




然后实现diskio.c里面的几个函数:
DSTATUS disk_initialize (BYTE pdrv);
DSTATUS disk_status (BYTE pdrv);
DRESULT disk_read (BYTE pdrv, BYTE*buff, DWORD sector, UINT count);
DRESULT disk_write (BYTE pdrv, const BYTE* buff, DWORD sector, UINT count);
DRESULT disk_ioctl (BYTE pdrv, BYTE cmd, void* buff);

修改ffconf.h,使系统支持长文件名

#define _USE_LFN 0
改为
#define _USE_LFN 1


#define _CODE_PAGE 932
改为
#define _CODE_PAGE 936 //Simplified Chinese GBK (DBCS, OEM, Windows)

编译之后还会报错,这里还有个get_fattime函数要实现,我们在这里先实现为空,在diskio.c的最后面加入如下代码:
DWORD get_fattime (void)
{
}

修改ffconf.h,使系统支持格式化

#define _USE_MKFS  0
改为
#define _USE_MKFS  1



三、编程实现读写SD卡的文件
status = SD_Init();  //初始化SD卡
if(status != SD_OK)
{
  printf("sd card init error.\n\r");
}
res = f_mount(&fs ,"0:", 0);  //加载文件系统
if(res != FR_OK)
{
  printf("f_mount error = %d\n\r",res);
}
res = f_mkfs("0:", 0, 0);  //格式化SD卡
if(res != FR_OK)
{
  printf("f_mkfs error = %d\n\r",res);
}
res = f_open (&F, "1.txt", FA_CREATE_ALWAYS | FA_READ | FA_WRITE);  //创建读写文件1.txt
if(res != FR_OK)
{
  printf("f_open error = %d\n\r",res);
}
strcpy(Buffer, "hello world");
res = f_write (&F, Buffer, strlen(Buffer), &BytesWritten); //把字符串"hello world"写入文件
if(res != FR_OK)
{
  printf("f_write error = %d\n\r",res);
}
res = f_read (&F, Buffer, _MAX_SS, &BytesRead); //读出文件内的内容
if(res != FR_OK)
{
  printf("f_read error = %d\n\r",res);
}
else
{
  printf("f_read = %s\n\r", Buffer);
}

程序已上传到网盘:
百为STM32_SDIO_FATFS程序.rar
沙发
outstanding| | 2013-10-19 11:03 | 只看该作者

使用特权

评论回复
板凳
izhaolei| | 2014-2-27 22:37 | 只看该作者
:)

使用特权

评论回复
地板
xi_liang|  楼主 | 2014-5-7 21:59 | 只看该作者
izhaolei 发表于 2014-2-27 22:37

谢谢支持:handshake

使用特权

评论回复
5
tensl| | 2014-5-13 16:41 | 只看该作者
百为STM32_SDIO_FATFS程序.rar
给个链接吧

使用特权

评论回复
6
xi_liang|  楼主 | 2014-5-15 23:38 | 只看该作者
tensl 发表于 2014-5-13 16:41
百为STM32_SDIO_FATFS程序.rar
给个链接吧

买个百为开发板,什么资料都有了

使用特权

评论回复
7
hjgqx| | 2014-8-4 16:48 | 只看该作者
谢谢共享!

使用特权

评论回复
8
戈卫东| | 2014-8-4 17:01 | 只看该作者
长知识了。

使用特权

评论回复
9
shmily53| | 2016-2-25 15:28 | 只看该作者
看卡                                          

使用特权

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

本版积分规则

个人签名:http://baiweijishu.taobao.com/ 百为STM32开发板 兼容官方STM3210E-EVAL开发板 WM-G-MR-09 WIFI开发板

41

主题

285

帖子

10

粉丝