在STM32中移植FATFS文件系统之欧阳地创编.docx
- 文档编号:25005677
- 上传时间:2023-06-03
- 格式:DOCX
- 页数:24
- 大小:404.64KB
在STM32中移植FATFS文件系统之欧阳地创编.docx
《在STM32中移植FATFS文件系统之欧阳地创编.docx》由会员分享,可在线阅读,更多相关《在STM32中移植FATFS文件系统之欧阳地创编.docx(24页珍藏版)》请在冰豆网上搜索。
在STM32中移植FATFS文件系统之欧阳地创编
STM32的FATFS文件系统移植笔记
时间:
2021.03.04
创作:
欧阳地
一、序言
经常在网上、群里看到很多人问关于STM32的FATFS文件系统移植的问题,刚好自己最近也在调试这个程序,为了让大家少走弯路,我把我的调试过程和方法也贡献给大家。
二、FATFS简介
FatFsModule是一种完全免费开源的FAT文件系统模块,专门为小型的嵌入式系统而设计。
它完全用标准C语言编写,所以具有良好的硬件平台独立性,可以移植到8051、PIC、AVR、SH、Z80、H8、ARM等系列单片机上而只需做简单的修改。
它支持FATl2、FATl6和FAT32,支持多个存储媒介;有独立的缓冲区,可以对多个文件进行读/写,并特别对8位单片机和16位单片机做了优化。
三、移植准备
1、FATFS源代码的获取,可以到官网下载:
http:
//elm-chan.org/fsw/ff/00index_e.html 最新版本是R0.09版本,我们就移植这个版本的。
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卡文件系统相关信息
复制代码
图1
3、初步实现以上五个函数
FATFS初始化函数:
1.DSTATUSdisk_initialize(
2. BYTEdrv /*Physicaldrivenmuber(0..)*/
3. )
4. {
5. switch(drv)
6. {
7. case0:
8. returnRES_OK;
9. case1:
10. returnRES_OK;
11. case2:
12. returnRES_OK;
13. case3:
14. returnRES_OK;
15. default:
16. returnSTA_NOINIT;
17. }
18. }
复制代码
FATFS状态获取函数:
1.DSTATUSdisk_status(
2. BYTEdrv /*Physicaldrivenmuber(0..)*/
3. )
4. {
5. switch(drv)
6. {
7. case0:
8. returnRES_OK;
9. case1:
10. returnRES_OK;
11. case2:
12. returnRES_OK;
13. default:
14. returnSTA_NOINIT;
15. }
16. }
复制代码
FATFS底层读数据函数:
1.DRESULTdisk_read(
2. BYTEdrv, /*Physicaldrivenmuber(0..)*/
3. BYTE*buff, /*Databuffertostorereaddata*/
4. DWORDsector, /*Sectoraddress(LBA)*/
5. BYTEcount /*Numberofsectorstoread(1..255)*/
6. )
7. {
8. if(!
count)
9. {
10. returnRES_PARERR; /*count不能等于0,否则返回参数错误*/
11. }
12. switch(drv)
13. {
14. case0:
15. if(count==1) /*1个sector的读操作*/
16. {
17. returnRES_OK;
18. }
19. else /*多个sector的读操作*/
20. {
21. returnRES_OK;
22. }
23. case1:
24. if(count==1) /*1个sector的读操作*/
25. {
26. returnRES_OK;
27. }
28. else /*多个sector的读操作*/
29. {
30. returnRES_OK;
31. }
32. default:
33. returnRES_ERROR;
34. }
35. }
复制代码
FATFS底层写数据函数:
1.DRESULTdisk_write(
2. BYTEdrv, /*Physicaldrivenmuber(0..)*/
3. constBYTE*buff, /*Datatobewritten*/
4. DWORDsector, /*Sectoraddress(LBA)*/
5. BYTEcount /*Numberofsectorstowrite(1..255)*/
6. )
7. {
8. if(!
count)
9. {
10. returnRES_PARERR; /*count不能等于0,否则返回参数错误*/
11. }
12. switch(drv)
13. {
14. case0:
15. if(count==1) /*1个sector的写操作*/
16. {
17. returnRES_OK;
18. }
19. else /*多个sector的写操作*/
20. {
21. returnRES_OK;
22. }
23. case1:
24. if(count==1) /*1个sector的写操作*/
25. {
26. returnRES_OK;
27. }
28. else /*多个sector的写操作*/
29. {
30. returnRES_OK;
31. }
32. default:
returnRES_ERROR;
33. }
34. }
复制代码
FATFS磁盘控制函数:
1.DRESULTdisk_ioctl(
2. BYTEdrv, /*Physicaldrivenmuber(0..)*/
3. BYTEctrl, /*Controlcode*/
4. void*buff /*Buffertosend/receivecontroldata*/
5. )
6. {
7. if(drv==0)
8. {
9. switch(ctrl)
10. {
11. caseCTRL_SYNC:
12. returnRES_OK;
13. caseGET_SECTOR_COUNT:
14. returnRES_OK;
15. caseGET_BLOCK_SIZE:
16. returnRES_OK;
17. caseCTRL_POWER:
18. break;
19. caseCTRL_LOCK:
20. break;
21. caseCTRL_EJECT:
22. break;
23. /*MMC/SDCcommand*/
24. caseMMC_GET_TYPE:
25. break;
26. caseMMC_GET_CSD:
27. break;
28. caseMMC_GET_CID:
29. break;
30. caseMMC_GET_OCR:
31. break;
32. caseMMC_GET_SDSTAT:
33. break;
34. }
35. }elseif(drv==1){
36. switch(ctrl)
37. {
38. caseCTRL_SYNC:
39. returnRES_OK;
40. caseGET_SECTOR_COUNT:
41. returnRES_OK;
42. caseGET_SECTOR_SIZE:
43. returnRES_OK;
44. caseGET_BLOCK_SIZE:
45. returnRES_OK;
46. caseCTRL_POWER:
47. break;
48. caseCTRL_LOCK:
49. break;
50. caseCTRL_EJECT:
51. break;
52. /*MMC/SDCcommand*/
53. caseMMC_GET_TYPE:
54. break;
55. caseMMC_GET_CSD:
56. break;
57. caseMMC_GET_CID:
58. break;
59. caseMMC_GET_OCR:
60. break;
61. caseMMC_GET_SDSTAT:
62. break;
63. }
64. }
65. else{
66. returnRES_PARERR;
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*/
2. for(retry=0;retry<0xFFF;retry++)
3. {
4. r1=MSD0_send_
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- STM32 移植 FATFS 文件系统 欧阳 创编