前兩天測試了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 32768retSD = 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{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{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/秒左右。
這個速度還是很不錯的,比SPI方式快了不少,可以做一些實時的數據采集和存儲。
? ? ? ? ?
兩種卡是同一品牌的,但寫入速度區別比較大,懷疑可能是文件系統的原因,32G卡文件系統為FAT32,而64G卡文件系統為exFAT。
為了驗證這個問題,我們將32G的卡也格式化為exFAT文件系統,再進行測試。

測試結果如下。可以看到,格式化為exFAT文件系統后,同一張卡的讀寫速度都有所提升,尤其是寫入速度,提升明顯。可見文件系統的格式對速度也是有影響的。

STM32CubeMX之SDIO+FatFS讀寫SD卡
串口接收不定長數據的幾種方法
Keil調試時設置斷點的高級用法
SPI方式讀寫SD卡速度有多快?
STM32定時器實現紅外接收與解碼
STM32F0系列中斷向量映射問題