OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 24640|回复: 31

[F1开发板通用] 战舰STM32F103开发板 SDIO写入速度测试(使用FATFS)

[复制链接]

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165352
金钱
165352
注册时间
2010-12-1
在线时间
2108 小时
发表于 2017-2-14 11:14:16 | 显示全部楼层 |阅读模式
有客户反馈,战舰STM32F103的SDIO写入速度很慢。最快才150多KB/S。果断是有问题才对,于是乎,写了一个测试代码,来研究下写入速度到底有多慢。
测试条件如下:
1,使用我们在售的SD卡(速度等级:Class4)
2,使用战舰STM32F103开发板
3,使用内部定时器,对固定大小的文件进行写入,然后计算速度。
4,需要在SD卡里面,新建一个TEXT文件夹。

测试核心代码如下:
[mw_shl_code=c,true]
#define FATFS_WR_SIZE     1024
#define FATFS_WR_CYCLE   8192

extern u32 wrtime; //1s计时单位
int main(void)
{               
        FIL* f_txt;        
        u8 key,res;
        u16 i;
        u8 *p;
         u8 *pname;                                        //带路径的文件名
        u8 *wbuffer;                                //写入缓冲
        u16 wt;
        
        Stm32_Clock_Init(9);                //系统时钟设置
        uart_init(72,115200);                //串口初始化为115200
        delay_init(72);                                    //延时初始化  
         usmart_dev.init(72);                //初始化USMART               
        TIM6_Int_Init(10000,7199);        //10Khz计数频率,1s中断一次
         LED_Init();                                          //初始化与LED连接的硬件接口
        KEY_Init();                                        //初始化按键
        LCD_Init();                                           //初始化LCD   
        W25QXX_Init();                                //初始化W25Q128
         my_mem_init(SRAMIN);                //初始化内部内存池
        exfuns_init();                                //为fatfs相关变量申请内存  
         f_mount(fs[0],"0:",1);                 //挂载SD卡
         f_mount(fs[1],"1:",1);                 //挂载FLASH.
        font_init();
         while(SD_Init())                        //检测不到SD卡
        {
                LCD_ShowString(30,150,200,16,16,"SD Card Error!");
                delay_ms(500);                                       
                LCD_ShowString(30,150,200,16,16,"Please Check! ");
                delay_ms(500);
                LED0=!LED0;                                //DS0闪烁
        }
        p=mymalloc(SRAMIN,50);                             
        pname=mymalloc(SRAMIN,30);        //为带路径的文件名分配30个字节的内存                    
        f_txt=(FIL *)mymalloc(SRAMIN,sizeof(FIL));        //开辟FIL字节的内存区域
        wbuffer=mymalloc(SRAMIN,FATFS_WR_SIZE);                //申请写入大小
        
        for(i=0;i<FATFS_WR_SIZE;i+=8)
        {
                wbuffer='T';
                wbuffer[i+1]='e';
                wbuffer[i+2]='s';
                wbuffer[i+3]='t';
                wbuffer[i+4]='!';
                wbuffer[i+5]='!';
                wbuffer[i+6]='!';
                wbuffer[i+7]=' ';
        }
        LCD_Clear(WHITE);                           //清屏
        POINT_COLOR=RED;                        //设置字体为红色           
        Show_Str(30,50,200,16,"战舰STM32F103开发板",16,0);                                             
        Show_Str(30,70,200,16,"SDIO写入速度测试",16,0);                                             
        Show_Str(30,90,200,16,"KEY0:开始测试",16,0);        
        
        sprintf((char*)p,"文件大小:%dKB",FATFS_WR_CYCLE*FATFS_WR_SIZE/1024);
        Show_Str(30,120,200,16,p,16,0);                                      
        POINT_COLOR=BLUE;                        
        while(1)
        {
                key=KEY_Scan(0);
                if(key==KEY0_PRES)
                {
                        Show_Str(30,140,200,16,"写入耗时:           ",16,0);
                        Show_Str(30,160,200,16,"平均速度:           ",16,0);            
                        text_new_pathname(pname);                        //得到文件名        
                        TIM6->CNT=0;
                        wrtime=0;
                        wt=0;
                        res=f_open(f_txt,(const TCHAR*)pname,FA_WRITE|FA_CREATE_NEW);//模式0,或者尝试打开  
                        if(res==0)//打开成功.
                        {
                                for(i=0;i<FATFS_WR_CYCLE;i++)
                                {
                                        res=f_write(f_txt,wbuffer,FATFS_WR_SIZE,&bw);//写入BMP首部  
                                        if(res)break;
                                        if(wt!=wrtime)
                                        {
                                                wt=wrtime;
                                                LCD_ShowNum(30+80,140,wt,3,16);
                                        }
                                }
                        }
                        if(res==0)
                        {
                                wt=FATFS_WR_CYCLE*FATFS_WR_SIZE/1024/wrtime;
                                sprintf((char*)p,"平均速度:%dKB/s",wt);
                                Show_Str(30,160,200,16,p,16,0);  
                        }else printf("失败");
                        f_close(f_txt);
                }
                delay_ms(10);
        }
}[/mw_shl_code]

此代码里面,通过修改:
#define FATFS_WR_SIZE         1024
#define FATFS_WR_CYCLE       8192
这两个宏,就可以控制写入文件大小( FATFS_WR_SIZE*FATFS_WR_CYCLE)和FATFS单次写入块大小(FATFS_WR_SIZE)


我们将文件大小固定为8192KB,8M字节(FATFS_WR_SIZE*FATFS_WR_CYCLE=8M字节)。
首先,我们设定单次写入块大小为1024字节,此时测试结果如下:
1024.jpg
然后,我们设定单次写入块大小为2048字节,此时测试结果如下:
2048.jpg

然后,我们设定单次写入块大小为4096字节,此时测试结果如下:
4096.jpg

然后,我们设定单次写入块大小为8192字节,此时测试结果如下:
8192.jpg

然后,我们设定单次写入块大小为16384字节,此时测试结果如下:
16384.jpg
最后,来个猛的,我们设定单次写入块大小为32768字节(写入32M字节),此时测试结果如下:
32768.jpg



可以看出,单次写入块越大,写入速度越快。
当写入块大小,到16KB的时候,速度可以达到4MB/S,基本到极限了。最后用32KB的写入块,速度也就4.6MB/S,提升不明显。

4MB的写入速度,一般应用应该都是足够了。
所以你的写入速度慢的时候,改大一下写入块,可以获得非常明显的提升。

STM32F103 SDIO写入速度测试代码.rar (1.55 MB, 下载次数: 4138)
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

0

主题

4

帖子

0

精华

新手上路

积分
27
金钱
27
注册时间
2018-9-16
在线时间
10 小时
发表于 2018-9-17 10:33:30 | 显示全部楼层
本帖最后由 wiking7758 于 2018-9-18 17:49 编辑


32K写入,4字节对齐

32K写入,4字节对齐
图1 4字节对齐

32K写入,不对齐

32K写入,不对齐
图2 不对齐

测试了下,以32K为大小写,对齐时平均速度6.4M/S,不对齐时200多K/S。不对齐时底层是memcpy和单页写,对齐时是多页写。

[mw_shl_code=c,true]/** @brief */
#define FATFS_WR_SIZE       (32*1024)
#define FATFS_WR_CYCLE      1024

/** @brief */
FATFS fs;

/** @brief */
FIL f_txt;

//__align(4)
INT8U wbuffer[FATFS_WR_SIZE];
INT8U p[50];
extern u32 Tick;
INT8U res=0;

void SdcardTest(void)
{
    INT32U bw=0;

    INT32U time,speed;
   
    sprintf((char*)p,"文件大小:%dKB",FATFS_WR_CYCLE*FATFS_WR_SIZE/1024);
   
    LCD_ShowString(0,0,32,p);
    LCD_ShowString(0,50,32,"写入耗时:           ");
    LCD_ShowString(0,100,32,"平均速度:           ");
   
    res = f_mount(&fs,"0:",1);
    if(FR_OK == res)
    {
        res = f_open(&f_txt,"test.txt",FA_CREATE_ALWAYS|FA_WRITE);
        if(FR_OK == res)
        {
            INT16U i;
            Tick = 0;
            
            for(i=0;i<FATFS_WR_CYCLE;i++)
            {
                res=f_write(&f_txt,wbuffer,FATFS_WR_SIZE,&bw);//写入BMP首部  
                if(res)break;
            }
            time = Tick/2;
        }
        f_close(&f_txt);
    }
    if(FR_OK == res)
    {
        sprintf((char*)p,"写入耗时:%dms",time);
        LCD_ShowString(0,50,32,p);
        
        speed = FATFS_WR_CYCLE*FATFS_WR_SIZE/time;
        sprintf((char*)p,"平均速度:%dKB/s",speed);
        LCD_ShowString(0,100,32,p);
        
        LCD_ShowString(0,150,32,"测试完毕");
    }
    else
    {
        LCD_ShowString(0,150,32,"写入失败");
    }
    while(1);
}
[/mw_shl_code]
SDIO时钟
对齐
块大小
速度(kb/s)
前插4Byte
18Mhz
512
236
218
18Mhz
1K
261
228
18Mhz
2K
670
332
18Mhz
4K
1459
763
18Mhz
8K
3017
1639
18Mhz
16K
4326
2834
18Mhz
32K
6019
3117

SDIO时钟
对齐
块大小
速度(kb/s)
24Mhz
512
263
24Mhz
1K
257
24Mhz
2K
678
24Mhz
4K
1489
24Mhz
8K
3147
24Mhz
16K
4947
24Mhz
32K
6651

SDIO时钟
对齐
块大小
速度(kb/s)
18Mhz
512
236
18Mhz
1K
243
18Mhz
2K
260
18Mhz
4K
260
18Mhz
8K
260
18Mhz
16K
260
18Mhz
32K
260

结论:
1、写入文件一定要4byte对齐
2、前插4byte速度降一半
3、18M和24M差别不大

回复 支持 1 反对 0

使用道具 举报

11

主题

1041

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
3696
金钱
3696
注册时间
2011-5-23
在线时间
2008 小时
发表于 2017-2-14 12:04:01 | 显示全部楼层
本帖最后由 aozima 于 2017-2-14 12:06 编辑

碎片化的文件写入,除了大块外,做一下对齐也会好很多,比如当前文件大小为511字节,写1字节或513字节,就能对齐。
考虑到现在的大容量NAND,对齐到4K去可能会更好。

考虑到性能和写入的及时性,可以使用队列,在写入中对队列做拼接和对齐。
这样写入的实时性和总的写入速度都能得到保障。
在硬件设计能保证性能的情况下,轻松上C10的卡
RT-Thread RTOS 音频,WIFI,蓝牙
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165352
金钱
165352
注册时间
2010-12-1
在线时间
2108 小时
 楼主| 发表于 2017-2-14 16:29:40 | 显示全部楼层
aozima 发表于 2017-2-14 12:04
碎片化的文件写入,除了大块外,做一下对齐也会好很多,比如当前文件大小为511字节,写1字节或513字节,就 ...

你们要多快的速度啊?
另外,airplay,搞定没有?什么时候搞个样品给我试试。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

10

主题

146

帖子

0

精华

高级会员

Rank: 4

积分
764
金钱
764
注册时间
2015-12-19
在线时间
99 小时
发表于 2017-2-22 14:27:06 | 显示全部楼层
正点原子 发表于 2017-2-14 16:29
你们要多快的速度啊?
另外,airplay,搞定没有?什么时候搞个样品给我试试。

老大  如果测试csv格式的表格文件  速度是否一样?
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165352
金钱
165352
注册时间
2010-12-1
在线时间
2108 小时
 楼主| 发表于 2017-2-27 21:02:26 | 显示全部楼层
njjh1718 发表于 2017-2-22 14:27
老大  如果测试csv格式的表格文件  速度是否一样?

只要你数据准备的快,写入就快,不管你什么格式的。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

4

主题

17

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
475
金钱
475
注册时间
2016-11-21
在线时间
148 小时
发表于 2017-3-30 10:52:28 | 显示全部楼层
这个要顶一下!

回复 支持 反对

使用道具 举报

4

主题

17

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
475
金钱
475
注册时间
2016-11-21
在线时间
148 小时
发表于 2017-3-30 10:53:47 | 显示全部楼层
不知道有没有库函数版本,速度能达到多少?
回复 支持 反对

使用道具 举报

27

主题

112

帖子

0

精华

初级会员

Rank: 2

积分
163
金钱
163
注册时间
2016-11-10
在线时间
66 小时
发表于 2017-4-10 18:44:02 | 显示全部楼层
原子哥,SD卡的读取速度和写入速度是不是应该是一样的呢??
回复 支持 反对

使用道具 举报

15

主题

49

帖子

0

精华

初级会员

Rank: 2

积分
94
金钱
94
注册时间
2014-10-22
在线时间
24 小时
发表于 2017-9-12 11:16:14 | 显示全部楼层
jizhendong1994 发表于 2017-4-10 18:44
原子哥,SD卡的读取速度和写入速度是不是应该是一样的呢??

肯定不一样的,读的速度一定比写的速度快啊,写的时候需要擦写SD卡块
回复 支持 反对

使用道具 举报

0

主题

26

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
403
金钱
403
注册时间
2017-11-24
在线时间
56 小时
发表于 2017-12-23 10:11:05 | 显示全部楼层
读的速度有多少呢?
回复 支持 反对

使用道具 举报

0

主题

5

帖子

0

精华

新手上路

积分
46
金钱
46
注册时间
2018-3-2
在线时间
7 小时
发表于 2018-3-2 10:11:43 | 显示全部楼层
本帖最后由 lhb292 于 2018-3-2 10:50 编辑

使用原子的STM32F407开发板测试SDIO FATFS读写速度:
卡容量7624 MB
总容量7588 MB
已使用22 MB
空闲中7565 MB
fmdelta=6863us
f_read_res=0
读到文件缓存=2048Byte
读到文件=21857K
读文件用时=16323802us
平均用时=1404KB/S
inaert_ok
open_res=0
fsize=1048576

The function succeeded!
f_write_res=0
写文件缓存=2048Byte
写入文件=1024K
写文件用时=1867084us
平均用时=575KB/S
fsdelta=3880us
f_sync_res=0
fcdelta=15us
f_close=0
写文件测试结束!


原子测试过F407的速度能达到多少,这个速度还有多少提升的空间吗?
回复 支持 反对

使用道具 举报

6

主题

16

帖子

0

精华

初级会员

Rank: 2

积分
61
金钱
61
注册时间
2018-7-2
在线时间
10 小时
发表于 2018-7-17 22:50:00 | 显示全部楼层
我是早前买的板子,看过这个程序,发现原子F103的程序版本升级了。
请问有没有最新版本的全部例程代码??
谢谢!
回复 支持 反对

使用道具 举报

0

主题

26

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
403
金钱
403
注册时间
2017-11-24
在线时间
56 小时
发表于 2018-12-22 10:46:17 | 显示全部楼层
这里的4字节对齐是个什么概念? 怎么对齐?  写入时的大小要是4的倍数字节码?
回复 支持 反对

使用道具 举报

5

主题

21

帖子

0

精华

初级会员

Rank: 2

积分
99
金钱
99
注册时间
2019-3-15
在线时间
17 小时
发表于 2019-5-27 23:02:08 | 显示全部楼层
@原子哥你好这个源代码下载下来打不开,可否方便重新发一份非常感谢(491434603@qq.com
回复 支持 反对

使用道具 举报

0

主题

4

帖子

0

精华

初级会员

Rank: 2

积分
53
金钱
53
注册时间
2019-6-21
在线时间
9 小时
发表于 2019-6-21 23:08:13 | 显示全部楼层
贴主您好:
     看了您的代码,照着您的路子测量了我手头的水星F429开发板,单次写从4KB到32KB,但是速度从来都没到过500KB/s; 我用的是Hal库函数版历程测试。
     但是您用的是寄存器版本,所以我又用寄存器版本测试,不过寄存器版本的历程下载后板子起不来,Debug也进不了main。。。不知道为什么?恳请赐教,不胜感激!
以下是我的测试函数:

void  test_write_file(char * filename, u32 totalSize, u32 perSize)
{
        char * test_file=filename;
//        char test_frame[100]="0:1906020955577,0f9,8,1122334455667788";
        char testbuf[32768]={0x35};
        int writeb;
        int i;
        int testSize=totalSize; //8MB
        int KBperWr=perSize;    //8KB
        int round = testSize/KBperWr;
        int ticks=0;
       
        FRESULT rest;
        TCHAR* rbuf;

printf("\r\n................................................");
printf("\r\n file=%s, TotalSize=0x%x, PerSize=0x%x, round=%d",filename,totalSize,perSize,round);
printf("\r\n................................................\r\n\r\n");

        rest = f_open(file,test_file,FA_OPEN_ALWAYS|FA_READ|FA_WRITE);
        if(FR_OK != rest)
                printf("open file : %s failed!\r\n",test_file);
        else
                printf("open file : %s OK!\r\n",test_file);
       
        f_lseek(file, file->fptr);/*文件开头位置:文件打开后,fptr=0*/

//        sprintf(test_frame,"%s%s","0:1906020955577,0f9,8,1122334455667788","\r\n");

        printf("bf write 0x%x Bytes, tick = %d.\r\n\r\n", testSize, GetSysTicks());
        ticks = GetSysTicks();
        for(i=0; i<round; i++)
        {
                f_write(file, testbuf, KBperWr, &writeb);
                if(writeb != KBperWr)
                {
                        printf("test write %d KB Failed!\r\n",KBperWr/0x400);
                        while(1);
                }
                writeb=0;
        }
        f_sync(file);
        ticks = GetSysTicks() - ticks;
       
        printf("bf write 0x%x Bytes, tick = %d.\r\n\r\n", testSize, GetSysTicks());
        printf("speed : %f KB/s\r\n\r\n", (float)testSize/(float)ticks);


        f_close(file);
printf("test end................\r\n\r\n");
}

测试调用为:
        test_write_file("TestFile_1K",0x800000,1024);
        test_write_file("TestFile_2K",0x800000,2048);
        test_write_file("TestFile_4K",0x800000,4096);
        test_write_file("TestFile_8K",0x800000,8192);
        test_write_file("TestFile_16K",0x800000,0x4000);
        test_write_file("TestFile_32K",0x800000,0x8000);

测试结果为:
................................................
file=TestFile_1K, TotalSize=0x800000, PerSize=0x400, round=8192
................................................

open file : TestFile_1K OK!
bf write 0x800000 Bytes, tick = 10034.

bf write 0x800000 Bytes, tick = 29545.

speed : 430.030670 KB/s

test end................


................................................
file=TestFile_2K, TotalSize=0x800000, PerSize=0x800, round=4096
................................................

open file : TestFile_2K OK!
bf write 0x800000 Bytes, tick = 29574.

bf write 0x800000 Bytes, tick = 50785.

speed : 395.558441 KB/s

test end................


................................................
file=TestFile_4K, TotalSize=0x800000, PerSize=0x1000, round=2048
................................................

open file : TestFile_4K OK!
bf write 0x800000 Bytes, tick = 50813.

bf write 0x800000 Bytes, tick = 70365.

speed : 429.128723 KB/s

test end................


................................................
file=TestFile_8K, TotalSize=0x800000, PerSize=0x2000, round=1024
................................................

open file : TestFile_8K OK!
bf write 0x800000 Bytes, tick = 70394.

bf write 0x800000 Bytes, tick = 92179.

speed : 385.134186 KB/s

test end................


................................................
file=TestFile_16K, TotalSize=0x800000, PerSize=0x4000, round=512
................................................

open file : TestFile_16K OK!
bf write 0x800000 Bytes, tick = 92208.

bf write 0x800000 Bytes, tick = 113179.

speed : 400.086243 KB/s

test end................


................................................
file=TestFile_32K, TotalSize=0x800000, PerSize=0x8000, round=256
................................................

open file : TestFile_32K OK!
bf write 0x800000 Bytes, tick = 113208.

bf write 0x800000 Bytes, tick = 134084.

speed : 401.907257 KB/s

test end................
回复 支持 反对

使用道具 举报

0

主题

4

帖子

0

精华

初级会员

Rank: 2

积分
53
金钱
53
注册时间
2019-6-21
在线时间
9 小时
发表于 2019-6-22 17:17:07 | 显示全部楼层
已经解决,是写缓冲区buffer没有 4B 对齐。
回复 支持 反对

使用道具 举报

4

主题

16

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
201
金钱
201
注册时间
2019-5-13
在线时间
25 小时
发表于 2019-7-15 11:15:14 | 显示全部楼层
原子哥  我用的F7的开发板 请问该怎么移植呢  新手求教
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165352
金钱
165352
注册时间
2010-12-1
在线时间
2108 小时
 楼主| 发表于 2019-7-16 02:48:13 | 显示全部楼层
SsJjPp 发表于 2019-7-15 11:15
原子哥  我用的F7的开发板 请问该怎么移植呢  新手求教

我有F7的FATFS例程,你参考这个改即可,不难的
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

4

主题

16

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
201
金钱
201
注册时间
2019-5-13
在线时间
25 小时
发表于 2019-7-17 09:36:42 | 显示全部楼层
正点原子 发表于 2019-7-16 02:48
我有F7的FATFS例程,你参考这个改即可,不难的

原子哥  你敢不敢用F7的板子调一个SD卡,我试了一下,总报错
回复 支持 反对

使用道具 举报

5

主题

44

帖子

0

精华

初级会员

Rank: 2

积分
178
金钱
178
注册时间
2014-9-27
在线时间
27 小时
发表于 2019-8-21 08:57:01 | 显示全部楼层
请教原子哥:我用你的开发板程序,实现了2M字节/秒的写入速度,库函数模式,卡是三星C10卡。 这个速度怎么还能提高。??麻烦您指导下
回复 支持 反对

使用道具 举报

5

主题

44

帖子

0

精华

初级会员

Rank: 2

积分
178
金钱
178
注册时间
2014-9-27
在线时间
27 小时
发表于 2019-8-21 09:03:48 | 显示全部楼层
请教原子哥:我用你的开发板程序,库函数模式,实现2M字节的写入速度,三星C10卡。请问怎么做还能提高速度???
我没用文件系统,仅仅进行了底层操作,调用的是SD_WriteDisk(u8*buf,u32 sector,u8 cnt)  函数。  buf 的大小是50K==51200字节

速度慢是库函数的原因吗???
谢谢指点。
回复 支持 反对

使用道具 举报

5

主题

44

帖子

0

精华

初级会员

Rank: 2

积分
178
金钱
178
注册时间
2014-9-27
在线时间
27 小时
发表于 2019-8-21 09:06:19 | 显示全部楼层
MCU是STM32F407
回复 支持 反对

使用道具 举报

5

主题

44

帖子

0

精华

初级会员

Rank: 2

积分
178
金钱
178
注册时间
2014-9-27
在线时间
27 小时
发表于 2019-8-21 09:30:52 | 显示全部楼层
SD_WriteMultiBlocks(buf,lsector,512,cnt);        //
这个函数里面的常用的子函数 SDIO_Send_Data_Cfg()和SDIO_Send_Cmd()我用寄存器模式的代码替换了。
回复 支持 反对

使用道具 举报

0

主题

4

帖子

0

精华

新手上路

积分
22
金钱
22
注册时间
2019-11-16
在线时间
5 小时
发表于 2019-11-20 21:55:59 | 显示全部楼层
原子哥,我直接使用了例程的读卡器模式,在电脑上测的,看结果是不是速度受限于usb的速度啊
批注 2019-11-20 215529.png
回复 支持 反对

使用道具 举报

0

主题

1

帖子

0

精华

新手入门

积分
18
金钱
18
注册时间
2019-11-13
在线时间
5 小时
发表于 2019-11-24 19:19:03 | 显示全部楼层
太牛吧!!!!!!!!!!!
回复 支持 反对

使用道具 举报

5

主题

44

帖子

0

精华

初级会员

Rank: 2

积分
178
金钱
178
注册时间
2014-9-27
在线时间
27 小时
发表于 2020-2-14 15:41:43 | 显示全部楼层
原子哥用的这个开发板 应该是第一版的 古董吧,,,经典版本,我还保存了一个呢。
回复 支持 反对

使用道具 举报

2

主题

5

帖子

0

精华

新手上路

积分
24
金钱
24
注册时间
2021-2-23
在线时间
7 小时
发表于 2021-5-14 12:30:34 | 显示全部楼层
请问下这个测试程序有没有HAL版本的?
回复 支持 反对

使用道具 举报

2

主题

5

帖子

0

精华

新手上路

积分
24
金钱
24
注册时间
2021-2-23
在线时间
7 小时
发表于 2021-5-14 16:44:34 | 显示全部楼层
请问下这个测试程序有没有HAL版本的?
回复 支持 反对

使用道具 举报

1

主题

3

帖子

0

精华

新手入门

积分
12
金钱
12
注册时间
2023-3-11
在线时间
1 小时
发表于 2023-4-9 20:35:33 | 显示全部楼层
原子哥,请教一下,01 基本定时器中断实验中定时器中断回调函数中调用printf函数,程序为什么会卡死在printf里面的
回复 支持 反对

使用道具 举报

18

主题

51

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
345
金钱
345
注册时间
2016-12-5
在线时间
57 小时
发表于 2023-5-8 11:12:30 | 显示全部楼层
我有一个疑问,同步的时间么有算入内唉,fclose里面有一个同步,这个也比较耗时,应该也要计算这个吧
回复 支持 反对

使用道具 举报

0

主题

1

帖子

0

精华

新手入门

积分
2
金钱
2
注册时间
2023-8-24
在线时间
0 小时
发表于 2023-8-24 18:36:16 | 显示全部楼层
想问下: 我用的HAL库,测试写入的时候会偶发性的出现WriteBlocks失败进行SDIO的重启,导致测试的写入速度不稳定。
SDIO接的emmc USB挂载到电脑上是7.28G
想问下还有优化方案么,比如有没有必要用HAL_MMC_WriteBlocks_DMA,  另外f_write之后有没有必要delay下

  1. DRESULT USER_write (
  2.         BYTE pdrv,          /* Physical drive nmuber to identify the drive */
  3.         const BYTE *buff,   /* Data to be written */
  4.         DWORD sector,       /* Sector address in LBA */
  5.         UINT count          /* Number of sectors to write */
  6. )
  7. {
  8.   /* USER CODE BEGIN WRITE */
  9.   /* USER CODE HERE */      
  10.   DRESULT res = RES_ERROR;
  11.   uint32_t timeout = 100000UL;
  12.   while(HAL_MMC_WriteBlocks(&hmmc, (uint8_t *)buff, sector, count, SDMMC_DATATIMEOUT) != HAL_OK) {   
  13.     MX_SDIO_MMC_Init();        
  14.     if (timeout-- == 0) {
  15.       return RES_ERROR;
  16.     }
  17.   }
  18.   while(HAL_MMC_GetCardState(&hmmc) != CG_SDIO_CARD_TRANSFER) {
  19.     if (timeout-- == 0) {
  20.       return RES_ERROR;
  21.     }
  22.   }
  23.   res = RES_OK;
  24.   return res;
  25.   /* USER CODE END WRITE */
  26. }
复制代码
回复 支持 反对

使用道具 举报

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

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2024-11-24 20:33

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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