рдПрд╕рдЯреАрдПрдо 32 рдХреЗ рд▓рд┐рдП рд╕рд░рд▓реАрдХреГрдд рдбреЗрдЯрд╛ рдПрдХреНрд╕реЗрд╕ рдЖрдВрддрд░рд┐рдХ FAT12

рдкрд┐рдЫрд▓реЗ рд▓реЗрдЦ рдореЗрдВ , рд╣рдордиреЗ STM32F103C8T6 рдорд╛рдЗрдХреНрд░реЛрдХрдВрдЯреНрд░реЛрд▓рд░ рдХреЛ рдЖрдВрддрд░рд┐рдХ FAT12 рдлрд╛рдЗрд▓ рд╕рд┐рд╕реНрдЯрдо рдХреЗ рд╕рд╛рде рдлреНрд▓реИрд╢ рдбреНрд░рд╛рдЗрд╡ рдХреЗ рд░реВрдк рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд╡рд┐рдХрд▓реНрдк рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд┐рдпрд╛ред рдЕрдм рдЖрдк рд╡рд┐рдЪрд╛рд░ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рд╣рдорд╛рд░реЗ рдЖрдВрддрд░рд┐рдХ рдлрд╝рд╛рдЗрд▓ рд╕рд┐рд╕реНрдЯрдо рд╕реЗ рдбреЗрдЯрд╛ рдХреИрд╕реЗ рдкреНрд░рд╛рдкреНрдд рдХрд┐рдпрд╛ рдЬрд╛рдПред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рд╣рдореЗрдВ рдЕрдкрдиреЗ рдХрд╛рд░реНрдпрдХреНрд░рдо рдХреА рдХреБрдЫ рд╕реЗрдЯрд┐рдВрдЧреНрд╕ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред
рдирд╛рдорд┐рдд рд╕реЗрдЯрд┐рдВрдЧреНрд╕ рдХреЛ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдбреЗрдЯрд╛ рдкреНрд░рд╛рд░реВрдк рд╕рдВрд░рдЪрдирд╛рдУрдВ рдХреА рдХреЛрдИ рд╡рд┐рд╢реЗрд╖ рдЬрдЯрд┐рд▓рддрд╛ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИред рд╣рдо рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдкреНрд░рд╛рд░реВрдк рдХреЛ рд╕реНрд╡реАрдХрд╛рд░ рдХрд░рддреЗ рд╣реИрдВ - рдПрдХ рд╕реЗрдЯрд┐рдВрдЧ = рдПрдХ рдлрд╝рд╛рдЗрд▓ред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рд╣рдореЗрдВ UART рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдХрдиреЗрдХреНрд╢рди рдХреА рдЧрддрд┐ рдХреЛ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдПрдХ рдкрд▓рдХ рдЭрдкрдХрддреЗ рдПрд▓рдИрдбреА рдХреЗ рдорд┐рд▓реАрд╕реЗрдХрдВрдб рдореЗрдВ рджреЗрд░реАред рд╣рдорд╛рд░реЗ рдлрд╛рдЗрд▓ рд╕рд┐рд╕реНрдЯрдо рдореЗрдВ UART_SPD.SET рдФрд░ DELAY_BL.SET рдлрд╛рдЗрд▓реЗрдВ (рдХрд┐рд╕реА рднреА рдЯреЗрдХреНрд╕реНрдЯ рдПрдбрд┐рдЯрд░ рдореЗрдВ) рдмрдирд╛рдПрдВред рд╣рдо рдЙрдирдореЗрдВ рдореВрд▓реНрдп рд▓рд┐рдЦрддреЗ рд╣реИрдВ: рдХреНрд░рдорд╢рдГ 115200 рдФрд░ 1000ред
рдЗрд╕ рдбреЗрдЯрд╛ рдХреЛ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдорд╛рд░реЗ рдЖрдВрддрд░рд┐рдХ FAT12 рдХреА рдУрд░ рдореБрдбрд╝рдиреЗ рд╕реЗ рдЖрдкрдХреЛ рдпрд╛ рддреЛ рдорд╛рдирдХ рдПрдЪрдПрдПрд▓ рдлреИрдЯрдлреЗрд╕ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХреЛ рд▓реЗрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреА рдФрд░ рдЗрд╕реЗ рдЖрдВрддрд░рд┐рдХ рдлреНрд▓реИрд╢ рдореЗрдВ рдЕрдиреБрдХреВрд▓рд┐рдд рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред рдпрд╛ рд╕рд░рд▓ рдФрд░ рдЕрдзрд┐рдХ рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рддрд░реАрдХреЗ рд╕реЗ рдЬрд╛рдПрдВ - рдЕрдкрдиреЗ 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" рд╣реЛрдЧрд╛, рдЬрд┐рд╕реЗ рдПрдЯреЙрдп () рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдкреВрд░реНрдгрд╛рдВрдХ рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ:
рд╕реЛрд░реНрд╕ рдХреЛрдб рд╡рд╛рд▓реА рдкрд░рд┐рдпреЛрдЬрдирд╛ рдХреЛ рдпрд╣рд╛рдВ рд▓рд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ ред

рд╡рд╣ рд╕рдм рд╣реИред рдЖрдкрдХрд╛ рдзреНрдпрд╛рди рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рдж!

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


All Articles