没有合适的资源?快使用搜索试试~ 我知道了~
STM32例程之FATFS文件系统SPI方式移植笔记源码下载 STM32_8 纬图虚拟仪器论坛.pdf
1.该资源内容由用户上传,如若侵权请联系客服进行举报
2.虚拟产品一经售出概不退款(资源遇到问题,请及时私信上传者)
2.虚拟产品一经售出概不退款(资源遇到问题,请及时私信上传者)
版权申诉
0 下载量 148 浏览量
2023-06-06
21:03:58
上传
评论
收藏 3MB PDF 举报
温馨提示
试读
24页
STM32例程之FATFS文件系统SPI方式移植笔记源码下载 STM32_8 纬图虚拟仪器论坛
资源推荐
资源详情
资源评论
1/24
viewtool.com/bbs/forum.php?mod=viewthread&tid=93&page=1
切换到宽版
用户名
密码
自动登录 找回密码
登录
立即注册
快捷导航
快捷导航
论坛首页
热搜: stm32 fatfs stm32例程
纬
图
虚
拟
仪
器
»
论坛首页
›
单片机
›
STM32/8
›
STM32例程之FATFS文件系统(SPI方式)移植笔记(源码下载 ...
1
2
1
/ 2 页
下一页
返回列表
金币
775
发消息
电梯直达楼主
请输入搜索内容
帖子
搜索
查看: 3357 | 回复: 46
[原创] STM32例程之FATFS文件系统(SPI方式)移植笔记(源码下载) [复制链接]
wdluo
263
主题
9
好友
807
积分
超级版主
发表于 2012-8-1 14:38:22 | 只看该作者 | 倒序浏览
本帖最后由 wdluo 于 2012-8-6 15:52 编辑
STM32的FATFS文件系统移植笔记
一、序言
经常在网上、群里看到很多人问关于STM32的FATFS文件系统移植的问题,刚好自己最近也在调试这个程序,为了让大家
少走弯路,我把我的调试过程和方法也贡献给大家。
二、FATFS简介
FatFs Module是一种完全免费开源的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()
打印输出工程:http://www.viewtool.com/bbs/foru ... 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文件中实现五个函数:
01. DSTATUS disk_initialize (BYTE);//SD卡的初始化
02. DSTATUS disk_status (BYTE);//获取SD卡的状态,这里可以不用管
03. DRESULT disk_read (BYTE, BYTE*, DWORD, BYTE);//从SD卡读取数据
04. DRESULT disk_write (BYTE, const BYTE*, DWORD, BYTE);//将数据写入SD卡,若该文件系统为只读文件系统则
不用实现该函数
05. DRESULT disk_ioctl (BYTE, BYTE, void*);//获取SD卡文件系统相关信息
06.
复制代码
2/24
viewtool.com/bbs/forum.php?mod=viewthread&tid=93&page=1
图1
3、初步实现以上五个函数
FATFS初始化函数:
01. DSTATUS disk_initialize (
02. BYTE drv /* Physical drive nmuber (0..) */
03. )
04. {
05. switch (drv)
06. {
07. case 0 :
08. return RES_OK;
09. case 1 :
10. return RES_OK;
11. case 2 :
12. return RES_OK;
13. case 3 :
14. return RES_OK;
15. default:
16. return STA_NOINIT;
17. }
18. }
复制代码
FATFS状态获取函数:
01. DSTATUS disk_status (
02. BYTE drv /* Physical drive nmuber (0..) */
03. )
04. {
05. switch (drv)
06. {
07. case 0 :
08. return RES_OK;
09. case 1 :
10. return RES_OK;
11. case 2 :
12. return RES_OK;
13. default:
14. return STA_NOINIT;
15. }
16. }
复制代码
FATFS底层读数据函数:
01. DRESULT disk_read (
02. BYTE drv, /* Physical drive nmuber (0..) */
03. BYTE *buff, /* Data buffer to store read data */
04. DWORD sector, /* Sector address (LBA) */
05. BYTE count /* Number of sectors to read (1..255) */
06. )
07. {
08. if( !count )
09. {
10. return RES_PARERR; /* count不能等于0,否则返回参数错误 */
11. }
12. switch (drv)
13. {
14. case 0:
15. if(count==1) /* 1个sector的读操作 */
16. {
17. return RES_OK;
18. }
3/24
viewtool.com/bbs/forum.php?mod=viewthread&tid=93&page=1
18. }
19. else /* 多个sector的读操作 */
20. {
21. return RES_OK;
22. }
23. case 1:
24. if(count==1) /* 1个sector的读操作 */
25. {
26. return RES_OK;
27. }
28. else /* 多个sector的读操作 */
29. {
30. return RES_OK;
31. }
32.
33. default:
34. return RES_ERROR;
35. }
36. }
复制代码
FATFS底层写数据函数:
01. DRESULT disk_write (
02. BYTE drv, /* Physical drive nmuber (0..) */
03. const BYTE *buff, /* Data to be written */
04. DWORD sector, /* Sector address (LBA) */
05. BYTE count /* Number of sectors to write (1..255) */
06. )
07. {
08. if( !count )
09. {
10. return RES_PARERR; /* count不能等于0,否则返回参数错误 */
11. }
12. switch (drv)
13. {
14. case 0:
15. if(count==1) /* 1个sector的写操作 */
16. {
17. return RES_OK;
18. }
19. else /* 多个sector的写操作 */
20. {
21. return RES_OK;
22. }
23. case 1:
24. if(count==1) /* 1个sector的写操作 */
25. {
26. return RES_OK;
27. }
28. else /* 多个sector的写操作 */
29. {
30. return RES_OK;
31. }
32.
33. default:return RES_ERROR;
34. }
35. }
复制代码
FATFS磁盘控制函数:
01. DRESULT disk_ioctl (
02. BYTE drv, /* Physical drive nmuber (0..) */
03. BYTE ctrl, /* Control code */
04. void *buff /* Buffer to send/receive control data */
05. )
06. {
4/24
viewtool.com/bbs/forum.php?mod=viewthread&tid=93&page=1
06. {
07. if (drv==0)
08. {
09. switch (ctrl)
10. {
11. case CTRL_SYNC :
12. return RES_OK;
13. case GET_SECTOR_COUNT :
14. return RES_OK;
15. case GET_BLOCK_SIZE :
16. return RES_OK;
17. case CTRL_POWER :
18. break;
19. case CTRL_LOCK :
20. break;
21. case CTRL_EJECT :
22. break;
23. /* MMC/SDC command */
24. case MMC_GET_TYPE :
25. break;
26. case MMC_GET_CSD :
27. break;
28. case MMC_GET_CID :
29. break;
30. case MMC_GET_OCR :
31. break;
32. case MMC_GET_SDSTAT :
33. break;
34. }
35. }else if(drv==1){
36. switch (ctrl)
37. {
38. case CTRL_SYNC :
39. return RES_OK;
40. case GET_SECTOR_COUNT :
41. return RES_OK;
42. case GET_SECTOR_SIZE :
43. return RES_OK;
44. case GET_BLOCK_SIZE :
45. return RES_OK;
46. case CTRL_POWER :
47. break;
48. case CTRL_LOCK :
49. break;
50. case CTRL_EJECT :
51. break;
52. /* MMC/SDC command */
53. case MMC_GET_TYPE :
54. break;
55. case MMC_GET_CSD :
56. break;
57. case MMC_GET_CID :
58. break;
59. case MMC_GET_OCR :
60. break;
61. case MMC_GET_SDSTAT :
62. break;
63. }
64. }
65. else{
66. return RES_PARERR;
67. }
68. return RES_PARERR;
69. }
复制代码
以上函数都只是实现一个框架,并没有做实际的事情,下一步就需要把操作SD卡的程序填充在这个框架里面。
4、实现disk_initialize()函数
5/24
viewtool.com/bbs/forum.php?mod=viewthread&tid=93&page=1
4、实现disk_initialize()函数
该函数在挂载文件系统的时候会被调用,主要是实现读写SD卡前对SD卡进行初始化,根据SD卡的传输协议,我们按
照如下步骤初始化SD卡:
a、判断SD卡是否插入,可以通过检查SD卡卡座的CD脚电平进行判断,一般插入卡后该引脚会变成低电平。
b、稍微延时一段时间后发送至少74个时钟给SD卡。
c、发送CMD0命令给SD卡,直到SD卡返回0x01为止,这里可以循环多次发送。
程序如下:
01. /* Start send CMD0 till return 0x01 means in IDLE state */
02. for(retry=0; retry<0xFFF; retry++)
03. {
04. r1 = MSD0_send_command(CMD0, 0, 0x95);
05. if(r1 == 0x01)
06. {
07. retry = 0;
08. break;
09. }
10. }
复制代码
d、发送CMD8获取卡的类型,不同类型的卡其初始化方式有所不同。
e、根据卡的类型对卡进行初始化。具体初始化方式可以参考附件程序。
注:在初始化SD卡之前应该初始化SPI接口和相关的管脚。
实现后的程序如下:
01. DSTATUS disk_initialize (
02. BYTE drv /* Physical drive nmuber (0..) */
03. )
04. {
05. int Status;
06. switch (drv)
07. {
08. case 0 :
09. Status = MSD0_Init();
10. if(Status==0){
11. return RES_OK;
12. }else{
13. return STA_NOINIT;
14. }
15. case 1 :
16. return RES_OK;
17. case 2 :
18. return RES_OK;
19. case 3 :
20. return RES_OK;
21. default:
22. return STA_NOINIT;
23. }
24. }
复制代码
MSD0_Init()函数在SPI_MSD0_Driver.c文件中实现。
5、实现disk_read()函数
该函数是读取SD卡扇区数据的函数,根据SD卡数据传输协议可知有读取单扇区和读取多扇区两种操作模式,为提高读
文件的速度应该实现读取多扇区函数。
实现后的程序如下:
01. DRESULT disk_read (
02. BYTE drv, /* Physical drive nmuber (0..) */
03. BYTE *buff, /* Data buffer to store read data */
04. DWORD sector, /* Sector address (LBA) */
05. BYTE count /* Number of sectors to read (1..255) */
06. )
07. {
08. int Status;
09. if( !count )
10. {
11. return RES_PARERR; /* count不能等于0,否则返回参数错误 */
剩余23页未读,继续阅读
资源评论
oligaga
- 粉丝: 50
- 资源: 2万+
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
- 基于matlab实现对表面肌电信号进行归一化处理,并对归一化后的图形显示 .rar
- 基于matlab实现单级倒立摆的 T-S 模型 包括 LMI 程序源码
- 图书管理系统(struts+hibernate+spring+ext).rar
- 基于matlab实现此压缩包包含语音信号处理中的语音变声代码加音频.rar
- STM32使用PWM驱动舵机并通过OLED显示
- 基于matlab实现车辆路径规划;遗传算法;matlab代码.rar
- 图书管理系统(struts+hibernate+spring)130225.rar
- 基于matlab实现采用标量衍射理论,实现菲涅尔衍射和夫琅禾费衍射,对光波的波前传播和数字全息的应用有帮助.rar
- JavaScript版去除链表重复元素
- 微信小程序项目-功德木鱼(带设置面板-自定义文字、可选字体颜色、可选木鱼样式)
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功