美文网首页
mbed嵌入式编程(三) SD卡驱动和FAT文件系统Demo

mbed嵌入式编程(三) SD卡驱动和FAT文件系统Demo

作者: 光均 | 来源:发表于2020-04-26 03:00 被阅读0次

    mbed嵌入式编程(三)SD卡驱动和Fat文件系统Demo
    电路板:STM32H743VI最小系统+SD卡扩展板; 编程环境:Arm Compiler V6.13.1(Keil mdk5.29)

    #include "mbed.h"
    #include <stdio.h>
    #include <errno.h>
    
    // Block devices
    //#include "SPIFBlockDevice.h"
    //#include "DataFlashBlockDevice.h"
    #include "SDBlockDevice.h"
    //#include "HeapBlockDevice.h"
    
    // File systems
    //#include "LittleFileSystem.h"
    #include "FATFileSystem.h"
    
    // Physical block device, can be any device that supports the BlockDevice API
    //SDBlockDevice   blockDevice(PA_0, PA_1, PA_2, PA_3);  // mosi, miso, sck, cs    m487
    SDBlockDevice   blockDevice(PC_12, PC_11, PC_10, PA_4);  // mosi, miso, sck, cs   h743
     
    // File system declaration
    FATFileSystem   fileSystem("fs");
    
    // Entry point for the example
    int main()
    {
        printf("--- Mbed OS filesystem example ---\n");
    
        // Try to mount the filesystem
        printf("Mounting the filesystem... ");
        fflush(stdout);
    
        int err = fileSystem.mount(&blockDevice);
        printf("%s\n", (err ? "Fail :(" : "OK"));
        if (err) {
            // Reformat if we can't mount the filesystem
            // this should only happen on the first boot
            printf("No filesystem found, formatting... ");
            fflush(stdout);
            err = fileSystem.reformat(&blockDevice);
            printf("%s\n", (err ? "Fail :(" : "OK"));
            if (err) {
                error("error: %s (%d)\n", strerror(-err), err);
            }
        }
    
        // Open the numbers file
        printf("Opening \"/fs/numbers.txt\"... ");
        fflush(stdout);
    
        FILE*   f = fopen("/fs/numbers.txt", "r+");
        printf("%s\n", (!f ? "Fail :(" : "OK"));
        if (!f) {
            // Create the numbers file if it doesn't exist
            printf("No file found, creating a new file... ");
            fflush(stdout);
            f = fopen("/fs/numbers.txt", "w+");
            printf("%s\n", (!f ? "Fail :(" : "OK"));
            if (!f) {
                error("error: %s (%d)\n", strerror(errno), -errno);
            }
    
            for (int i = 0; i < 10; i++) {
                printf("\rWriting numbers (%d/%d)... ", i, 10);
                fflush(stdout);
                err = fprintf(f, "    %d\n", i);
                if (err < 0) {
                    printf("Fail :(\n");
                    error("error: %s (%d)\n", strerror(errno), -errno);
                }
            }
    
            printf("\rWriting numbers (%d/%d)... OK\n", 10, 10);
    
            printf("Seeking file... ");
            fflush(stdout);
            err = fseek(f, 0, SEEK_SET);
            printf("%s\n", (err < 0 ? "Fail :(" : "OK"));
            if (err < 0) {
                error("error: %s (%d)\n", strerror(errno), -errno);
            }
        }
    
        // Go through and increment the numbers
        for (int i = 0; i < 10; i++) {
            printf("\rIncrementing numbers (%d/%d)... ", i, 10);
            fflush(stdout);
    
            // Get current stream position
            long    pos = ftell(f);
    
            // Parse out the number and increment
            int32_t number;
            fscanf(f, "%ld", &number);
            number += 1;
    
            // Seek to beginning of number
            fseek(f, pos, SEEK_SET);
    
            // Store number
            fprintf(f, "    %ld\n", number);
    
            // Flush between write and read on same file
            fflush(f);
        }
    
        printf("\rIncrementing numbers (%d/%d)... OK\n", 10, 10);
    
        // Close the file which also flushes any cached writes
        printf("Closing \"/fs/numbers.txt\"... ");
        fflush(stdout);
        err = fclose(f);
        printf("%s\n", (err < 0 ? "Fail :(" : "OK"));
        if (err < 0) {
            error("error: %s (%d)\n", strerror(errno), -errno);
        }
    
        // Display the root directory
        printf("Opening the root directory... ");
        fflush(stdout);
    
        DIR*    d = opendir("/fs/");
        printf("%s\n", (!d ? "Fail :(" : "OK"));
        if (!d) {
            error("error: %s (%d)\n", strerror(errno), -errno);
        }
    
        printf("root directory:\n");
        while (true) {
            struct dirent*  e = readdir(d);
            if (!e) {
                break;
            }
    
            printf("    %s\n", e->d_name);
        }
    
        printf("Closing the root directory... ");
        fflush(stdout);
        err = closedir(d);
        printf("%s\n", (err < 0 ? "Fail :(" : "OK"));
        if (err < 0) {
            error("error: %s (%d)\n", strerror(errno), -errno);
        }
    
        // Display the numbers file
        printf("Opening \"/fs/numbers.txt\"... ");
        fflush(stdout);
        f = fopen("/fs/numbers.txt", "r");
        printf("%s\n", (!f ? "Fail :(" : "OK"));
        if (!f) {
            error("error: %s (%d)\n", strerror(errno), -errno);
        }
    
        printf("numbers:\n");
        while (!feof(f)) {
            int c = fgetc(f);
            printf("%c", c);
        }
    
        printf("\rClosing \"/fs/numbers.txt\"... ");
        fflush(stdout);
        err = fclose(f);
        printf("%s\n", (err < 0 ? "Fail :(" : "OK"));
        if (err < 0) {
            error("error: %s (%d)\n", strerror(errno), -errno);
        }
    
        // Tidy up
        printf("Unmounting... ");
        fflush(stdout);
        err = fileSystem.unmount();
        printf("%s\n", (err < 0 ? "Fail :(" : "OK"));
        if (err < 0) {
            error("error: %s (%d)\n", strerror(-err), err);
        }
        
        printf("Initializing the block device... ");
        fflush(stdout);
    
        err = blockDevice.init();
        printf("%s\n", (err ? "Fail :(" : "OK"));
        if (err) {
            error("error: %s (%d)\n", strerror(-err), err);
        }
    
        printf("Erasing the block device... ");
        fflush(stdout);
        err = blockDevice.erase(0, blockDevice.size());
        printf("%s\n", (err ? "Fail :(" : "OK"));
        if (err) {
            error("error: %s (%d)\n", strerror(-err), err);
        }
    
        printf("Deinitializing the block device... ");
        fflush(stdout);
        err = blockDevice.deinit();
        printf("%s\n", (err ? "Fail :(" : "OK"));
        if (err) {
            error("error: %s (%d)\n", strerror(-err), err);
        }
        
        printf("\r\n");
        
        printf("Mbed OS filesystem example done!\n");
    }
    

    相关文章

      网友评论

          本文标题:mbed嵌入式编程(三) SD卡驱动和FAT文件系统Demo

          本文链接:https://www.haomeiwen.com/subject/averwhtx.html