Vereinfachter Datenzugriff internes FAT12 für STM32

In einem früheren Artikel haben wir die Option in Betracht gezogen, den Mikrocontroller STM32F103C8T6 als Flash-Laufwerk mit einem internen FAT12-Dateisystem zu verwenden. Jetzt können Sie überlegen, wie Sie Daten aus unserem internen Dateisystem abrufen können. Zum Beispiel müssen wir einige Einstellungen unseres Programms speichern.
Zum Speichern benannter Einstellungen sind keine besonderen Komplikationen bei Datenformatstrukturen erforderlich. Wir akzeptieren das folgende Format - eine Einstellung = eine Datei. Zum Beispiel müssen wir die Verbindungsgeschwindigkeit über UART speichern und zum Beispiel eine Verzögerung in Millisekunden einer blinkenden LED. Erstellen Sie (in einem beliebigen Texteditor) die Dateien UART_SPD.SET und DELAY_BL.SET in unserem Dateisystem. Wir schreiben die Werte in sie: 115200 bzw. 1000.
Um diese Daten zu erhalten und sich unserem internen FAT12 zuzuwenden, müssen Sie entweder die Standard-HAL-FatFs-Bibliothek verwenden und versuchen, sie an den internen Flash anzupassen. Oder gehen Sie einfacher und bequemer vor - schreiben Sie Ihre FAT12-Datei-Datenleserfunktion, die wir ausführen werden:

uint8_t f12_read_data ( char *file_name, //       11  - "NAME TXT" char **file_data, //      char *file_list, //     uint16_t file_list_size) { //     // FAT12 - http://elm-chan.org/docs/fat_e.html uint16_t BPB_BytsPerSec; uint8_t BPB_NumFATs; uint16_t BPB_RootEntCnt; uint16_t BPB_RsvdSecCnt; uint16_t BPB_FATSz16; uint8_t BPB_SecPerClus; uint16_t BS_BootSign; uint8_t found=0; uint16_t cluster_no; char *fname; uint32_t SEEK_FAT12_NAMES_OFFSET; uint32_t SEEK_FAT12_NAMES_OFFSET_END; uint32_t SEEK_DATA_OFFSET; uint32_t fs; //   FAT12 BPB_BytsPerSec=uint16_t_from_internal_flash(PAGE_ADDR+11); BPB_NumFATs=uint8_t_from_internal_flash(PAGE_ADDR+16); BPB_RootEntCnt=uint16_t_from_internal_flash(PAGE_ADDR+17); BPB_RsvdSecCnt=uint16_t_from_internal_flash(PAGE_ADDR+14); BPB_FATSz16=uint16_t_from_internal_flash(PAGE_ADDR+22); BPB_SecPerClus=uint8_t_from_internal_flash(PAGE_ADDR+13); BS_BootSign=uint16_t_from_internal_flash(PAGE_ADDR+510); if (BS_BootSign != 0xAA55) { //   boot  FAT return FAT12_ERR_BAD_FAT; } SEEK_FAT12_NAMES_OFFSET = (BPB_RsvdSecCnt+(BPB_FATSz16 * BPB_NumFATs)) * BPB_BytsPerSec; //     SEEK_FAT12_NAMES_OFFSET_END=SEEK_FAT12_NAMES_OFFSET + (((32 * BPB_RootEntCnt + BPB_BytsPerSec - 1) / BPB_BytsPerSec) * BPB_BytsPerSec); //     SEEK_DATA_OFFSET= BPB_BytsPerSec * BPB_RsvdSecCnt+ // Boot  +  ((BPB_FATSz16 * BPB_NumFATs) * BPB_BytsPerSec) + //  FAT BPB_RootEntCnt*32; //    -  if (file_list_size > 0) //     file_list[0]=0; while (SEEK_FAT12_NAMES_OFFSET < SEEK_FAT12_NAMES_OFFSET_END) { fname = char_from_internal_flash(PAGE_ADDR+SEEK_FAT12_NAMES_OFFSET); cluster_no = uint16_t_from_internal_flash(PAGE_ADDR + SEEK_FAT12_NAMES_OFFSET + 0x1A); fs = uint32_t_from_internal_flash(PAGE_ADDR + SEEK_FAT12_NAMES_OFFSET + 0x1C); if ((file_list_size > 0) && (strlen(file_list)+20 < file_list_size) && (cluster_no > 0)) { sprintf(file_list,"%s%11s %06d bytes\r\n", file_list,fname, fs); //     } for (int i=0;i<9;i++) { //      if (fname[i] != file_name[i]) { found=0; break; } found=1; } if (found==1) break; SEEK_FAT12_NAMES_OFFSET+=0x20; } if (found == 0) { return FAT12_ERR_FILE_NOT_FOUND; } if ( *file_data != 0 ) { *file_data=char_from_internal_flash(PAGE_ADDR+(cluster_no-2) * (BPB_SecPerClus * BPB_BytsPerSec) + //   SEEK_DATA_OFFSET); } return 0; } 

Jetzt erhalten wir den Wert der notwendigen Einstellungen:

 f12_read_data("UART_SPDSET" /*  ,   11  - */,&fdata, file_list, 200); 


Das fdata-Array enthält die Zeichenfolge "115200", die mit der Funktion atoi () in die Ganzzahl konvertiert werden kann:
Das Projekt mit Quellcodes kann hier aufgenommen werden .

Das ist alles Vielen Dank für Ihre Aufmerksamkeit!

Source: https://habr.com/ru/post/de441858/


All Articles