OpenEdv-开源电子网

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

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

[复制链接]

527

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165778
金钱
165778
注册时间
2010-12-1
在线时间
2124 小时
发表于 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, 下载次数: 4175)
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子产品购买店铺:https://zhengdianyuanzi.tmall.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

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

主题

1043

帖子

0

精华

论坛元老

Rank: 8Rank: 8

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

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

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

使用道具 举报

527

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

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

你们要多快的速度啊?
另外,airplay,搞定没有?什么时候搞个样品给我试试。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子产品购买店铺:https://zhengdianyuanzi.tmall.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格式的表格文件  速度是否一样?
回复 支持 反对

使用道具 举报

527

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

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

只要你数据准备的快,写入就快,不管你什么格式的。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子产品购买店铺:https://zhengdianyuanzi.tmall.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

主题

7

帖子

0

精华

初级会员

Rank: 2

积分
56
金钱
56
注册时间
2018-3-2
在线时间
10 小时
发表于 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

主题

15

帖子

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

积分
54
金钱
54
注册时间
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

积分
54
金钱
54
注册时间
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的开发板 请问该怎么移植呢  新手求教
回复 支持 反对

使用道具 举报

527

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

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

我有F7的FATFS例程,你参考这个改即可,不难的
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子产品购买店铺:https://zhengdianyuanzi.tmall.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

主题

38

帖子

0

精华

初级会员

Rank: 2

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

使用道具 举报

5

主题

38

帖子

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

主题

38

帖子

0

精华

初级会员

Rank: 2

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

使用道具 举报

5

主题

38

帖子

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

主题

38

帖子

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里面的
回复 支持 反对

使用道具 举报

20

主题

55

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
388
金钱
388
注册时间
2016-12-5
在线时间
61 小时
发表于 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. }
复制代码
回复 支持 反对

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

如发现本坛存在违规或侵权内容, 请点击这里发送邮件举报 (或致电020-38271790)。请提供侵权说明和联系方式。我们将及时审核依法处理,感谢配合。

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

GMT+8, 2026-9-26 23:16

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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