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

Committer:
mimi3
Date:
Fri Feb 12 15:52:44 2016 +0000
Revision:
2:f8bd763b5584
Parent:
1:c39cfc31349d
Child:
3:8b77055a68ec
added: key wait function

Who changed what in which revision?

UserRevisionLine numberNew contents of line
mimi3 0:8f297fe0c66a 1 #include "mbed.h"
mimi3 0:8f297fe0c66a 2 #include "SDFileSystemDMA.h"
mimi3 0:8f297fe0c66a 3 #define MOSI D4
mimi3 0:8f297fe0c66a 4 #define MISO D5
mimi3 0:8f297fe0c66a 5 #define SCLK D3
mimi3 0:8f297fe0c66a 6 #define CS D10
mimi3 0:8f297fe0c66a 7 //#define CD D9 // detect SD card insertion. Do open always.
mimi3 0:8f297fe0c66a 8 //#define CD_TYPE SDFileSystem::SWITCH_POS_NC // always instertion state
mimi3 0:8f297fe0c66a 9 //#define SPI_CLOCK_HZ ( 12 * 1000000 )
mimi3 0:8f297fe0c66a 10 Timer timer;
mimi3 1:c39cfc31349d 11 Serial pc(USBTX,USBRX);
mimi3 0:8f297fe0c66a 12
mimi3 0:8f297fe0c66a 13 SDFileSystem sd( MOSI, MISO, SCLK, CS, "sd");
mimi3 0:8f297fe0c66a 14 //SDFileSystem sd(p5, p6, p7, p8, "sd"); // the pinout on the mbed Cool Components workshop board
mimi3 1:c39cfc31349d 15
mimi3 0:8f297fe0c66a 16
mimi3 0:8f297fe0c66a 17 char buffer[512];
mimi3 0:8f297fe0c66a 18 #define X_MEGA_BYTE ((1)*1024*1024) /* 1Mbyte */
mimi3 0:8f297fe0c66a 19 #define FILE_NAME "GPATH"
mimi3 0:8f297fe0c66a 20
mimi3 2:f8bd763b5584 21 void wait_key_press(){
mimi3 2:f8bd763b5584 22 while(!pc.readable());
mimi3 2:f8bd763b5584 23 volatile int res = pc.getc();
mimi3 2:f8bd763b5584 24 }
mimi3 2:f8bd763b5584 25
mimi3 0:8f297fe0c66a 26 int base_test() {
mimi3 0:8f297fe0c66a 27
mimi3 1:c39cfc31349d 28 printf("\nPress any key!\n");
mimi3 2:f8bd763b5584 29 wait_key_press();
mimi3 0:8f297fe0c66a 30
mimi3 0:8f297fe0c66a 31 mkdir("/sd/mydirx", 0777);
mimi3 0:8f297fe0c66a 32
mimi3 0:8f297fe0c66a 33 FILE *fp = fopen("/sd/mydirx/sdtest.txt", "w");
mimi3 0:8f297fe0c66a 34 if(fp == NULL) {
mimi3 0:8f297fe0c66a 35 error("Could not open file for write\n");
mimi3 0:8f297fe0c66a 36 }
mimi3 0:8f297fe0c66a 37 fprintf(fp, "Hello fun SD Card World!");
mimi3 0:8f297fe0c66a 38 fclose(fp);
mimi3 0:8f297fe0c66a 39
mimi3 0:8f297fe0c66a 40 printf("Goodbye World!\n");
mimi3 0:8f297fe0c66a 41 return 0;
mimi3 0:8f297fe0c66a 42 }
mimi3 0:8f297fe0c66a 43
mimi3 0:8f297fe0c66a 44 void writeTest()
mimi3 0:8f297fe0c66a 45 {
mimi3 0:8f297fe0c66a 46 //Test write performance by creating a 1MB file
mimi3 0:8f297fe0c66a 47 printf("Testing %dByte buffer: write performance...", sizeof(buffer));
mimi3 0:8f297fe0c66a 48 FileHandle* file = sd.open(FILE_NAME, O_WRONLY | O_CREAT | O_TRUNC);
mimi3 0:8f297fe0c66a 49 if (file != NULL) {
mimi3 0:8f297fe0c66a 50 timer.start();
mimi3 0:8f297fe0c66a 51 for (uint32_t i = 0; i < (X_MEGA_BYTE / sizeof(buffer)); i++) {
mimi3 0:8f297fe0c66a 52 if (file->write(buffer, sizeof(buffer)) != sizeof(buffer)) {
mimi3 0:8f297fe0c66a 53 timer.stop();
mimi3 0:8f297fe0c66a 54 printf("write error!\n");
mimi3 0:8f297fe0c66a 55 timer.reset();
mimi3 0:8f297fe0c66a 56 return;
mimi3 0:8f297fe0c66a 57 }
mimi3 0:8f297fe0c66a 58 }
mimi3 0:8f297fe0c66a 59 timer.stop();
mimi3 0:8f297fe0c66a 60 if (file->close())
mimi3 0:8f297fe0c66a 61 printf("failed to close file!\n");
mimi3 0:8f297fe0c66a 62 else{
mimi3 0:8f297fe0c66a 63 printf("done!\n\tResult: %d KB/s\n", ( 1024 * 1000000 ) / timer.read_us() );
mimi3 0:8f297fe0c66a 64 }
mimi3 0:8f297fe0c66a 65 timer.reset();
mimi3 0:8f297fe0c66a 66 } else {
mimi3 0:8f297fe0c66a 67 printf("failed to create file!\n");
mimi3 0:8f297fe0c66a 68 }
mimi3 0:8f297fe0c66a 69 }
mimi3 0:8f297fe0c66a 70
mimi3 0:8f297fe0c66a 71
mimi3 0:8f297fe0c66a 72 void readTest()
mimi3 0:8f297fe0c66a 73 {
mimi3 0:8f297fe0c66a 74 //Test read performance by reading the 1MB file created by writeTest()
mimi3 0:8f297fe0c66a 75 printf("Testing %dByte buffer: read performance...", sizeof(buffer));
mimi3 0:8f297fe0c66a 76 FileHandle* file = sd.open(FILE_NAME, O_RDONLY);
mimi3 0:8f297fe0c66a 77 if (file != NULL) {
mimi3 0:8f297fe0c66a 78 timer.start();
mimi3 0:8f297fe0c66a 79 int iterations = 0;
mimi3 0:8f297fe0c66a 80 while (file->read(buffer, sizeof(buffer)) == sizeof(buffer))
mimi3 0:8f297fe0c66a 81 iterations++;
mimi3 0:8f297fe0c66a 82 timer.stop();
mimi3 0:8f297fe0c66a 83 if (iterations != (X_MEGA_BYTE / sizeof(buffer))){
mimi3 0:8f297fe0c66a 84 printf("read error!\n");
mimi3 0:8f297fe0c66a 85 }
mimi3 0:8f297fe0c66a 86 else if (file->close()){
mimi3 0:8f297fe0c66a 87 printf("failed to close file!\n");
mimi3 0:8f297fe0c66a 88 }
mimi3 0:8f297fe0c66a 89 // else if (sd.remove(FILE_NAME))
mimi3 0:8f297fe0c66a 90 // printf("failed to delete file!\n");
mimi3 0:8f297fe0c66a 91 else{
mimi3 0:8f297fe0c66a 92 printf("done!\n\tResult: %d KB/s\n", ( 1024 * 1000000 ) / timer.read_us());
mimi3 0:8f297fe0c66a 93 }
mimi3 0:8f297fe0c66a 94 timer.reset();
mimi3 0:8f297fe0c66a 95 } else {
mimi3 0:8f297fe0c66a 96 printf("failed to open file!\n");
mimi3 0:8f297fe0c66a 97 }
mimi3 0:8f297fe0c66a 98 }
mimi3 0:8f297fe0c66a 99
mimi3 0:8f297fe0c66a 100 int main(){
mimi3 0:8f297fe0c66a 101 /* UART Baudrate is 9600bps*/
mimi3 0:8f297fe0c66a 102 while(1){
mimi3 2:f8bd763b5584 103 printf("\nStart SD card accsess test!");
mimi3 2:f8bd763b5584 104 printf("\nWriting is very slow, wait several minuts.");
mimi3 2:f8bd763b5584 105 printf("\n-- Press any key --\n");
mimi3 2:f8bd763b5584 106 wait_key_press();
mimi3 0:8f297fe0c66a 107 writeTest();
mimi3 0:8f297fe0c66a 108 readTest();
mimi3 0:8f297fe0c66a 109 }
mimi3 0:8f297fe0c66a 110 }