Accès aux données simplifié FAT12 interne pour STM32

Dans un article précédent , nous avons envisagé la possibilité d'utiliser le microcontrôleur STM32F103C8T6 comme lecteur flash avec un système de fichiers FAT12 interne. Vous pouvez maintenant déterminer comment obtenir des données de notre système de fichiers interne. Par exemple, nous devons stocker certains paramètres de notre programme.
Aucune complication particulière des structures de format de données n'est requise pour stocker les paramètres nommés. Nous acceptons le format suivant - un paramètre = un fichier. Par exemple, nous devons stocker la vitesse de connexion via UART et, par exemple, le retard en millisecondes d'une LED clignotante. Créez (dans n'importe quel éditeur de texte) les fichiers UART_SPD.SET et DELAY_BL.SET dans notre système de fichiers. Nous y écrivons les valeurs: 115200 et 1000, respectivement.
Pour obtenir ces données, en vous tournant vers notre FAT12 interne, vous devrez soit prendre la bibliothèque HAL FatFs standard et essayer de l'adapter au flash interne. Ou allez d'une manière plus simple et plus pratique - écrivez votre fonction de lecteur de données de fichier FAT12, ce que nous ferons:

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; } 

Maintenant - nous obtenons la valeur des paramètres nécessaires:

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


Le tableau fdata contiendra la chaîne "115200", qui peut être convertie en entier à l'aide de la fonction atoi ():
Le projet avec les codes sources peut être pris ici .

C’est tout. Merci de votre attention!

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


All Articles