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