Acceso a datos simplificado FAT12 interno para STM32

En un art铆culo anterior , consideramos la opci贸n de usar el microcontrolador STM32F103C8T6 como una unidad flash con un sistema de archivos interno FAT12. Ahora puede considerar c贸mo obtener datos de nuestro sistema de archivos interno. Por ejemplo, necesitamos almacenar algunas configuraciones de nuestro programa.
No se requiere ninguna complicaci贸n especial de las estructuras de formato de datos para almacenar configuraciones con nombre. Aceptamos el siguiente formato: una configuraci贸n = un archivo. Por ejemplo, necesitamos almacenar la velocidad de conexi贸n a trav茅s de UART y, por ejemplo, el retraso en milisegundos de un LED parpadeante. Cree (en cualquier editor de texto) archivos UART_SPD.SET y DELAY_BL.SET en nuestro sistema de archivos. Escribimos los valores en ellos: 115200 y 1000, respectivamente.
Para obtener estos datos, recurriendo a nuestro FAT12 interno, deber谩 tomar la biblioteca HAL FatFs est谩ndar e intentar adaptarla al flash interno. O vaya de una manera m谩s simple y conveniente: escriba su funci贸n de lector de datos de archivo FAT12, que haremos:

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

Ahora, obtenemos el valor de la configuraci贸n necesaria:

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


La matriz fdata contendr谩 la cadena "115200", que se puede convertir al entero utilizando la funci贸n atoi ():
El proyecto con los c贸digos fuente se puede tomar aqu铆 .

Eso es todo Gracias por su atencion!

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


All Articles