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:
Tue Feb 23 21:25:22 2016 +0900
Revision:
12:dfa39c797789
Parent:
11:d5fc11ac948a
Child:
18:5fb42182d85d
added: Read verify test.

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 12:dfa39c797789 30 //Serial pc(PA_9,PA_10);
mimi3 1:c39cfc31349d 31 Serial pc(USBTX,USBRX);
mimi3 0:8f297fe0c66a 32
mimi3 3:8b77055a68ec 33 SDFileSystem sd( MOSI, MISO, SCLK, CS, "sd", SPI_CLOCK_HZ);
mimi3 1:c39cfc31349d 34
mimi3 12:dfa39c797789 35 //char buffer[512*1] __attribute__ ((aligned (4))) ; /* 512 byte */
mimi3 12:dfa39c797789 36 //char buffer[512*2] __attribute__ ((aligned (4))) ; /* 1024 byte */
mimi3 12:dfa39c797789 37 char buffer[512*4] __attribute__ ((aligned (4))) ; /* 2028 byte */
mimi3 12:dfa39c797789 38 //char buffer[512*8] __attribute__ ((aligned (4))) ; /* 4096 byte */
mimi3 12:dfa39c797789 39 //char buffer[512*16] __attribute__ ((aligned (4))) ; /* 8192 byte */
mimi3 12:dfa39c797789 40 //char buffer[512*32] __attribute__ ((aligned (4))) ; /* 16384 byte */
mimi3 12:dfa39c797789 41
mimi3 0:8f297fe0c66a 42 #define X_MEGA_BYTE ((1)*1024*1024) /* 1Mbyte */
mimi3 0:8f297fe0c66a 43 #define FILE_NAME "GPATH"
mimi3 2:f8bd763b5584 44 void wait_key_press(){
mimi3 3:8b77055a68ec 45 #if UART_KEY_PRESS
mimi3 12:dfa39c797789 46 pc.printf("\n-- Select 'r' or 'w' --\n");
mimi3 12:dfa39c797789 47 fflush(stdout);
mimi3 12:dfa39c797789 48 while(!pc.readable());
mimi3 12:dfa39c797789 49 volatile int res = pc.getc();
mimi3 3:8b77055a68ec 50 #else
mimi3 0:8f297fe0c66a 51
mimi3 3:8b77055a68ec 52 #endif
mimi3 0:8f297fe0c66a 53 }
mimi3 0:8f297fe0c66a 54
mimi3 0:8f297fe0c66a 55 void writeTest()
mimi3 0:8f297fe0c66a 56 {
mimi3 12:dfa39c797789 57 //Test write performance by creating a 1MB file
mimi3 12:dfa39c797789 58 pc.printf("[Write]: Testing %d byte buffer: write performance...", sizeof(buffer));
mimi3 12:dfa39c797789 59 fflush(stdout);
mimi3 12:dfa39c797789 60 for(uint32_t k = 0; k < sizeof(buffer); k++){
mimi3 12:dfa39c797789 61 buffer[k] = k & 0xff;
mimi3 12:dfa39c797789 62 }
mimi3 12:dfa39c797789 63
mimi3 12:dfa39c797789 64 FileHandle* file = sd.open(FILE_NAME, O_WRONLY | O_CREAT | O_TRUNC);
mimi3 12:dfa39c797789 65 if (file != NULL) {
mimi3 12:dfa39c797789 66 timer.start();
mimi3 12:dfa39c797789 67 for (uint32_t i = 0; i < (X_MEGA_BYTE / sizeof(buffer)); i++) {
mimi3 12:dfa39c797789 68 if (file->write(buffer, sizeof(buffer)) != sizeof(buffer)) {
mimi3 12:dfa39c797789 69 timer.stop();
mimi3 12:dfa39c797789 70 pc.printf("write error!\n");
mimi3 12:dfa39c797789 71 timer.reset();
mimi3 12:dfa39c797789 72 return;
mimi3 12:dfa39c797789 73 }
mimi3 12:dfa39c797789 74 }
mimi3 12:dfa39c797789 75 timer.stop();
mimi3 12:dfa39c797789 76 if (file->close())
mimi3 12:dfa39c797789 77 pc.printf("failed to close file!\n");
mimi3 12:dfa39c797789 78 else{
mimi3 12:dfa39c797789 79 pc.printf("done!\n\tResult: %d KB/s\n", ( 1024 * 1000000 ) / timer.read_us() );
mimi3 12:dfa39c797789 80 }
mimi3 12:dfa39c797789 81 timer.reset();
mimi3 12:dfa39c797789 82 } else {
mimi3 12:dfa39c797789 83 pc.printf("failed to create file!\n");
mimi3 12:dfa39c797789 84 }
mimi3 0:8f297fe0c66a 85 }
mimi3 0:8f297fe0c66a 86
mimi3 0:8f297fe0c66a 87 void readTest()
mimi3 0:8f297fe0c66a 88 {
mimi3 12:dfa39c797789 89 //Test read performance by reading the 1MB file created by writeTest()
mimi3 12:dfa39c797789 90 pc.printf("[Read]: Testing %d byte buffer: read performance...", sizeof(buffer));
mimi3 12:dfa39c797789 91 fflush(stdout);
mimi3 12:dfa39c797789 92 FileHandle* file = sd.open(FILE_NAME, O_RDONLY);
mimi3 12:dfa39c797789 93 if (file != NULL) {
mimi3 12:dfa39c797789 94 timer.start();
mimi3 12:dfa39c797789 95 int iterations = 0;
mimi3 12:dfa39c797789 96 while (file->read(buffer, sizeof(buffer)) == sizeof(buffer)){
mimi3 12:dfa39c797789 97 iterations++;
mimi3 12:dfa39c797789 98 }
mimi3 12:dfa39c797789 99 timer.stop();
mimi3 12:dfa39c797789 100 if (iterations != (X_MEGA_BYTE / sizeof(buffer))){
mimi3 12:dfa39c797789 101 pc.printf("read error!\n");
mimi3 12:dfa39c797789 102 }
mimi3 12:dfa39c797789 103 else if (file->close()){
mimi3 12:dfa39c797789 104 pc.printf("failed to close file!\n");
mimi3 12:dfa39c797789 105 }
mimi3 12:dfa39c797789 106 // else if (sd.remove(FILE_NAME))
mimi3 12:dfa39c797789 107 // pc.printf("failed to delete file!\n");
mimi3 12:dfa39c797789 108 else{
mimi3 12:dfa39c797789 109 pc.printf("done!\n\tResult: %d KB/s\n", ( 1024 * 1000000 ) / timer.read_us());
mimi3 12:dfa39c797789 110 }
mimi3 12:dfa39c797789 111 timer.reset();
mimi3 12:dfa39c797789 112 } else {
mimi3 12:dfa39c797789 113 pc.printf("failed to open file!\n");
mimi3 12:dfa39c797789 114 }
mimi3 12:dfa39c797789 115 }
mimi3 12:dfa39c797789 116
mimi3 12:dfa39c797789 117 void verifyTest()
mimi3 12:dfa39c797789 118 {
mimi3 12:dfa39c797789 119 int errorCount = 0;
mimi3 12:dfa39c797789 120 //Test read performance by reading the 1MB file created by writeTest()
mimi3 12:dfa39c797789 121 pc.printf("[Read]: Verifying %d byte buffer ...", sizeof(buffer));
mimi3 12:dfa39c797789 122 fflush(stdout);
mimi3 12:dfa39c797789 123 FileHandle* file = sd.open(FILE_NAME, O_RDONLY);
mimi3 12:dfa39c797789 124 if (file != NULL) {
mimi3 12:dfa39c797789 125 timer.start();
mimi3 12:dfa39c797789 126 int iterations = 0;
mimi3 12:dfa39c797789 127 while (file->read(buffer, sizeof(buffer)) == sizeof(buffer)){
mimi3 12:dfa39c797789 128 iterations++;
mimi3 12:dfa39c797789 129 for(uint32_t k = 0; k < sizeof(buffer); k++){
mimi3 12:dfa39c797789 130 if ( buffer[k] != (k & 0xff) ){
mimi3 12:dfa39c797789 131 errorCount++;
mimi3 12:dfa39c797789 132 }
mimi3 12:dfa39c797789 133 }
mimi3 12:dfa39c797789 134 }
mimi3 12:dfa39c797789 135 timer.stop();
mimi3 12:dfa39c797789 136 if (iterations != (X_MEGA_BYTE / sizeof(buffer))){
mimi3 12:dfa39c797789 137 pc.printf("read error!\n");
mimi3 12:dfa39c797789 138 }
mimi3 12:dfa39c797789 139 else if (file->close()){
mimi3 12:dfa39c797789 140 pc.printf("failed to close file!\n");
mimi3 12:dfa39c797789 141 }
mimi3 12:dfa39c797789 142 // else if (sd.remove(FILE_NAME))
mimi3 12:dfa39c797789 143 // pc.printf("failed to delete file!\n");
mimi3 12:dfa39c797789 144 else{
mimi3 12:dfa39c797789 145 // pc.printf("done!\n\tResult: %d KB/s\n", ( 1024 * 1000000 ) / timer.read_us());
mimi3 12:dfa39c797789 146
mimi3 12:dfa39c797789 147 }
mimi3 12:dfa39c797789 148 timer.reset();
mimi3 12:dfa39c797789 149 } else {
mimi3 12:dfa39c797789 150 pc.printf("failed to open file!\n");
mimi3 12:dfa39c797789 151 }
mimi3 12:dfa39c797789 152 pc.printf("\n Error Count : %d", errorCount);
mimi3 0:8f297fe0c66a 153 }
mimi3 0:8f297fe0c66a 154
mimi3 0:8f297fe0c66a 155 int main(){
mimi3 12:dfa39c797789 156 /* UART Baudrate is 9600bps*/
mimi3 12:dfa39c797789 157 while(1){
mimi3 11:d5fc11ac948a 158 pc.printf("\n---------------------------------------");
mimi3 11:d5fc11ac948a 159 pc.printf("\nSPI(%d), SysClock= %d Hz",SPI_DEV, SystemCoreClock);
mimi3 9:289de1b6d378 160 pc.printf(" mbed rev.%d", MBED_LIBRARY_VERSION);
mimi3 12:dfa39c797789 161 pc.printf("\nStart SD card accsess test!");
mimi3 9:289de1b6d378 162 pc.printf("\n[r]: Start Read Test. At least execute [w] onece");
mimi3 9:289de1b6d378 163 pc.printf("\n[w]: Start Write and Read Test");
mimi3 12:dfa39c797789 164 pc.printf("\n[v]: Start Read Verify Test. At least execute [w] onece");
mimi3 12:dfa39c797789 165 pc.printf("\nWriting is very slow, wait tens of seconds.");
mimi3 9:289de1b6d378 166 pc.printf("\n-- Select [r] or [w] --\n");
mimi3 9:289de1b6d378 167 fflush(stdout);
mimi3 9:289de1b6d378 168 while(!pc.readable());
mimi3 9:289de1b6d378 169 char ch = pc.getc();
mimi3 9:289de1b6d378 170 if( ch =='r' ){
mimi3 9:289de1b6d378 171 readTest();
mimi3 9:289de1b6d378 172 } else if( ch =='w' ){
mimi3 12:dfa39c797789 173 writeTest();
mimi3 12:dfa39c797789 174 readTest();
mimi3 12:dfa39c797789 175 } else if( ch =='v' ){
mimi3 12:dfa39c797789 176 verifyTest();
mimi3 9:289de1b6d378 177 }
mimi3 12:dfa39c797789 178 }
mimi3 0:8f297fe0c66a 179 }
mimi3 5:fef1667b832e 180