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@2:f8bd763b5584, 2016-02-12 (annotated)
- 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?
User | Revision | Line number | New 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 | } |