打印
[STM32F1]

STM32基础篇——FAT 文件系统实验

[复制链接]
楼主: aizaixiyuanqian
手机看帖
扫描二维码
随时随地手机跟帖
21
aizaixiyuanqian|  楼主 | 2018-3-31 21:43 | 只看该作者 |只看大图 回帖奖励 |倒序浏览
(4)disk_write()函数

使用特权

评论回复
22
aizaixiyuanqian|  楼主 | 2018-3-31 21:44 | 只看该作者
本帖最后由 aizaixiyuanqian 于 2018-3-31 21:47 编辑

移植代码如下:
/*-----------------------------------------------------------------------*/
/* Write Sector(s) */
/*-----------------------------------------------------------------------*/
#if _USE_WRITE
DRESULT disk_write (
BYTE pdrv, /* Physical drive nmuber (0..) */
const BYTE *buff,  /* Data to be written */
DWORD sector, /* Sector address (LBA) */
BYTE count /* Number of sectors to write (1..128) */
)
{
DRESULT res = RES_ERROR;
int result;
switch (pdrv) {
case SD_CARD :
result = SD_WriteDisk((uint8_t*)buff, sector, count);
if(result == 0)
{
res = RES_OK;
}
break;

case USB :
break;
default:
break;
}
return res;
}
#endif

使用特权

评论回复
23
aizaixiyuanqian|  楼主 | 2018-3-31 21:51 | 只看该作者
5) disk_ioctl()函数

使用特权

评论回复
24
aizaixiyuanqian|  楼主 | 2018-3-31 21:51 | 只看该作者
本帖最后由 aizaixiyuanqian 于 2018-3-31 23:12 编辑

移植代码如下:
/*-----------------------------------------------------------------------*/
/* Miscellaneous Functions 其他表参数的获取 */
/*-----------------------------------------------------------------------*/
#if _USE_IOCTL
DRESULT disk_ioctl (
BYTE pdrv, /* Physical drive nmuber (0..) */
BYTE cmd, /* Control code */
void *buff  /* Buffer to send/receive control data */
)
{
DRESULT res = RES_PARERR;
switch (pdrv) {
case SD_CARD :
switch(cmd)
{
case CTRL_SYNC: //刷新磁盘
res = RES_OK;
break;
case GET_SECTOR_SIZE: //得到媒体大小
*(WORD*)buff = 512;
res = RES_OK;
break;
case GET_BLOCK_SIZE: //块大小
*(WORD*)buff = 8;
res = RES_OK;
break;
case GET_SECTOR_COUNT:
if(SD_ReadCapacity((uint32_t *)buff) == 0)
{
res = RES_OK;
}
break;
default:
break;
}
break;
case USB :
res = RES_PARERR;
break;
}
return res;
}
#endif
红色部分就是移植部分。

使用特权

评论回复
25
aizaixiyuanqian|  楼主 | 2018-3-31 23:13 | 只看该作者
6) get_fattime()函数

使用特权

评论回复
26
aizaixiyuanqian|  楼主 | 2018-3-31 23:14 | 只看该作者
这个函数没有直接给在 diskio.c 里面,需要你自己写。代码如下:
DWORD get_fattime(void)
{
return 0;
}
因为我们例程里面没有使用时间,所以,直接返回零就好。

使用特权

评论回复
27
aizaixiyuanqian|  楼主 | 2018-3-31 23:15 | 只看该作者
好了,到这里我们整个移植过程也就完成了,只要我们添加到工程里面如下:


使用特权

评论回复
28
aizaixiyuanqian|  楼主 | 2018-3-31 23:15 | 只看该作者
FATFS  函数说明
FATFS 有许多函数可以提供给我们使用,主要函数如下:
1) f_mount - Register/Unregister a work area
2) f_open - Open/Create a file
3) f_close - Close a file
4) f_read - Read file
5) f_write - Write file
6) f_lseek - Move read/write pointer, Expand file size
7) f_truncate - Truncate file size
8) f_sync - Flush cached data
9) f_opendir - Open a directory
10) f_readdir - Read a directory item
11) f_getfree - Get free clusters
12) f_stat - Get file status
13) f_mkdir - Create a directory
14) f_unlink - Remove a file or directory
15) f_chmod - Change attribute
16) f_utime - Change timestamp
17) f_rename - Rename/Move a file or directory
18) f_chdir - Change current directory
19) f_chdrive - Change current drive
20) f_getcwd - Retrieve the current directory
21) f_getlabel - Get volume label
22) f_setlabel - Set volume label
23) f_forward - Forward file data to the stream directly
24) f_mkfs - Create a file system on the drive
25) f_fdisk - Divide a physical drive
26) f_gets - Read a string
27) f_putc - Write a character
28) f_puts - Write a string
29) f_printf - Write a formatted string
30) f_tell - Get the current read/write pointer
31) f_eof - Test for end-of-file on a file
32) f_size - Get size of a file
33) f_error - Test for an error on a file

使用特权

评论回复
29
aizaixiyuanqian|  楼主 | 2018-3-31 23:16 | 只看该作者
1. f_mount()函数
这个函数用来注册/注销文件系统对象(工作区域)的函数,在使用 FATFS 之
前,要先调用这个函数来注册文件系统,又称挂载系统。
它有两个输入参数:
1) 逻辑驱动器的标号。我们在 diskio.c 中有这么一个定义:
#define SD_CARD 0
那么我们的 SD 卡的逻辑驱动器标号就是“0”,当我们要挂载 SD 卡的时
候,这个参数就要设置为:0。
2) 指向文件系统对象的指针
这个是用来存放系统信息的变量,它的文件类型是结构体 FATFS,所以我们
只要定义 FATFS 类型的参数,传递给它就可以了。而如果是注销掉文件系统,
那么传递给它一个 NULL 指针就可以了。

使用特权

评论回复
30
aizaixiyuanqian|  楼主 | 2018-3-31 23:16 | 只看该作者
2. f_getfree()函数
这个函数就是我们用来读取内存空间要调用的函数,在使用说明里面,
它也给出如何使用这个函数的例程,首先我们来看一下:
在这个例程中,我们可以看出,使用 f_getfree()来读取容量的步骤为:
1) 挂载文件系统。
例程上面没有写出要挂载文件系统,不过一般在进行 FATFS 的函数
操作之前都要调用 f_mount()函数挂载文件系统。
2) 调用 f_getfree()读取相应的参数。
3) 从文件系统参数中读取总的内存和空闲的内存。

使用特权

评论回复
31
aizaixiyuanqian|  楼主 | 2018-3-31 23:16 | 只看该作者
我们例程中调用的读取内存容量的函数如下:
uint8_t FATFS_GetFree(uint8_t *drv, uint32_t *total, uint32_t *free)
{
FATFS *fs1;
u8 res;
DWORD fre_clust=0, fre_sect=0, tot_sect=0;
/* 得到磁盘信息及空闲簇数量 */
res = f_getfree((const TCHAR*)drv, &fre_clust, &fs1);
if(res == 0) //表示读取成功
{
tot_sect = (fs1->n_fatent-2) * fs1->csize; //得到总扇区数
fre_sect = fre_clust * fs1->csize; //得到空闲扇区数
#if _MAX_SS!=512 //扇区大小不是 512 字节,则转换为 512 字节
tot_sect *= fs1->ssize/512;
fre_sect *= fs1->ssize/512;
#endif
*total = tot_sect >> 1;  //单位为 KB
*free = fre_sect >> 1; //单位为 KB
}
return res;
}

使用特权

评论回复
32
aizaixiyuanqian|  楼主 | 2018-3-31 23:17 | 只看该作者
FATFS  主函数
int main(void)
{
uint8_t showData[5] = {0, 0, 0, 0, 0}, ledState;
FATFS fs0, fs1;
uint32_t free, total, i = 0;
TFT_Init();
FLASH_Init();
GUI_DisplayInit();
USART1_Config(9600);
LED_Config();
while(SD_Init())
{
GUI_Show12Char(0, 126, "SD 卡初始化错误", RED, BLACK);
}
f_mount(0,&fs0); //挂载 SD 卡
f_mount(1,&fs1); //挂载 FLASH 卡
/* 读取 SD 卡 FAT 的容量和空余 */
if(FATFS_GetFree("0:", &total, &free))
{
printf(" SD 卡 FAT 错误!");
GUI_Show12Char(0, 147, "SD 卡 FAT 错误!", RED, BLACK);
}
else
{
/* 显示 FAT 容量 */
total >>= 10; //从 KB 转成 MB
free >>= 10;
printf(" sd card total memory:%d MB\n", total);
printf(" sd card free memory:%d MB\n", free);
showData[0] = (total % 10000 /1000) + '0';
showData[1] = (total % 1000 /100) + '0';
showData[2] = (total % 100 /10) + '0';
showData[3] = (total % 10) + '0';
GUI_Show12Char(0, 126, "sd card total memory is: MB", RED,
BLACK);
GUI_Show12Char(192, 126, showData, RED, BLACK);
showData[0] = (total % 10000 /1000) + '0';
showData[1] = (total % 1000 /100) + '0';
showData[2] = (total % 100 /10) + '0';
showData[3] = (total % 10) + '0';
GUI_Show12Char(0, 147, "sd card free memory is: MB", RED,
BLACK);
GUI_Show12Char(184, 147, showData, RED, BLACK);
}
/* 读取 FLASH 卡 FAT 的容量和空余 */
while(FATFS_GetFree("1:", &total, &free))
{
f_mkfs(1, 1, 4096); //如果读取失败,格式化 FLASH
i++;
if(i > 10)
{
break;
}
}
/* 显示 FAT 容量 */
if(i > 10)
{
printf(" FLASH FAT 错误!");
GUI_Show12Char(0, 84, "FLASH FAT error!", RED, BLACK);
}
else
{
printf(" FLASH total memory:%d KB\n", total);
printf(" FLASH free memory:%d KB\n", free);
showData[0] = (total % 10000 /1000) + '0';
showData[1] = (total % 1000 /100) + '0';
showData[2] = (total % 100 /10) + '0';
showData[3] = (total % 10) + '0';
GUI_Show12Char(0, 84, "FLASH total memory is: KB", RED,
BLACK);
GUI_Show12Char(176, 84, showData, RED, BLACK);
showData[0] = (total % 10000 /1000) + '0';
showData[1] = (total % 1000 /100) + '0';
showData[2] = (total % 100 /10) + '0';
showData[3] = (total % 10) + '0';
GUI_Show12Char(0, 105, "FLASH free memory is: KB", RED,
BLACK);
GUI_Show12Char(168, 105, showData, RED, BLACK);
}
while(1)
{
/* LED 灯闪烁 */
i++;
if(i>0xFFFFF)
{
i = 0;
if(ledState == 0xFE)
{
ledState = 0xFF;
}
else
{
ledState = 0xFE;
}
LED_SetState(ledState);
}
}
}

使用特权

评论回复
33
aizaixiyuanqian|  楼主 | 2018-3-31 23:17 | 只看该作者
本期的就到这里,感谢大家。

使用特权

评论回复
34
aizaixiyuanqian|  楼主 | 2018-3-31 23:18 | 只看该作者
月末最后一贴,下月继续努力。

使用特权

评论回复
35
czdpj| | 2020-1-27 09:58 | 只看该作者
FAT究竟是个什么东东?

使用特权

评论回复
36
51xlf| | 2020-1-30 15:09 | 只看该作者
如何实现fatfs在stm32的读写

使用特权

评论回复
37
i1mcu| | 2020-1-30 15:09 | 只看该作者
stm32移植fatfs,建立文件成功为什么在电脑上看不到

使用特权

评论回复
38
pmp| | 2020-1-30 15:09 | 只看该作者
stm32f4 文件系统fatfs怎么写

使用特权

评论回复
39
mmbs| | 2020-1-30 15:10 | 只看该作者
在STM32平台下FATFS时如何映射

使用特权

评论回复
40
1988020566| | 2020-1-30 15:10 | 只看该作者
stm32 ucos sdio fatfs 读取文件名卡死

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则