Skip to content

MicroSD Card Test

SpeedTestMicroSD.ino tests the connected microSD card by writing different-sized chunks of data to measure the write speed and prints the result in MB/s through a USB serial.

SpeedTestMicroSD.ino
#include <SD_MMC.h>
// SDMMC pins
#define SD_CLK 4
#define SD_CMD 5
#define SD_D0 6
#define SD_D1 7
#define SD_D2 8
#define SD_D3 9
const size_t bufferSize = 64 * 1024;
const char* testFile = "/test.bin";
uint8_t* buffer = nullptr;
void speedtest(int runs){
size_t written = 0;
File file = SD_MMC.open(testFile, FILE_WRITE);
if (!file){
Serial.println("Failed to open file");
return;
}
// Get precise start time
int64_t start = esp_timer_get_time();
for (int i = 0; i < runs; ++i) {
written += file.write(buffer, bufferSize);
}
file.flush();
int64_t stop = esp_timer_get_time();
int64_t writeTime = stop - start;
double writeSpeed = ((double)written / 1024.0 / 1024.0) / (writeTime / 1000000.0);
Serial.println("Written " + String(written / 1024) + " KB in " + String(writeTime / 1000.0, 2) + " ms; Write speed: " + String(writeSpeed, 2) + " MB/s");
}
void setup() {
// Allocate and fill DMA-capable memory
buffer = (uint8_t*)heap_caps_malloc(bufferSize, MALLOC_CAP_DMA);
memset(buffer, 0xAA, bufferSize);
// Start and wait for serial connection
Serial.begin(115200);
while (!Serial) delay(100);
// Init SD card
Serial.println("Initializing SDMMC...");
SD_MMC.setPins(SD_CLK, SD_CMD, SD_D0, SD_D1, SD_D2, SD_D3);
if (!SD_MMC.begin()) {
Serial.println("SDMMC initialization failed!");
return;
}
Serial.println("SDMMC initialized.");
// Run speedtest
speedtest(1);
speedtest(10);
speedtest(100);
heap_caps_free(buffer);
}
void loop() {}