在STM32中移植FATFS文件系统之欧阳理创编Word格式文档下载.docx
《在STM32中移植FATFS文件系统之欧阳理创编Word格式文档下载.docx》由会员分享,可在线阅读,更多相关《在STM32中移植FATFS文件系统之欧阳理创编Word格式文档下载.docx(24页珍藏版)》请在冰豆网上搜索。
2、解压文件会得到两个文件夹,一个是doc文件夹,这里是FATFS的一些使用文档和说明,以后在文件编程的时候可以查看该文档。
另一个是src文件夹,里面就是我们所要的源文件。
3、建立一个STM32的工程,为方便调试,我们应重载printf()底层函数实现串口打印输出。
可以参考已经建立好的printf()打印输出工程:
...d=77&
extra=page%3D1四、开始移植
1、在已经建立好的工程目录User文件夹下新建两个文件夹,FATFS_V0.09和SPI_SD_Card,FATFS_V0.09用于存放FATFS源文件,SPI_SD_Card用于存放SPI的驱动文件。
2、如图1将ff.c添加到工程文件夹中,并新建diskio.c文件,在diskio.c文件中实现五个函数:
1.DSTATUSdisk_initialize(BYTE);
//SD卡的初始化
2.
DSTATUSdisk_status(BYTE);
//获取SD卡的状态,这里可以不用管
3.
DRESULTdisk_read(BYTE,BYTE*,DWORD,BYTE);
//从SD卡读取数据
4.
DRESULTdisk_write(BYTE,constBYTE*,DWORD,BYTE);
//将数据写入SD卡,若该文件系统为只读文件系统则不用实现该函数
5.
DRESULTdisk_ioctl(BYTE,BYTE,void*);
//获取SD卡文件系统相关信息
复制代码
<
IGNORE_JS_OP>
图1
3、初步实现以上五个函数
FATFS初始化函数:
1.DSTATUSdisk_initialize(
BYTEdrv
/*Physicaldrivenmuber(0..)*/
)
{
switch(drv)
6.
{
7.
case0:
8.
returnRES_OK;
9.
case1:
10.
11.
case2:
12.
13.
case3:
14.
15.
default:
16.
returnSTA_NOINIT;
17.
}
18.
}
FATFS状态获取函数:
1.DSTATUSdisk_status(
/*Physicaldrivenmuber(0..)*/
FATFS底层读数据函数:
1.DRESULTdisk_read(
BYTEdrv,
BYTE*buff,
/*Databuffertostorereaddata*/
DWORDsector,
/*Sectoraddress(LBA)*/
BYTEcount
/*Numberofsectorstoread(1..255)*/
if(!
count)
{
returnRES_PARERR;
/*count不能等于0,否则返回参数错误*/
case0:
if(count==1)
/*1个sector的读操作*/
returnRES_OK;
}
19.
else
/*多个sector的读操作*/
20.
21.
22.
23.
case1:
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
returnRES_ERROR;
34.
35.
FATFS底层写数据函数:
1.DRESULTdisk_write(
constBYTE*buff,
/*Datatobewritten*/
/*Sectoraddress(LBA)*/
/*Numberofsectorstowrite(1..255)*/
/*1个sector的写操作*/
/*多个sector的写操作*/
FATFS磁盘控制函数:
1.DRESULTdisk_ioctl(
BYTEctrl,
/*Controlcode*/
void*buff
/*Buffertosend/receivecontroldata*/
if(drv==0)
switch(ctrl)
caseCTRL_SYNC:
caseGET_SECTOR_COUNT:
caseGET_BLOCK_SIZE:
caseCTRL_POWER:
break;
caseCTRL_LOCK:
caseCTRL_EJECT:
/*MMC/SDCcommand*/
caseMMC_GET_TYPE:
caseMMC_GET_CSD:
caseMMC_GET_CID:
caseMMC_GET_OCR:
caseMMC_GET_SDSTAT:
}elseif(drv==1){
36.
37.
38.
39.
40.
41.
42.
caseGET_SECTOR_SIZE:
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
}
64.
65.
else{
66.
67.
68.
returnRES_PARERR;
69.
以上函数都只是实现一个框架,并没有做实际的事情,下一步就需要把操作SD卡的程序填充在这个框架里面。
4、实现disk_initialize()函数
该函数在挂载文件系统的时候会被调用,主要是实现读写SD卡前对SD卡进行初始化,根据SD卡的传输协议,我们按照如下步骤初始化SD卡:
a、判断SD卡是否插入,可以通过检查SD卡卡座的CD脚电平进行判断,一般插入卡后该引脚会变成低电平。
b、稍微延时一段时间后发送至少74个时钟给SD卡。
c、发送CMD0命令给SD卡,直到SD卡返回0x01为止,这里可以循环多次发送。
程序如下:
1.
/*StartsendCMD0tillreturn0x01meansinIDLEstate*/
for(retry=0;
retry<
0xFFF;
retry++)
r1=MSD0_send_