microSD Card control function for DISCO-F769NI based on BD_SD_DISCO_F746NG library by Roy Krikke

Dependencies:   BD_SD_DISCO_F769NI BSP_DISCO_F769NI

Fork of DISCO-F746NG_BLOCK_DEVICE_WITH_FAT_FILESYSTEM_ON_SDCARD by Roy Krikke

Please refer following my Notebook page.
/users/kenjiArai/notebook/sd-card-control-new/#

Committer:
kenjiArai
Date:
Thu Jan 14 00:40:36 2021 +0000
Revision:
8:12621f1fcbbe
Parent:
7:e7767b779c8c
run on mbed-os6.6.0

Who changed what in which revision?

UserRevisionLine numberNew contents of line
kenjiArai 4:0f7797c2d3fe 1 /*
kenjiArai 4:0f7797c2d3fe 2 * Mbed Application program
kenjiArai 8:12621f1fcbbe 3 * SD Card file control function with FatFs on Mbed-os6
roykrikke 3:7f991a3d4e71 4 *
kenjiArai 8:12621f1fcbbe 5 * Copyright (c) 2018,'19,'20,'21 Kenji Arai / JH1PJL
kenjiArai 7:e7767b779c8c 6 * http://www7b.biglobe.ne.jp/~kenjia/
kenjiArai 4:0f7797c2d3fe 7 * https://os.mbed.com/users/kenjiArai/
kenjiArai 4:0f7797c2d3fe 8 * Created: April 7th, 2018
kenjiArai 8:12621f1fcbbe 9 * Revised: January 14th, 2021
roykrikke 1:ffacc9d0b308 10 */
roykrikke 1:ffacc9d0b308 11
kenjiArai 4:0f7797c2d3fe 12 // Include --------------------------------------------------------------------
kenjiArai 4:0f7797c2d3fe 13 #include "mbed.h"
kenjiArai 4:0f7797c2d3fe 14 #include "FATFileSystem.h"
kenjiArai 4:0f7797c2d3fe 15 #include "SDBlockDeviceDISCOF769NI.h"
kenjiArai 4:0f7797c2d3fe 16 #include "mon.h"
kenjiArai 8:12621f1fcbbe 17 #include "uart_as_stdio.h"
roykrikke 0:4cdf28a602a8 18
kenjiArai 4:0f7797c2d3fe 19 // Definition -----------------------------------------------------------------
kenjiArai 4:0f7797c2d3fe 20 #define USER_SW_ON 1
kenjiArai 8:12621f1fcbbe 21 //#define LOOP_TIME 25 // 25mS
kenjiArai 8:12621f1fcbbe 22 #define LOOP_TIME 150 // 150mS
kenjiArai 7:e7767b779c8c 23
kenjiArai 7:e7767b779c8c 24 #define DEBUG 0
kenjiArai 7:e7767b779c8c 25
kenjiArai 7:e7767b779c8c 26 #if DEBUG
kenjiArai 8:12621f1fcbbe 27 #define DBG(...) printf(__VA_ARGS__)
kenjiArai 7:e7767b779c8c 28 #else
kenjiArai 7:e7767b779c8c 29 #define DBG(...) {;}
kenjiArai 7:e7767b779c8c 30 #endif
roykrikke 0:4cdf28a602a8 31
kenjiArai 4:0f7797c2d3fe 32 // Constructor ----------------------------------------------------------------
kenjiArai 4:0f7797c2d3fe 33 DigitalOut led(LED1);
kenjiArai 4:0f7797c2d3fe 34 DigitalIn user_sw(USER_BUTTON);
kenjiArai 4:0f7797c2d3fe 35 // Instantiate the Block Device for sd card on DISCO-F769NI
kenjiArai 4:0f7797c2d3fe 36 SDBlockDeviceDISCOF769NI bd;
kenjiArai 4:0f7797c2d3fe 37 FATFileSystem fs("fs");
kenjiArai 7:e7767b779c8c 38 Timer tmr;
roykrikke 2:993735af824b 39
kenjiArai 4:0f7797c2d3fe 40 // RAM ------------------------------------------------------------------------
kenjiArai 4:0f7797c2d3fe 41
kenjiArai 4:0f7797c2d3fe 42 // ROM / Constant data --------------------------------------------------------
kenjiArai 7:e7767b779c8c 43 const char *const opening_msg0 = "microSD Card test program";
kenjiArai 8:12621f1fcbbe 44 const char *const opening_msg1 = " -> run on Mbed OS-6\r\n";
kenjiArai 7:e7767b779c8c 45 const char *const opening_msg2 = "microSD Card is ready for use\r\n";
kenjiArai 7:e7767b779c8c 46 const char *const opening_msg3 = "Please hit any key to start!\r\n";
roykrikke 2:993735af824b 47
kenjiArai 4:0f7797c2d3fe 48 // Function prototypes --------------------------------------------------------
kenjiArai 4:0f7797c2d3fe 49 void return_error (int ret_val);
kenjiArai 4:0f7797c2d3fe 50 void errno_error (void* ret_val);
kenjiArai 7:e7767b779c8c 51 extern void print_revision(void);
roykrikke 0:4cdf28a602a8 52
kenjiArai 4:0f7797c2d3fe 53 //------------------------------------------------------------------------------
kenjiArai 4:0f7797c2d3fe 54 // Control Program
kenjiArai 4:0f7797c2d3fe 55 //------------------------------------------------------------------------------
kenjiArai 4:0f7797c2d3fe 56 int main()
roykrikke 3:7f991a3d4e71 57 {
kenjiArai 4:0f7797c2d3fe 58 time_t seconds;
kenjiArai 4:0f7797c2d3fe 59 uint32_t data0 = 10000U;
kenjiArai 4:0f7797c2d3fe 60 uint32_t data1 = 20000U;
kenjiArai 4:0f7797c2d3fe 61 uint32_t data2 = 30000U;
kenjiArai 4:0f7797c2d3fe 62 uint32_t data3 = 40000U;
kenjiArai 4:0f7797c2d3fe 63 uint32_t data4 = 50000U;
kenjiArai 4:0f7797c2d3fe 64 uint32_t data5 = 60000U;
roykrikke 0:4cdf28a602a8 65
kenjiArai 8:12621f1fcbbe 66 printf("\r\n\r\n");
kenjiArai 7:e7767b779c8c 67 print_revision();
kenjiArai 7:e7767b779c8c 68 DBG("line:%d\r\n", __LINE__);
kenjiArai 8:12621f1fcbbe 69 printf("\r\nStart\r\n");
roykrikke 3:7f991a3d4e71 70 int error = 0;
kenjiArai 8:12621f1fcbbe 71 printf("Welcome to the filesystem example.\r\n");
kenjiArai 8:12621f1fcbbe 72 printf("Mounting the filesystem on \"/fs\". \r\n");
roykrikke 3:7f991a3d4e71 73 error = fs.mount(&bd);
roykrikke 3:7f991a3d4e71 74 return_error(error);
roykrikke 2:993735af824b 75
kenjiArai 4:0f7797c2d3fe 76 FILE* fp = fopen("/fs/mydata.txt", "a");
kenjiArai 4:0f7797c2d3fe 77 errno_error(fp);
kenjiArai 4:0f7797c2d3fe 78 if (fp != 0) {
kenjiArai 7:e7767b779c8c 79 DBG("line:%d\r\n", __LINE__);
kenjiArai 8:12621f1fcbbe 80 printf("%s%s", opening_msg0, opening_msg1);
kenjiArai 4:0f7797c2d3fe 81 fprintf(fp,"%s%s", opening_msg0, opening_msg1);
kenjiArai 8:12621f1fcbbe 82 printf("%s", opening_msg2);
kenjiArai 8:12621f1fcbbe 83 printf("File: mydata.txt\r\n");
kenjiArai 6:3c8b8e3cc0f8 84 fclose(fp);
kenjiArai 4:0f7797c2d3fe 85 } else {
kenjiArai 8:12621f1fcbbe 86 printf("ERROR\r\n");
roykrikke 3:7f991a3d4e71 87 }
kenjiArai 8:12621f1fcbbe 88 printf("%s", opening_msg3);
kenjiArai 8:12621f1fcbbe 89 while (readable() == 0) { ;}
kenjiArai 8:12621f1fcbbe 90 char c = getc(); // dummy read
kenjiArai 4:0f7797c2d3fe 91 while (true) {
kenjiArai 7:e7767b779c8c 92 DBG("line:%d\r\n", __LINE__);
kenjiArai 7:e7767b779c8c 93 tmr.reset();
kenjiArai 7:e7767b779c8c 94 tmr.start();
kenjiArai 8:12621f1fcbbe 95 float size_disk = get_disk_freespace() / (1024.0f * 1024.0f * 1024.0f);
kenjiArai 8:12621f1fcbbe 96 uint32_t size_file = get_data_file_size("mydata.txt") / 1024;
kenjiArai 8:12621f1fcbbe 97 printf(", free disk: %.3f GB, file: %u kB, ", size_disk, size_file);
kenjiArai 4:0f7797c2d3fe 98 fp = fopen("/fs/mydata.txt", "a");
kenjiArai 4:0f7797c2d3fe 99 if(fp != 0) {
kenjiArai 4:0f7797c2d3fe 100 char tmp[64];
kenjiArai 7:e7767b779c8c 101 DBG("line:%d\r\n", __LINE__);
kenjiArai 4:0f7797c2d3fe 102 seconds = time(NULL);
kenjiArai 4:0f7797c2d3fe 103 strftime(tmp, 64, "DATE %H:%M:%S,%Y/%m/%d,", localtime(&seconds));
kenjiArai 8:12621f1fcbbe 104 printf("%s", tmp);
kenjiArai 4:0f7797c2d3fe 105 fprintf(fp, "%s", tmp);
kenjiArai 8:12621f1fcbbe 106 printf("%08d;%08d;%08d;%08d;%08d;%08d\r\n",
kenjiArai 8:12621f1fcbbe 107 ++data0, ++data1, ++data2, ++data3, ++data4, ++data5);
kenjiArai 4:0f7797c2d3fe 108 fprintf(fp, "%08d;%08d;%08d;%08d;%08d;%08d\r\n",
kenjiArai 8:12621f1fcbbe 109 data0, data1, data2, data3, data4, data5);
kenjiArai 6:3c8b8e3cc0f8 110 fclose(fp);
kenjiArai 4:0f7797c2d3fe 111 } else {
kenjiArai 8:12621f1fcbbe 112 printf("ERROR\r\n");
kenjiArai 4:0f7797c2d3fe 113 }
kenjiArai 8:12621f1fcbbe 114 uint32_t time_sd = chrono::duration_cast<chrono::milliseconds>(
kenjiArai 8:12621f1fcbbe 115 tmr.elapsed_time()).count();
kenjiArai 8:12621f1fcbbe 116 printf("time:%3d ", time_sd);
kenjiArai 8:12621f1fcbbe 117 if (time_sd < LOOP_TIME -2) {
kenjiArai 8:12621f1fcbbe 118 ThisThread::sleep_for(chrono::milliseconds(LOOP_TIME - time_sd));
kenjiArai 7:e7767b779c8c 119 }
kenjiArai 4:0f7797c2d3fe 120 if (user_sw == USER_SW_ON) {
kenjiArai 7:e7767b779c8c 121 DBG("line:%d\r\n", __LINE__);
kenjiArai 4:0f7797c2d3fe 122 break;
kenjiArai 4:0f7797c2d3fe 123 }
kenjiArai 8:12621f1fcbbe 124 if (readable()) {
kenjiArai 4:0f7797c2d3fe 125 mon();
kenjiArai 4:0f7797c2d3fe 126 }
kenjiArai 4:0f7797c2d3fe 127 led = !led;
roykrikke 3:7f991a3d4e71 128 }
roykrikke 3:7f991a3d4e71 129 while(true) {
kenjiArai 4:0f7797c2d3fe 130 mon();
kenjiArai 6:3c8b8e3cc0f8 131 system_reset();
roykrikke 3:7f991a3d4e71 132 }
roykrikke 0:4cdf28a602a8 133 }
kenjiArai 4:0f7797c2d3fe 134
kenjiArai 4:0f7797c2d3fe 135 void return_error (int ret_val)
kenjiArai 4:0f7797c2d3fe 136 {
kenjiArai 4:0f7797c2d3fe 137 if (ret_val) {
kenjiArai 8:12621f1fcbbe 138 printf("retrun error/Failure. %d\r\n", ret_val);
kenjiArai 4:0f7797c2d3fe 139 }
kenjiArai 4:0f7797c2d3fe 140 }
kenjiArai 4:0f7797c2d3fe 141
kenjiArai 4:0f7797c2d3fe 142 void errno_error (void* ret_val)
kenjiArai 4:0f7797c2d3fe 143 {
kenjiArai 4:0f7797c2d3fe 144 if (ret_val == NULL) {
kenjiArai 8:12621f1fcbbe 145 printf("error #/Failure. %d \r\n", errno);
kenjiArai 4:0f7797c2d3fe 146 }
kenjiArai 4:0f7797c2d3fe 147 }