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
NUCLEO-L152RE
About 1MBytes/sec
main.cpp@9:289de1b6d378, 2016-02-20 (annotated)
- Committer:
- mimi3
- Date:
- Sat Feb 20 13:57:35 2016 +0900
- Revision:
- 9:289de1b6d378
- Parent:
- 5:fef1667b832e
- Child:
- 10:5f6fc7dc119b
Separated: main.cpp and spi_device.h
Who changed what in which revision?
User | Revision | Line number | New 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 | 9:289de1b6d378 | 21 | #include "spi_device.h" |
mimi3 | 9:289de1b6d378 | 22 | |
mimi3 | 3:8b77055a68ec | 23 | #define UART_KEY_PRESS 1 |
mimi3 | 3:8b77055a68ec | 24 | |
mimi3 | 9:289de1b6d378 | 25 | #define SPI_CLOCK_HZ ( 100 * 1000000 ) |
mimi3 | 0:8f297fe0c66a | 26 | Timer timer; |
mimi3 | 1:c39cfc31349d | 27 | Serial pc(USBTX,USBRX); |
mimi3 | 0:8f297fe0c66a | 28 | |
mimi3 | 3:8b77055a68ec | 29 | SDFileSystem sd( MOSI, MISO, SCLK, CS, "sd", SPI_CLOCK_HZ); |
mimi3 | 1:c39cfc31349d | 30 | |
mimi3 | 0:8f297fe0c66a | 31 | char buffer[512]; |
mimi3 | 0:8f297fe0c66a | 32 | #define X_MEGA_BYTE ((1)*1024*1024) /* 1Mbyte */ |
mimi3 | 0:8f297fe0c66a | 33 | #define FILE_NAME "GPATH" |
mimi3 | 2:f8bd763b5584 | 34 | void wait_key_press(){ |
mimi3 | 3:8b77055a68ec | 35 | #if UART_KEY_PRESS |
mimi3 | 9:289de1b6d378 | 36 | pc.printf("\n-- Select 'r' or 'w' --\n"); |
mimi3 | 3:8b77055a68ec | 37 | fflush(stdout); |
mimi3 | 2:f8bd763b5584 | 38 | while(!pc.readable()); |
mimi3 | 2:f8bd763b5584 | 39 | volatile int res = pc.getc(); |
mimi3 | 3:8b77055a68ec | 40 | #else |
mimi3 | 0:8f297fe0c66a | 41 | |
mimi3 | 3:8b77055a68ec | 42 | #endif |
mimi3 | 0:8f297fe0c66a | 43 | } |
mimi3 | 0:8f297fe0c66a | 44 | |
mimi3 | 0:8f297fe0c66a | 45 | void writeTest() |
mimi3 | 0:8f297fe0c66a | 46 | { |
mimi3 | 0:8f297fe0c66a | 47 | //Test write performance by creating a 1MB file |
mimi3 | 9:289de1b6d378 | 48 | pc.printf("[Write]: Testing %dByte buffer: write performance...", sizeof(buffer)); |
mimi3 | 3:8b77055a68ec | 49 | fflush(stdout); |
mimi3 | 0:8f297fe0c66a | 50 | FileHandle* file = sd.open(FILE_NAME, O_WRONLY | O_CREAT | O_TRUNC); |
mimi3 | 0:8f297fe0c66a | 51 | if (file != NULL) { |
mimi3 | 0:8f297fe0c66a | 52 | timer.start(); |
mimi3 | 0:8f297fe0c66a | 53 | for (uint32_t i = 0; i < (X_MEGA_BYTE / sizeof(buffer)); i++) { |
mimi3 | 0:8f297fe0c66a | 54 | if (file->write(buffer, sizeof(buffer)) != sizeof(buffer)) { |
mimi3 | 0:8f297fe0c66a | 55 | timer.stop(); |
mimi3 | 9:289de1b6d378 | 56 | pc.printf("write error!\n"); |
mimi3 | 0:8f297fe0c66a | 57 | timer.reset(); |
mimi3 | 0:8f297fe0c66a | 58 | return; |
mimi3 | 0:8f297fe0c66a | 59 | } |
mimi3 | 0:8f297fe0c66a | 60 | } |
mimi3 | 0:8f297fe0c66a | 61 | timer.stop(); |
mimi3 | 0:8f297fe0c66a | 62 | if (file->close()) |
mimi3 | 9:289de1b6d378 | 63 | pc.printf("failed to close file!\n"); |
mimi3 | 0:8f297fe0c66a | 64 | else{ |
mimi3 | 9:289de1b6d378 | 65 | pc.printf("done!\n\tResult: %d KB/s\n", ( 1024 * 1000000 ) / timer.read_us() ); |
mimi3 | 0:8f297fe0c66a | 66 | } |
mimi3 | 0:8f297fe0c66a | 67 | timer.reset(); |
mimi3 | 0:8f297fe0c66a | 68 | } else { |
mimi3 | 9:289de1b6d378 | 69 | pc.printf("failed to create file!\n"); |
mimi3 | 0:8f297fe0c66a | 70 | } |
mimi3 | 0:8f297fe0c66a | 71 | } |
mimi3 | 0:8f297fe0c66a | 72 | |
mimi3 | 0:8f297fe0c66a | 73 | |
mimi3 | 0:8f297fe0c66a | 74 | void readTest() |
mimi3 | 0:8f297fe0c66a | 75 | { |
mimi3 | 0:8f297fe0c66a | 76 | //Test read performance by reading the 1MB file created by writeTest() |
mimi3 | 9:289de1b6d378 | 77 | pc.printf("[Read]: Testing %dByte buffer: read performance...", sizeof(buffer)); |
mimi3 | 3:8b77055a68ec | 78 | fflush(stdout); |
mimi3 | 0:8f297fe0c66a | 79 | FileHandle* file = sd.open(FILE_NAME, O_RDONLY); |
mimi3 | 0:8f297fe0c66a | 80 | if (file != NULL) { |
mimi3 | 0:8f297fe0c66a | 81 | timer.start(); |
mimi3 | 0:8f297fe0c66a | 82 | int iterations = 0; |
mimi3 | 0:8f297fe0c66a | 83 | while (file->read(buffer, sizeof(buffer)) == sizeof(buffer)) |
mimi3 | 0:8f297fe0c66a | 84 | iterations++; |
mimi3 | 0:8f297fe0c66a | 85 | timer.stop(); |
mimi3 | 0:8f297fe0c66a | 86 | if (iterations != (X_MEGA_BYTE / sizeof(buffer))){ |
mimi3 | 9:289de1b6d378 | 87 | pc.printf("read error!\n"); |
mimi3 | 0:8f297fe0c66a | 88 | } |
mimi3 | 0:8f297fe0c66a | 89 | else if (file->close()){ |
mimi3 | 9:289de1b6d378 | 90 | pc.printf("failed to close file!\n"); |
mimi3 | 0:8f297fe0c66a | 91 | } |
mimi3 | 0:8f297fe0c66a | 92 | // else if (sd.remove(FILE_NAME)) |
mimi3 | 9:289de1b6d378 | 93 | // pc.printf("failed to delete file!\n"); |
mimi3 | 0:8f297fe0c66a | 94 | else{ |
mimi3 | 9:289de1b6d378 | 95 | pc.printf("done!\n\tResult: %d KB/s\n", ( 1024 * 1000000 ) / timer.read_us()); |
mimi3 | 0:8f297fe0c66a | 96 | } |
mimi3 | 0:8f297fe0c66a | 97 | timer.reset(); |
mimi3 | 0:8f297fe0c66a | 98 | } else { |
mimi3 | 9:289de1b6d378 | 99 | pc.printf("failed to open file!\n"); |
mimi3 | 0:8f297fe0c66a | 100 | } |
mimi3 | 0:8f297fe0c66a | 101 | } |
mimi3 | 0:8f297fe0c66a | 102 | |
mimi3 | 0:8f297fe0c66a | 103 | int main(){ |
mimi3 | 0:8f297fe0c66a | 104 | /* UART Baudrate is 9600bps*/ |
mimi3 | 9:289de1b6d378 | 105 | while(1){ |
mimi3 | 9:289de1b6d378 | 106 | pc.printf("\nSysClock= %d Hz", SystemCoreClock); |
mimi3 | 9:289de1b6d378 | 107 | pc.printf(" mbed rev.%d", MBED_LIBRARY_VERSION); |
mimi3 | 9:289de1b6d378 | 108 | pc.printf("\nStart SD card accsess test!"); |
mimi3 | 9:289de1b6d378 | 109 | pc.printf("\n SPI(%d) device",SPI_DEV); |
mimi3 | 9:289de1b6d378 | 110 | pc.printf("\n[r]: Start Read Test. At least execute [w] onece"); |
mimi3 | 9:289de1b6d378 | 111 | pc.printf("\n[w]: Start Write and Read Test"); |
mimi3 | 9:289de1b6d378 | 112 | pc.printf("\nWriting is very slow, wait tens of seconds."); |
mimi3 | 9:289de1b6d378 | 113 | pc.printf("\n-- Select [r] or [w] --\n"); |
mimi3 | 9:289de1b6d378 | 114 | fflush(stdout); |
mimi3 | 9:289de1b6d378 | 115 | while(!pc.readable()); |
mimi3 | 9:289de1b6d378 | 116 | char ch = pc.getc(); |
mimi3 | 9:289de1b6d378 | 117 | if( ch =='r' ){ |
mimi3 | 9:289de1b6d378 | 118 | readTest(); |
mimi3 | 9:289de1b6d378 | 119 | } else if( ch =='w' ){ |
mimi3 | 9:289de1b6d378 | 120 | writeTest(); |
mimi3 | 9:289de1b6d378 | 121 | readTest(); |
mimi3 | 9:289de1b6d378 | 122 | } |
mimi3 | 9:289de1b6d378 | 123 | } |
mimi3 | 0:8f297fe0c66a | 124 | } |
mimi3 | 5:fef1667b832e | 125 |