用于STM32的简化数据访问内部FAT12

上一篇文章中 ,我们考虑了将STM32F103C8T6微控制器用作具有内部FAT12文件系统的闪存驱动器的选项。 现在,您可以考虑如何从我们的内部文件系统获取数据。 例如,我们需要存储程序的某些设置。
存储命名设置不需要数据格式结构的特殊复杂化。 我们接受以下格式-一种设置=一个文件。 例如,我们需要通过UART存储连接速度,例如LED闪烁的延迟(以毫秒为单位)。 在我们的文件系统中创建(在任何文本编辑器中)文件UART_SPD.SETDELAY_BL.SET 。 我们在其中分别写入值:115200和1000。
要获取此数据,请转到我们的内部FAT12,您将需要采用标准的HAL FatFs库,并尝试使其适应内部闪存。 或者以更简单,更方便的方式进行操作-编写自己的函数以读取文件数据FAT12,我们将这样做:

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

现在-我们获得必要设置的值:

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


fdata数组将包含字符串“ 115200”,可以使用atoi()函数将其转换为整数:
带有源代码的项目可以在这里进行

仅此而已。 感谢您的关注!

Source: https://habr.com/ru/post/zh-CN441858/


All Articles