打印
[开发工具]

STM32CubeMX-22 | 在SD卡上移植FATFS文件系统

[复制链接]
楼主: manufact
手机看帖
扫描二维码
随时随地手机跟帖
21
manufact|  楼主 | 2020-4-13 16:00 | 只看该作者 |只看大图 回帖奖励 |倒序浏览
然后直接右键选择格式化:

使用特权

评论回复
22
manufact|  楼主 | 2020-4-13 16:00 | 只看该作者
如果第二种方法没用的话,可以使用第三种方法,来打开 DiskGenius 软件查看SD卡:

使用特权

评论回复
23
manufact|  楼主 | 2020-4-13 16:01 | 只看该作者
重新建立分区表并格式化:



使用特权

评论回复
24
manufact|  楼主 | 2020-4-13 16:01 | 只看该作者
之后可以看到SD卡恢复正常,可以进行FATFS实验啦:

使用特权

评论回复
25
manufact|  楼主 | 2020-4-13 16:02 | 只看该作者
使用FATFS挂载SD卡
      注意:在挂载之前必须要保证SD卡正常拥有FAT文件系统。

挂载文件系统使用f_mount API,该API将文件系统对象注册/注销到FatFs模块,API原型如下:

FRESULT f_mount (
  FATFS*       fs,    /* [IN] Filesystem object */
  const TCHAR* path,  /* [IN] Logical drive number */
  BYTE         opt    /* [IN] Initialization option */
);

使用特权

评论回复
26
manufact|  楼主 | 2020-4-13 16:02 | 只看该作者
在main.c文件中添加如下代码,先定义FATFS所使用的一些全局变量:

/* Private variables ---------------------------------------------------------*/

/* USER CODE BEGIN PV */
FATFS   fs;            /* FATFS 文件系统对象 */
FRESULT fr;         /* FATFS API 返回值 */
/* USER CODE END PV */

使用特权

评论回复
27
manufact|  楼主 | 2020-4-13 16:03 | 只看该作者
然后在 main 函数中,while(1)之前添加如下代码:

/* USER CODE BEGIN 2 */
printf("FATFS test...\r\n");
/* 挂载SD卡 */
fr = f_mount(&fs, "", 0);
if(fr == FR_OK)
{
    printf("SD card mount ok!\r\n");
}
else
{
    printf("SD card mount error, error code:%d.\r\n",fr);
}
/* USER CODE END 2 */

使用特权

评论回复
28
manufact|  楼主 | 2020-4-13 16:03 | 只看该作者
编译下载,运行结果如下:

使用特权

评论回复
29
manufact|  楼主 | 2020-4-13 16:04 | 只看该作者
创建文件并向文件中写入内容
要想操作文件,需要先创建文件对象:

/* USER CODE BEGIN PV */
FATFS   fs;            /* FATFS 文件系统对象 */
FRESULT fr;         /* FATFS API 返回值 */
FIL     fd;         /* FATFS 文件对象    */
/* USER CODE END 2 */

使用特权

评论回复
30
manufact|  楼主 | 2020-4-13 16:05 | 只看该作者
在main函数中的开始定义要写入文件的内容:

/* USER CODE BEGIN 1 */
//要操作的文件名
char filename[] = "test.txt";
//文件写入内容
uint8_t write_dat[] = "Hello,FATFS!\n";
//用于接收API返回写入成功的字节数
uint16_t write_num = 0;
/* USER CODE END 1 */

使用特权

评论回复
31
manufact|  楼主 | 2020-4-13 16:05 | 只看该作者
然后在挂载操作成功之后进行打开->写入->关闭一个完整的操作:

/* 打开文件(若文件不存在则创建) */
fr = f_open(&fd, filename, FA_CREATE_ALWAYS | FA_WRITE);
if(fr == FR_OK)
{
    printf("open file \"%s\" ok! \r\n", filename);
}
else
{
printf("open file \"%s\" error : %d\r\n", filename, fr);
}

/* 向打开的文件中写入内容 */
fr = f_write(&fd, write_dat, sizeof(write_dat), (void *)&write_num);
if(fr == FR_OK)
{
    printf("write %d dat to file \"%s\" ok,dat is \"%s\".\r\n", write_num, filename, write_dat);
}
else
{
    printf("write dat to file \"%s\" error,error code is:%d\r\n", filename, fr);
}

/* 操作完成,关闭文件 */
fr = f_close(&fd);
if(fr == FR_OK)
{
    printf("close file \"%s\" ok!\r\n", filename);
}
else
{
    printf("close file \"%s\" error, error code is:%d.\r\n", filename, fr);
}

使用特权

评论回复
32
manufact|  楼主 | 2020-4-13 16:06 | 只看该作者
实验结果如下:

使用特权

评论回复
33
manufact|  楼主 | 2020-4-13 16:06 | 只看该作者
再将SD卡插到电脑,可以看到文件及其内容:

使用特权

评论回复
34
manufact|  楼主 | 2020-4-13 16:07 | 只看该作者
读取SD卡中的文件内容
同样的,先在main函数开始开辟一块缓冲区,用于存放读取的数据:

/* USER CODE BEGIN 1 */
//要操作的文件名
char filename[] = "test.txt";
//文件写入内容
uint8_t write_dat[] = "Hello,FATFS!";
//用于接收API返回写入成功的字节数
uint16_t write_num = 0;

//用于存放从文件中读取出的内容
uint8_t read_dat[20];
//用于接收API返回成功读取的字节数
uint16_t read_num = 0;
/* USER CODE END 1 */

使用特权

评论回复
35
manufact|  楼主 | 2020-4-13 16:07 | 只看该作者
然后进行打开->读取->关闭一个完整的操作:

/* 打开文件用于读取 */
fr = f_open(&fd, filename, FA_READ);
if(fr == FR_OK)
{
    printf("open file \"%s\" ok! \r\n", filename);
}
else
{
printf("open file \"%s\" error : %d\r\n", filename, fr);
}

/* 从打开的文件中读取内容 */
fr = f_read(&fd, read_dat, sizeof(read_dat), (void *)&read_num);
if(fr == FR_OK)
{
    printf("read %d dat to file \"%s\" ok,dat is \"%s\".\r\n", read_num, filename, read_dat);
}
else
{
    printf("read dat to file \"%s\" error,error code is:%d\r\n", filename, fr);
}

/* 操作完成,关闭文件 */
fr = f_close(&fd);
if(fr == FR_OK)
{
    printf("close file \"%s\" ok!\r\n", filename);
}
else
{
    printf("close file \"%s\" error, error code is:%d.\r\n", filename, fr);
}

使用特权

评论回复
36
manufact|  楼主 | 2020-4-13 16:08 | 只看该作者
实验现象如下:

使用特权

评论回复
37
manufact|  楼主 | 2020-4-13 16:09 | 只看该作者
FATFS API 错误码的使用
不知道大家有没有注意到,在本文中所有使用FATFS API的时候,都是如下的格式:

     使用FRESULT类型的变量fr接收API返回值
     API执行之后进行判断,错误的话输出错误码

使用特权

评论回复
38
manufact|  楼主 | 2020-4-13 16:09 | 只看该作者
那么,API 所返回的错误码,有什么用呢?下面用一个实例来给大家演示一下~

假如本文中的实验现象如下:

使用特权

评论回复
39
manufact|  楼主 | 2020-4-13 16:10 | 只看该作者
可以看到,FATFS创建文件时,返回的错误码是13,那么如何定位该问题呢?13代表什么?

打开FATFS的ff.h文件即可看到所有错误码所表示的含义:

使用特权

评论回复
40
manufact|  楼主 | 2020-4-13 16:10 | 只看该作者
这样问题就定位到了,我们使用的SD卡是之前用于裸机实验的卡,SD卡分区被破坏,SD卡文件系统被破坏,所以FATFS创建文件时才会提示FR_NO_FILESYSTEM问题。

至此,我们已经学会如何在SD卡上移植​FATFS文件系统。

使用特权

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

本版积分规则