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:
Sat Feb 20 14:04:54 2016 +0900
Revision:
10:5f6fc7dc119b
Parent:
9:289de1b6d378
Child:
11:d5fc11ac948a
mod: comment only

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 3:8b77055a68ec 3
mimi3 9:289de1b6d378 4 /* SD card Interface connection
mimi3 9:289de1b6d378 5 * : aitendo : General
mimi3 9:289de1b6d378 6 * MCU sig. : IFB-254-SD : PIN name
mimi3 9:289de1b6d378 7 --- : 1 : 9 dat2
mimi3 9:289de1b6d378 8 CS : 2 : 1 cs/dat3
mimi3 9:289de1b6d378 9 MOSI : 3 : 2 di/cmd
mimi3 9:289de1b6d378 10 GND : 4 : 3 vss1
mimi3 9:289de1b6d378 11 VCC : 5 : 4 vdd
mimi3 9:289de1b6d378 12 CLK : 6 : 5 clk
mimi3 9:289de1b6d378 13 GND : 7 : 6 vss2
mimi3 9:289de1b6d378 14 MISO : 8 : 7 do/dat0
mimi3 9:289de1b6d378 15 --- : 9 : 8 dat1
mimi3 9:289de1b6d378 16 --- : 10 : 11 wp
mimi3 9:289de1b6d378 17 --- : 11 : 10 cd1
mimi3 9:289de1b6d378 18 --- : 12 : - case GND
mimi3 9:289de1b6d378 19 */
mimi3 9:289de1b6d378 20
mimi3 10:5f6fc7dc119b 21 /* You should confirm SPI_DEV macro in "spi_device.h" to specify SPI device number.
mimi3 10:5f6fc7dc119b 22 * (default is 1 (SPI1))
mimi3 10:5f6fc7dc119b 23 */
mimi3 9:289de1b6d378 24 #include "spi_device.h"
mimi3 9:289de1b6d378 25
mimi3 3:8b77055a68ec 26 #define UART_KEY_PRESS 1
mimi3 3:8b77055a68ec 27
mimi3 10:5f6fc7dc119b 28 #define SPI_CLOCK_HZ ( 12 * 1000000 )
mimi3 0:8f297fe0c66a 29 Timer timer;
mimi3 1:c39cfc31349d 30 Serial pc(USBTX,USBRX);
mimi3 0:8f297fe0c66a 31
mimi3 3:8b77055a68ec 32 SDFileSystem sd( MOSI, MISO, SCLK, CS, "sd", SPI_CLOCK_HZ);
mimi3 1:c39cfc31349d 33
mimi3 0:8f297fe0c66a 34 char buffer[512];
mimi3 0:8f297fe0c66a 35 #define X_MEGA_BYTE ((1)*1024*1024) /* 1Mbyte */
mimi3 0:8f297fe0c66a 36 #define FILE_NAME "GPATH"
mimi3 2:f8bd763b5584 37 void wait_key_press(){
mimi3 3:8b77055a68ec 38 #if UART_KEY_PRESS
mimi3 9:289de1b6d378 39 pc.printf("\n-- Select 'r' or 'w' --\n");
mimi3 3:8b77055a68ec 40 fflush(stdout);
mimi3 2:f8bd763b5584 41 while(!pc.readable());
mimi3 2:f8bd763b5584 42 volatile int res = pc.getc();
mimi3 3:8b77055a68ec 43 #else
mimi3 0:8f297fe0c66a 44
mimi3 3:8b77055a68ec 45 #endif
mimi3 0:8f297fe0c66a 46 }
mimi3 0:8f297fe0c66a 47
mimi3 0:8f297fe0c66a 48 void writeTest()
mimi3 0:8f297fe0c66a 49 {
mimi3 0:8f297fe0c66a 50 //Test write performance by creating a 1MB file
mimi3 9:289de1b6d378 51 pc.printf("[Write]: Testing %dByte buffer: write performance...", sizeof(buffer));
mimi3 3:8b77055a68ec 52 fflush(stdout);
mimi3 0:8f297fe0c66a 53 FileHandle* file = sd.open(FILE_NAME, O_WRONLY | O_CREAT | O_TRUNC);
mimi3 0:8f297fe0c66a 54 if (file != NULL) {
mimi3 0:8f297fe0c66a 55 timer.start();
mimi3 0:8f297fe0c66a 56 for (uint32_t i = 0; i < (X_MEGA_BYTE / sizeof(buffer)); i++) {
mimi3 0:8f297fe0c66a 57 if (file->write(buffer, sizeof(buffer)) != sizeof(buffer)) {
mimi3 0:8f297fe0c66a 58 timer.stop();
mimi3 9:289de1b6d378 59 pc.printf("write error!\n");
mimi3 0:8f297fe0c66a 60 timer.reset();
mimi3 0:8f297fe0c66a 61 return;
mimi3 0:8f297fe0c66a 62 }
mimi3 0:8f297fe0c66a 63 }
mimi3 0:8f297fe0c66a 64 timer.stop();
mimi3 0:8f297fe0c66a 65 if (file->close())
mimi3 9:289de1b6d378 66 pc.printf("failed to close file!\n");
mimi3 0:8f297fe0c66a 67 else{
mimi3 9:289de1b6d378 68 pc.printf("done!\n\tResult: %d KB/s\n", ( 1024 * 1000000 ) / timer.read_us() );
mimi3 0:8f297fe0c66a 69 }
mimi3 0:8f297fe0c66a 70 timer.reset();
mimi3 0:8f297fe0c66a 71 } else {
mimi3 9:289de1b6d378 72 pc.printf("failed to create file!\n");
mimi3 0:8f297fe0c66a 73 }
mimi3 0:8f297fe0c66a 74 }
mimi3 0:8f297fe0c66a 75
mimi3 0:8f297fe0c66a 76
mimi3 0:8f297fe0c66a 77 void readTest()
mimi3 0:8f297fe0c66a 78 {
mimi3 0:8f297fe0c66a 79 //Test read performance by reading the 1MB file created by writeTest()
mimi3 9:289de1b6d378 80 pc.printf("[Read]: Testing %dByte buffer: read performance...", sizeof(buffer));
mimi3 3:8b77055a68ec 81 fflush(stdout);
mimi3 0:8f297fe0c66a 82 FileHandle* file = sd.open(FILE_NAME, O_RDONLY);
mimi3 0:8f297fe0c66a 83 if (file != NULL) {
mimi3 0:8f297fe0c66a 84 timer.start();
mimi3 0:8f297fe0c66a 85 int iterations = 0;
mimi3 0:8f297fe0c66a 86 while (file->read(buffer, sizeof(buffer)) == sizeof(buffer))
mimi3 0:8f297fe0c66a 87 iterations++;
mimi3 0:8f297fe0c66a 88 timer.stop();
mimi3 0:8f297fe0c66a 89 if (iterations != (X_MEGA_BYTE / sizeof(buffer))){
mimi3 9:289de1b6d378 90 pc.printf("read error!\n");
mimi3 0:8f297fe0c66a 91 }
mimi3 0:8f297fe0c66a 92 else if (file->close()){
mimi3 9:289de1b6d378 93 pc.printf("failed to close file!\n");
mimi3 0:8f297fe0c66a 94 }
mimi3 0:8f297fe0c66a 95 // else if (sd.remove(FILE_NAME))
mimi3 9:289de1b6d378 96 // pc.printf("failed to delete file!\n");
mimi3 0:8f297fe0c66a 97 else{
mimi3 9:289de1b6d378 98 pc.printf("done!\n\tResult: %d KB/s\n", ( 1024 * 1000000 ) / timer.read_us());
mimi3 0:8f297fe0c66a 99 }
mimi3 0:8f297fe0c66a 100 timer.reset();
mimi3 0:8f297fe0c66a 101 } else {
mimi3 9:289de1b6d378 102 pc.printf("failed to open file!\n");
mimi3 0:8f297fe0c66a 103 }
mimi3 0:8f297fe0c66a 104 }
mimi3 0:8f297fe0c66a 105
mimi3 0:8f297fe0c66a 106 int main(){
mimi3 0:8f297fe0c66a 107 /* UART Baudrate is 9600bps*/
mimi3 9:289de1b6d378 108 while(1){
mimi3 9:289de1b6d378 109 pc.printf("\nSysClock= %d Hz", SystemCoreClock);
mimi3 9:289de1b6d378 110 pc.printf(" mbed rev.%d", MBED_LIBRARY_VERSION);
mimi3 9:289de1b6d378 111 pc.printf("\nStart SD card accsess test!");
mimi3 9:289de1b6d378 112 pc.printf("\n SPI(%d) device",SPI_DEV);
mimi3 9:289de1b6d378 113 pc.printf("\n[r]: Start Read Test. At least execute [w] onece");
mimi3 9:289de1b6d378 114 pc.printf("\n[w]: Start Write and Read Test");
mimi3 9:289de1b6d378 115 pc.printf("\nWriting is very slow, wait tens of seconds.");
mimi3 9:289de1b6d378 116 pc.printf("\n-- Select [r] or [w] --\n");
mimi3 9:289de1b6d378 117 fflush(stdout);
mimi3 9:289de1b6d378 118 while(!pc.readable());
mimi3 9:289de1b6d378 119 char ch = pc.getc();
mimi3 9:289de1b6d378 120 if( ch =='r' ){
mimi3 9:289de1b6d378 121 readTest();
mimi3 9:289de1b6d378 122 } else if( ch =='w' ){
mimi3 9:289de1b6d378 123 writeTest();
mimi3 9:289de1b6d378 124 readTest();
mimi3 9:289de1b6d378 125 }
mimi3 9:289de1b6d378 126 }
mimi3 0:8f297fe0c66a 127 }
mimi3 5:fef1667b832e 128