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