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@0:8f297fe0c66a, 2016-02-12 (annotated)
- Committer:
- mimi3
- Date:
- Fri Feb 12 13:55:01 2016 +0000
- Revision:
- 0:8f297fe0c66a
- Child:
- 1:c39cfc31349d
first push
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 | 0:8f297fe0c66a | 11 | |
mimi3 | 0:8f297fe0c66a | 12 | SDFileSystem sd( MOSI, MISO, SCLK, CS, "sd"); |
mimi3 | 0:8f297fe0c66a | 13 | //SDFileSystem sd(p5, p6, p7, p8, "sd"); // the pinout on the mbed Cool Components workshop board |
mimi3 | 0:8f297fe0c66a | 14 | DigitalIn button(USER_BUTTON, PullUp); |
mimi3 | 0:8f297fe0c66a | 15 | |
mimi3 | 0:8f297fe0c66a | 16 | char buffer[512]; |
mimi3 | 0:8f297fe0c66a | 17 | #define X_MEGA_BYTE ((1)*1024*1024) /* 1Mbyte */ |
mimi3 | 0:8f297fe0c66a | 18 | #define FILE_NAME "GPATH" |
mimi3 | 0:8f297fe0c66a | 19 | |
mimi3 | 0:8f297fe0c66a | 20 | int base_test() { |
mimi3 | 0:8f297fe0c66a | 21 | |
mimi3 | 0:8f297fe0c66a | 22 | printf("Hello World!\n"); |
mimi3 | 0:8f297fe0c66a | 23 | while(button); |
mimi3 | 0:8f297fe0c66a | 24 | |
mimi3 | 0:8f297fe0c66a | 25 | mkdir("/sd/mydirx", 0777); |
mimi3 | 0:8f297fe0c66a | 26 | |
mimi3 | 0:8f297fe0c66a | 27 | FILE *fp = fopen("/sd/mydirx/sdtest.txt", "w"); |
mimi3 | 0:8f297fe0c66a | 28 | if(fp == NULL) { |
mimi3 | 0:8f297fe0c66a | 29 | error("Could not open file for write\n"); |
mimi3 | 0:8f297fe0c66a | 30 | } |
mimi3 | 0:8f297fe0c66a | 31 | fprintf(fp, "Hello fun SD Card World!"); |
mimi3 | 0:8f297fe0c66a | 32 | fclose(fp); |
mimi3 | 0:8f297fe0c66a | 33 | |
mimi3 | 0:8f297fe0c66a | 34 | printf("Goodbye World!\n"); |
mimi3 | 0:8f297fe0c66a | 35 | return 0; |
mimi3 | 0:8f297fe0c66a | 36 | } |
mimi3 | 0:8f297fe0c66a | 37 | |
mimi3 | 0:8f297fe0c66a | 38 | void writeTest() |
mimi3 | 0:8f297fe0c66a | 39 | { |
mimi3 | 0:8f297fe0c66a | 40 | //Test write performance by creating a 1MB file |
mimi3 | 0:8f297fe0c66a | 41 | printf("Testing %dByte buffer: write performance...", sizeof(buffer)); |
mimi3 | 0:8f297fe0c66a | 42 | FileHandle* file = sd.open(FILE_NAME, O_WRONLY | O_CREAT | O_TRUNC); |
mimi3 | 0:8f297fe0c66a | 43 | if (file != NULL) { |
mimi3 | 0:8f297fe0c66a | 44 | timer.start(); |
mimi3 | 0:8f297fe0c66a | 45 | for (uint32_t i = 0; i < (X_MEGA_BYTE / sizeof(buffer)); i++) { |
mimi3 | 0:8f297fe0c66a | 46 | if (file->write(buffer, sizeof(buffer)) != sizeof(buffer)) { |
mimi3 | 0:8f297fe0c66a | 47 | timer.stop(); |
mimi3 | 0:8f297fe0c66a | 48 | printf("write error!\n"); |
mimi3 | 0:8f297fe0c66a | 49 | timer.reset(); |
mimi3 | 0:8f297fe0c66a | 50 | return; |
mimi3 | 0:8f297fe0c66a | 51 | } |
mimi3 | 0:8f297fe0c66a | 52 | } |
mimi3 | 0:8f297fe0c66a | 53 | timer.stop(); |
mimi3 | 0:8f297fe0c66a | 54 | if (file->close()) |
mimi3 | 0:8f297fe0c66a | 55 | printf("failed to close file!\n"); |
mimi3 | 0:8f297fe0c66a | 56 | else{ |
mimi3 | 0:8f297fe0c66a | 57 | printf("done!\n\tResult: %d KB/s\n", ( 1024 * 1000000 ) / timer.read_us() ); |
mimi3 | 0:8f297fe0c66a | 58 | } |
mimi3 | 0:8f297fe0c66a | 59 | timer.reset(); |
mimi3 | 0:8f297fe0c66a | 60 | } else { |
mimi3 | 0:8f297fe0c66a | 61 | printf("failed to create file!\n"); |
mimi3 | 0:8f297fe0c66a | 62 | } |
mimi3 | 0:8f297fe0c66a | 63 | } |
mimi3 | 0:8f297fe0c66a | 64 | |
mimi3 | 0:8f297fe0c66a | 65 | |
mimi3 | 0:8f297fe0c66a | 66 | void readTest() |
mimi3 | 0:8f297fe0c66a | 67 | { |
mimi3 | 0:8f297fe0c66a | 68 | //Test read performance by reading the 1MB file created by writeTest() |
mimi3 | 0:8f297fe0c66a | 69 | printf("Testing %dByte buffer: read performance...", sizeof(buffer)); |
mimi3 | 0:8f297fe0c66a | 70 | FileHandle* file = sd.open(FILE_NAME, O_RDONLY); |
mimi3 | 0:8f297fe0c66a | 71 | if (file != NULL) { |
mimi3 | 0:8f297fe0c66a | 72 | timer.start(); |
mimi3 | 0:8f297fe0c66a | 73 | int iterations = 0; |
mimi3 | 0:8f297fe0c66a | 74 | while (file->read(buffer, sizeof(buffer)) == sizeof(buffer)) |
mimi3 | 0:8f297fe0c66a | 75 | iterations++; |
mimi3 | 0:8f297fe0c66a | 76 | timer.stop(); |
mimi3 | 0:8f297fe0c66a | 77 | if (iterations != (X_MEGA_BYTE / sizeof(buffer))){ |
mimi3 | 0:8f297fe0c66a | 78 | printf("read error!\n"); |
mimi3 | 0:8f297fe0c66a | 79 | } |
mimi3 | 0:8f297fe0c66a | 80 | else if (file->close()){ |
mimi3 | 0:8f297fe0c66a | 81 | printf("failed to close file!\n"); |
mimi3 | 0:8f297fe0c66a | 82 | } |
mimi3 | 0:8f297fe0c66a | 83 | // else if (sd.remove(FILE_NAME)) |
mimi3 | 0:8f297fe0c66a | 84 | // printf("failed to delete file!\n"); |
mimi3 | 0:8f297fe0c66a | 85 | else{ |
mimi3 | 0:8f297fe0c66a | 86 | printf("done!\n\tResult: %d KB/s\n", ( 1024 * 1000000 ) / timer.read_us()); |
mimi3 | 0:8f297fe0c66a | 87 | } |
mimi3 | 0:8f297fe0c66a | 88 | timer.reset(); |
mimi3 | 0:8f297fe0c66a | 89 | } else { |
mimi3 | 0:8f297fe0c66a | 90 | printf("failed to open file!\n"); |
mimi3 | 0:8f297fe0c66a | 91 | } |
mimi3 | 0:8f297fe0c66a | 92 | } |
mimi3 | 0:8f297fe0c66a | 93 | |
mimi3 | 0:8f297fe0c66a | 94 | int main(){ |
mimi3 | 0:8f297fe0c66a | 95 | /* UART Baudrate is 9600bps*/ |
mimi3 | 0:8f297fe0c66a | 96 | while(1){ |
mimi3 | 0:8f297fe0c66a | 97 | printf("\nStart SD card accsess test! -- Press button"); |
mimi3 | 0:8f297fe0c66a | 98 | printf("\nWriting is very slow, wait several minuts.\n"); |
mimi3 | 0:8f297fe0c66a | 99 | while(button); |
mimi3 | 0:8f297fe0c66a | 100 | writeTest(); |
mimi3 | 0:8f297fe0c66a | 101 | readTest(); |
mimi3 | 0:8f297fe0c66a | 102 | } |
mimi3 | 0:8f297fe0c66a | 103 | } |