SDIO读写SD卡速度有多快?

阿里云国内75折 回扣 微信号:monov8
阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6

前两天测试了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文件系统后同一张卡的读写速度都有所提升尤其是写入速度提升明显。可见文件系统的格式对速度也是有影响的。

阿里云国内75折 回扣 微信号:monov8
阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6