本文主要是介绍STM32移植fatfs(R0.10a版本),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
关于STM32单片机移植FATFS。
使用单片机的朋友都知道单片机一般提供的ROM和RAM都比较小。就算是STM32这样的提供256KB flash和64KB RAM的。一旦你需要存一些数据量比较大的文件的时候还是不够用的。一般可以通过外扩SD和nand flash来实现大容量存储。相对来说SD卡的使用更加方便一些。使用过nand flash的也许会知道nand flash有坏块,使用的时候需要做坏块管理,还有就是需要做损耗均衡。不然nand flash很容易就会坏掉。
下面说说SD卡。SD卡驱动有两种方式。一种是SPI驱动方式。还有一种是SDIO驱动方式。SPI驱动时只需要4更线:CLK、SD_CS、MISO、MOSI。SDIO则需要CLK、CMD、Data0、Data1、Data2、Data3。如果使用SDIO的话必须要硬件支持SDIO。类似51这样的单片机就不具备SDIO接口(STM32具有)。为了方便。这里使用SPI方式驱动SD卡。
首先需要去fatfs的网站下载fatfs源码。最好不要使用百度上下载的,因为百度上面的也许人家改过了,到时候出问题了都不知道是在哪里出错的。
http://www.elm-chan.org/fsw/ff/00index_e.html 可以在这里下载最新的源码。拿到源码后解压压缩包。或者使用http://pan.baidu.com/s/1gf3mdgv这里的压缩包,这个是我下载的未修改的源码。解压后的源码有两个文件夹如下图:
进入src文件夹,问加减里面的文件如下图所示:
在移植fatfs之前需要做的工作是写好SD卡的最底层的驱动。这一部分这里不做详细介绍。默认为已经完成该部分工作。
然后建立工程。
首先使用一个已经完成SD卡最底层读写的工程。
我这里使用的是原子的SD卡的底层读写。你也可以自己写。之所以用他的是因为用的人很多,后面大家来套我这个套路也比较容易找到代码。
然后在工程的基础上添加fatfs的相关文件(src文件夹下面的ff.c、diskio.c和option文件夹下面的cc936.c)添加好这两个文件到工程下面之后。就要对fatfs相关文件进行修改。主要修改的是diskio.c和ffcong.h这两个文件。还有就是修改STM32工程文件的path。要把src里面的文件的路径包含进去。
在未修改之前的diskio.c文件里面的11、12/13行都是有一把红色的×的。那是因为没有这些头文件。直接把他们注释掉就好了。反正也不用。
改为下图模式
把ATA改为SD_Card。我们这里做SD的文件系统。不用管MMC和USB的。可以不用理他。然后diskio.c里面所有的ATA全部改为SD_Card。注释掉:
result = MMC_disk_initialize();
result = USB_disk_initialize();
result = MMC_disk_status();
result = USB_disk_status();
result = MMC_disk_read(buff, sector, count);
result = USB_disk_read(buff, sector, count);
result = MMC_disk_write(buff, sector, count);
result = USB_disk_write(buff, sector, count);
result = MMC_disk_ioctl(cmd, buff);
result = USB_disk_ioctl(cmd, buff);
找到
修改SD卡的初始化改为:
当然如果你的SD卡初始化、不是这个名字 请改为你自己SD卡初始化的名字。
修改disk_status函数:改为图中模样。
修改disk_read函数 如下图
同理根据你自己SD的读扇区函数名。
修改disk_write函数
修改disk_ioctl函数
然后再文件的最后面加上
DWORD get_fattime (void)
{
return 0;
}
//动态分配内存
void ff_memalloc (UINT size)
{
return (void)mymalloc(size);
}
//释放内存
void ff_memfree (void* mf)
{
myfree(mf);
}
修改ffconf.h文件:
1.将#define _USE_STRFUNC 0改为#define _USE_STRFUNC 1
2.#define _USE_MKFS 0改为#define _USE_MKFS 1
3.#define _USE_FASTSEEK 0改为#define _USE_FASTSEEK 1
4.#define _USE_LABEL 0改为#define _USE_LABEL 1
5.#define _CODE_PAGE 932改为#define _CODE_PAGE 936
6.#define _USE_LFN 0改为#define _USE_LFN 3
7.#define _VOLUMES 1改为#define _VOLUMES 2
到这里基本就修改完了。
这里附上STM32F103RCT6的SD卡fatfa的工程http://pan.baidu.com/s/1cAhWNs
更多软件/硬件/单片机交流请加群:740600942
(待续…)
这篇关于STM32移植fatfs(R0.10a版本)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!