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:
Sat May 02 03:43:51 2020 +0000
Revision:
7:e7767b779c8c
Parent:
6:3c8b8e3cc0f8
Child:
8:12621f1fcbbe
updated os5.changed starting process(wait key input)

Who changed what in which revision?

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