完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
一。介绍
FAT文件系统分为一级,如下图所示。 1.接口,包括存储读取/写接口(I/O)和动态文件创建我们修改时间的实时数据,需要根据平台和存储介质编写移植代码。 2.中间层FATFS模块,实现了FAT文件读/写协议.FATFS模块提供的是ff.c和ff.h.除非有必要,使用者一般不用修改,使用时将头文件直接包含进去即可。 3.最顶层是应用层,使用者无需理会FATFS的内部结构和复杂的FAT协议,只需要调用FATFS模块提供给用户的一系列应用接口函数,如f_open,f_read,f_write和f_close等,就可以像在PC上读/写文件那样简单。 二、移植 1.从官网下载合适版本的软件,本次使用FatFs R0.13b 2.把代码合并到工程中,让一个新建文件夹下。 3.我们需要为diskio。c文件下补充内容磁盘函数的操作代码 disk_status-获取设备状态 disk_initialize-初始化设备 disk_read-读取数据 disk_write-写入数据 disk_ioctl-控制设备相关功能的 get_fattime-获取当前时间 (1)本次使SPI FLASH为MX25L6406E,先添加其驱动调用的头文件。 修改以下,根据使用Flash手册修改 #define DEV_SPIFLASH 0 /* Example: Map SPI Flash to physical drive 0 */ #define FLASH_SECTOR_SIZE (4*1024) //扇区大小 #define FLASH_BLOCK_SIZE 16 //一个块有多少扇区 const unsigned short int FLASH_SECTOR_COUNT = 640; //2.5M,一个使用多少扇区用于FAT文件系统 (2)状态函数 DSTATUS disk_status ( BYTE pdrv /* Physical drive nmuber to identify the drive */ ) { DSTATUS stat; int result; switch (pdrv) { case DEV_SPIFLASH:return RES_OK; } return STA_NOINIT; } (3)初始化函数 DSTATUS disk_initialize ( BYTE pdrv /* Physical drive nmuber to identify the drive */ ) { DSTATUS stat; int result; switch (pdrv) { case DEV_SPIFLASH : MX25LXXHal_PinInit();//引脚初设化 MX25LXXHal_SpiInit();//芯片初设化 return RES_OK; } return STA_NOINIT; } (4)读函数 /*-----------------------------------------------------------------------*/ /* Read Sector(s) */ /*-----------------------------------------------------------------------*/ DRESULT disk_read ( BYTE pdrv, /* Physical drive nmuber to identify the drive */ BYTE *buff, /* Data buffer to store read data */ DWORD sector, /* Start sector in LBA */ UINT count /* Number of sectors to read */ ) { DRESULT res; int result; int i = 0; switch (pdrv) { case DEV_SPIFLASH : for(i = 0; i 《 count;i++) { MX25L1602_RD(sector*FLASH_SECTOR_SIZE,FLASH_SECTOR_SIZE,buff); sector++; buff+=FLASH_SECTOR_SIZE; } return RES_OK; } return RES_PARERR; } (5)写函数 DRESULT disk_write ( BYTE pdrv, /* Physical drive nmuber to identify the drive */ const BYTE *buff, /* Data to be written */ DWORD sector, /* Start sector in LBA */ UINT count /* Number of sectors to write */ ) { DRESULT res; int result; unsigned int s; switch (pdrv) { case DEV_SPIFLASH : for(s = sector;s 《= sector+count-1;s++) { MX25L1602_Erase(s, s); // 先檫除扇区,再写入数据 } //MX25L1602_Erase(sector, sector+count-1); for(;count》0;count--) { MX25L1602_WR(sector*FLASH_SECTOR_SIZE, (u8*)buff,FLASH_SECTOR_SIZE); sector++; buff+=FLASH_SECTOR_SIZE; } return RES_OK; } return RES_PARERR; } (6)磁盘控制功能 DRESULT disk_ioctl ( BYTE pdrv, /* Physical drive nmuber (0.。) */ BYTE cmd, /* Control code */ void *buff /* Buffer to send/receive control data */ ) { DRESULT res; int result; switch (pdrv) { case DEV_SPIFLASH : switch(cmd) { case CTRL_SYNC: res = RES_OK; break; case GET_SECTOR_SIZE: *(WORD*)buff = FLASH_SECTOR_SIZE; res = RES_OK; break; case GET_BLOCK_SIZE: *(WORD*)buff = FLASH_BLOCK_SIZE; res = RES_OK; break; case GET_SECTOR_COUNT: *(DWORD*)buff = FLASH_SECTOR_COUNT; res = RES_OK; break; default: res = RES_PARERR; break; } } return res; } 4.应用层的调用 挂载文件系统后即可调用文件操作函数,写函数最好在开辟个缓存,累计到一个扇区大小的数据再存入文件系统,这样可以做好负载均衡,避免闪光灯使用寿命缩短。 /** * 文件系统挂载函数 */ int fatfs_fileSystemReset() { FRESULT res = 0; res = 1; if(res != 0) { printf(“mount failn”); res = f_mkfs(“0:”, FM_FAT, 0, gFsWork, sizeof gFsWork);//在逻辑驱动器上创建FAT卷 if(res == 0) { printf(“mkfs susn”); res = f_mount (&sysFs,“0:”,1);//先挂载才能使用 if(res == 0) { printf(“mount susu2n”); gFsInited = 1; return 0; } else { printf(“mount fail2n”); return -1; } } else { printf(“mkfs failn”); return -1; } } else gFsInited = 1; return 0; } |
|
|
|
只有小组成员才能发言,加入小组>>
调试STM32H750的FMC总线读写PSRAM遇到的问题求解?
1771 浏览 1 评论
X-NUCLEO-IHM08M1板文档中输出电流为15Arms,15Arms是怎么得出来的呢?
1619 浏览 1 评论
1070 浏览 2 评论
STM32F030F4 HSI时钟温度测试过不去是怎么回事?
724 浏览 2 评论
ST25R3916能否对ISO15693的标签芯片进行分区域写密码?
1673 浏览 2 评论
1935浏览 9评论
STM32仿真器是选择ST-LINK还是选择J-LINK?各有什么优势啊?
728浏览 4评论
STM32F0_TIM2输出pwm2后OLED变暗或者系统重启是怎么回事?
568浏览 3评论
593浏览 3评论
stm32cubemx生成mdk-arm v4项目文件无法打开是什么原因导致的?
551浏览 3评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-12-22 15:04 , Processed in 0.844596 second(s), Total 77, Slave 60 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号