SDIO接口读写SD卡的速度测试及分析

前两天测试了SPI方式读写SD卡的速度《SPI方式读写SD卡速度测试》,今天来测试一下SDIO方式的读写速度。

测试条件:

单片机:STM32F407VET6

编译环境:MDK 5.30+HAL库

SD卡:闪迪32GB/64GB TF卡

文件系统:FatFS R0.12c

之前测试中说过了,非DMA方式速度和资源利用率都不如DMA方式,所以今天主要就测试SDIO+DMA方式的极限速度。SDIO采用的4线模式,理论上比1线的要快4倍。

首先用STM32CubeMx配置SDIO,如下:4线模式,分频系数为0,即不分频,此时SDIO的时钟为48MHz(单片机主频配置的为168MHz)。

使能SDIO的收发DMA:

接下来需要配置FatFS文件系统,如下:

由于需要测试64GB的卡,就需要使能exFAT文件系统(超过32G的卡需要使能),同时也要使能“长文件名”功能,不然会报错。

接下来直接生成代码,生成的代码中,底层驱动、以及文件系统都已经封装好了,直接调用相关函数就行。测试程序如下:


#define  NUM  32768

  retSD = f_mount(&SDFatFS, (TCHAR const*)SDPath, 0);//挂载

  retSD = f_open(&SDFile,(const char*)"test.txt",FA_CREATE_ALWAYS|FA_WRITE);
  for(uint32_t i=0;i<NUM;i++)
  {
    FileBuf[i] = (i%7) + 0x30;
  }
  tick = 0;//ms计数器清零
  for(uint8_t i=0;i<100;i++)//每次写入NUM个字节,连续写入100次
  {
    retSD = f_write(&SDFile,FileBuf,NUM,&bw);
    retSD = f_sync(&SDFile);
  }
  retSD = f_close(&SDFile);

  for(uint32_t i=0;i<NUM;i++)
  {
    FileBuf[i] = 0;
  }
  retSD = f_open(&SDFile,(const char*)"test.txt",FA_OPEN_EXISTING|FA_READ);//打开文件
  tick = 0;
  for(uint8_t i=0;i<100;i++)//读取NUM个字节,连续读取100次
  {
    retSD = f_read(&SDFile,FileBuf,NUM,&bw);
  }
  retSD = f_close(&SDFile);

打开文件后,每次写入文件32KB或16KB数据,连续写入100次。统计总时间,然后计算平均写入速度。读取测试也是一样。32G和64G卡测试结果如下:

可以看到32G卡写入速度在2MB/秒左右,单次写入数据越大,速度越快。

64G卡写入速度要更快,单次写入32KB时,平均速度可达5.4MB/秒左右。

两种卡的读取速度区别不大,都比写入速度快不少,在8~9MB/秒左右。

两种卡是同一品牌的,但写入速度区别比较大,怀疑可能是文件系统的原因,32G卡文件系统为FAT32,而64G卡文件系统为exFAT。

为了验证这个问题,我们将32G的卡也格式化为exFAT文件系统,再进行测试。

测试结果如下。可以看到,格式化为exFAT文件系统后,同一张卡的读写速度都有所提升,尤其是写入速度,提升明显。可见文件系统的格式对速度也是有影响的。

物联沃分享整理
物联沃-IOTWORD物联网 » SDIO接口读写SD卡的速度测试及分析

发表评论