first

Dependencies:   SDFileSystemDMA mbed

Refer to:
https://developer.mbed.org/users/mimi3/code/SDFileSystemDMA

Caution

If your board has SRAM less than or equal to 8KB, the 'buffer' size must be set to 512 Bytes.

NUCLEO-F411RE
About 2.5MBytes/sec
/media/uploads/mimi3/sdfilesystemdma-speed-test-teraterm-output-f411re.png
NUCLEO-L152RE
About 1MBytes/sec
/media/uploads/mimi3/sdfilesystemdma-l152re-cui.png

main.cpp

Committer:
mimi3
Date:
2016-02-14
Revision:
5:fef1667b832e
Parent:
4:0719b77970da
Child:
9:289de1b6d378

File content as of revision 5:fef1667b832e:

#include "mbed.h"
#include "SDFileSystemDMA.h"

#define UART_KEY_PRESS  1

#if defined(TARGET_NUCLEO_F411RE)|| defined(TARGET_F401RE)
#define MOSI        D11
#define MISO        D12
#define SCLK        D13
#define CS          D10
#elif defined(TARGET_STM32F3)
#define MOSI        PC_12
#define MISO        PC_11
#define SCLK        PC_10
#define CS          PC_9
#else
#define MOSI        D4
#define MISO        D5
#define SCLK        D3
#define CS          D10
#endif
//#define CD          D9      // detect SD card insertion. Do open always. 
//#define CD_TYPE     SDFileSystem::SWITCH_POS_NC     // always instertion state
#define SPI_CLOCK_HZ    ( 12 * 1000000 ) 
Timer timer;
Serial pc(USBTX,USBRX);

SDFileSystem sd( MOSI, MISO, SCLK, CS, "sd", SPI_CLOCK_HZ);  
//SDFileSystem sd(p5, p6, p7, p8, "sd"); // the pinout on the mbed Cool Components workshop board

char buffer[512];
#define X_MEGA_BYTE     ((1)*1024*1024) /* 1Mbyte */
#define FILE_NAME   "GPATH"
void wait_key_press(){
#if UART_KEY_PRESS
    printf("\n-- Press any key --\n");  
    fflush(stdout); 
    while(!pc.readable());
    volatile int res = pc.getc();
#else

#endif
}

void writeTest()
{
    //Test write performance by creating a 1MB file
    printf("[Write]: Testing %dByte buffer: write performance...", sizeof(buffer));
    fflush(stdout); 
    FileHandle* file = sd.open(FILE_NAME, O_WRONLY | O_CREAT | O_TRUNC);
    if (file != NULL) {
        timer.start();
        for (uint32_t i = 0; i < (X_MEGA_BYTE / sizeof(buffer)); i++) {
            if (file->write(buffer, sizeof(buffer)) != sizeof(buffer)) {
                timer.stop();
                printf("write error!\n");
                timer.reset();
                return;
            }
        }
        timer.stop();
        if (file->close())
            printf("failed to close file!\n");
        else{
            printf("done!\n\tResult: %d KB/s\n", (  1024 * 1000000 ) / timer.read_us() );
        }
        timer.reset();
    } else {
        printf("failed to create file!\n");
    }
}


void readTest()
{
    //Test read performance by reading the 1MB file created by writeTest()
    printf("[Read]: Testing %dByte buffer: read performance...", sizeof(buffer));
    fflush(stdout); 
    FileHandle* file = sd.open(FILE_NAME, O_RDONLY);
    if (file != NULL) {
        timer.start();
        int iterations = 0;
        while (file->read(buffer, sizeof(buffer)) == sizeof(buffer))
            iterations++;
        timer.stop();
        if (iterations != (X_MEGA_BYTE / sizeof(buffer))){
            printf("read error!\n");
                }
        else if (file->close()){
            printf("failed to close file!\n");
                }
       // else if (sd.remove(FILE_NAME))
       //     printf("failed to delete file!\n");
        else{
            printf("done!\n\tResult: %d KB/s\n",  (  1024 * 1000000 ) / timer.read_us());
        }
        timer.reset();
    } else {
        printf("failed to open file!\n");
    }
}

int main(){
    /* UART Baudrate is 9600bps*/
    while(1){
        printf("\nStart SD card accsess test!");
        printf("\nWriting is very slow, wait several minuts."); 
        wait_key_press();
        writeTest();
        readTest();
    }
}