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.
#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() {}