硬汉嵌入式论坛

 找回密码
 立即注册
查看: 2528|回复: 6
收起左侧

[SD/SDIO] 【实测】使用STM32H7板子FatFS文件系统每秒读写2MB文件,实时写入7450个文件不出错,写满16GB SD卡

[复制链接]

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
117512
QQ
发表于 2024-11-6 09:32:18 | 显示全部楼层 |阅读模式
【测试平台】

STM32-V7开发板

【测试例子】

https://forum.anfulai.cn/forum.php?mod=viewthread&tid=86980

V7-025_FatFS文件系统例子(SD卡 V1.2)

【测试条件和校验】

运行例子里面的命令6,命令6是个测速函数,每次写入2MB文件,同时读取出来校验,保证写入的没问题。

[C] 纯文本查看 复制代码
/*
*********************************************************************************************************
*        函 数 名: WriteFileTest
*        功能说明: 测试文件读写速度
*        形    参:无
*        返 回 值: 无
*********************************************************************************************************
*/
static void WriteFileTest(void)
{
        FRESULT result;
        char path[64]; 
        uint32_t bw;
        uint32_t i,k;
        uint32_t runtime1,runtime2,timelen;
        uint8_t err = 0;
        static uint32_t s_ucTestSn = 0;

        
        for (i = 0; i < sizeof(g_TestBuf); i++)
        {
                g_TestBuf[i] = (i / 512) + '0';
        }

          /* 挂载文件系统 */
        result = f_mount(&fs, DiskPath, 0);                        /* Mount a logical drive */
        if (result != FR_OK)
        {
                printf("挂载文件系统失败 (%s)\r\n", FR_Table[result]);
        }

        /* 打开文件 */
        sprintf(path, "%sS%05d.txt", DiskPath, s_ucTestSn++); /* 每写1次,序号递增 */        
        result = f_open(&file, path, FA_CREATE_ALWAYS | FA_WRITE);

        /* 写一串数据 */
        printf("开始写文件%s %dKB ...\r\n", path, TEST_FILE_LEN / 1024);
        
        runtime1 = bsp_GetRunTime();        /* 读取系统运行时间 */
        for (i = 0; i < TEST_FILE_LEN / BUF_SIZE; i++)
        {
                result = f_write(&file, g_TestBuf, sizeof(g_TestBuf), &bw);
                if (result == FR_OK)
                {
                        if (((i + 1) % 8) == 0)
                        {
                                printf(".");
                        }
                }
                else
                {
                        err = 1;
                        printf("%s文件写失败\r\n", path);
                        break;
                }
        }
        runtime2 = bsp_GetRunTime();        /* 读取系统运行时间 */
        
        if (err == 0)
        {
                timelen = (runtime2 - runtime1);
                printf("\r\n  写耗时 : %dms   平均写速度 : %dB/S (%dKB/S)\r\n",
                        timelen,
                        (TEST_FILE_LEN * 1000) / timelen,
                        ((TEST_FILE_LEN / 1024) * 1000) / timelen);
        }

        f_close(&file);                /* 关闭文件*/


        /* 开始读文件测试 */
        result = f_open(&file, path, FA_OPEN_EXISTING | FA_READ);
        if (result !=  FR_OK)
        {
                printf("没有找到文件: %s\r\n", path);
                return;
        }

        printf("开始读文件 %dKB ...\r\n", TEST_FILE_LEN / 1024);
        
        runtime1 = bsp_GetRunTime();        /* 读取系统运行时间 */
        for (i = 0; i < TEST_FILE_LEN / BUF_SIZE; i++)
        {
                result = f_read(&file, g_TestBuf, sizeof(g_TestBuf), &bw);
                if (result == FR_OK)
                {
                        if (((i + 1) % 8) == 0)
                        {
                                printf(".");
                        }

                        /* 比较写入的数据是否正确,此语句会导致读卡速度结果降低到 3.5MBytes/S */
                        for (k = 0; k < sizeof(g_TestBuf); k++)
                        {
                                if (g_TestBuf[k] != (k / 512) + '0')
                                {
                                          err = 1;
                                        printf("Speed1.txt 文件读成功,但是数据出错\r\n");
                                        break;
                                }
                        }
                        if (err == 1)
                        {
                                break;
                        }
                }
                else
                {
                        err = 1;
                        printf("Speed1.txt 文件读失败\r\n");
                        break;
                }
        }

        runtime2 = bsp_GetRunTime();        /* 读取系统运行时间 */
        
        if (err == 0)
        {
                timelen = (runtime2 - runtime1);
                printf("\r\n  读耗时 : %dms   平均读速度 : %dB/S (%dKB/S)\r\n", timelen,
                        (TEST_FILE_LEN * 1000) / timelen, ((TEST_FILE_LEN / 1024) * 1000) / timelen);
        }

        /* 关闭文件*/
        f_close(&file);

        /* 卸载文件系统 */
        f_mount(NULL, DiskPath, 0);
}


12345.png

【实测】

1500个文件时:

1.png

5100个文件时:

2.png

写满SD卡,特别注意,但SD卡还剩下一点空间的时候,比如200M时,建议停止再写入,防止写爆后损坏SD卡

3.png

回复

使用道具 举报

9

主题

81

回帖

108

积分

初级会员

积分
108
发表于 2024-11-6 13:13:16 | 显示全部楼层
感谢硬汉哥,正好要学习这里
回复

使用道具 举报

7

主题

53

回帖

74

积分

初级会员

积分
74
发表于 2024-12-12 09:16:02 | 显示全部楼层
支持多文件同时写吗,如果要进行多文件写是否要进行特殊设置
回复

使用道具 举报

0

主题

2

回帖

2

积分

新手上路

积分
2
发表于 2024-12-27 16:36:13 | 显示全部楼层
有测试过FATFS最快的写入速度吗
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
117512
QQ
 楼主| 发表于 2024-12-28 07:38:52 | 显示全部楼层
tang_sl 发表于 2024-12-27 16:36
有测试过FATFS最快的写入速度吗

10-15MB/S Class10

程序里面展示这个,基本全程10MB/S

23.png


回复

使用道具 举报

1

主题

12

回帖

15

积分

新手上路

积分
15
发表于 2025-2-14 09:21:15 | 显示全部楼层
eric2013 发表于 2024-12-28 07:38
10-15MB/S Class10

程序里面展示这个,基本全程10MB/S

你是怎么配置文件系统簇的大小的, SDIO的CLK时钟频率是多少。 我用的是STM32F205。在SDIO的CLK引脚是24MHz,文件系统簇是16K的情况下,最高的写入速度为7.4Mbyte/s 所有。能高速我你是怎么调试的那么高吗。 我也就读取速度能最高到10MByte/s。
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
117512
QQ
 楼主| 发表于 2025-2-14 10:45:13 | 显示全部楼层
cuijunling00 发表于 2025-2-14 09:21
你是怎么配置文件系统簇的大小的, SDIO的CLK时钟频率是多少。 我用的是STM32F205。在SDIO的CLK引脚是24M ...

我这个是50MHz时钟

234.png
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2025-8-12 06:14 , Processed in 0.049781 second(s), 27 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

快速回复 返回顶部 返回列表