STM32F103C8T6 sebagai flash drive dengan sistem file FAT12

Saat mengembangkan perangkat, seringkali perlu untuk menyimpan pengaturan di luar program kerja. Bahkan lebih baik untuk dapat memodifikasinya tanpa menggunakan alat khusus.

Pertimbangkan opsi penyimpanan di mikrokontroler STM F103 yang mungkin paling umum. Breadboard Blue Pill yang terkenal juga berkontribusi terhadap prevalensi.

gambar
Flash yang tersedia di dalamnya memungkinkan tidak hanya untuk menyimpan dan memodifikasi pengaturan menggunakan sistem file FAT12 di flash internal, tetapi juga untuk mengatur pembaruan firmware.

Menurut dokumentasi, STM32F103C8T6 memiliki memori flash 64K. Namun, di hampir semua STM32F103C8T6, 128K diinstal. Ini juga disebutkan dalam berbagai sumber - mereka biasanya menempatkan 64K lebih banyak. "Fitur" ini memungkinkan Anda untuk menggunakan mikrokontroler sebagai flash drive dengan kapasitas 128K - 20K (sistem membutuhkan FAT12) - ukuran firmware.

Banyak penggemar yang mencoba menggunakan pengontrol ini sebagai flash drive mengalami masalah penggunaannya dalam mode sistem file FAT12. Gunakan untuk menghapus / mengisi gambar disk ternyata. Tetapi ketika bekerja seperti dengan drive file, masalah dimulai.

Masalah ini terdiri dari urutan akses yang berbeda ke sektor (blok). Ketika gambar disk dimuat, perekaman terjadi secara berurutan, misalnya:

-Rekam nomor blok 1,
-Rekam nomor blok 2,
-Catat blok nomor 3.

Saat menulis data FAT12, perekaman dapat terjadi secara sewenang-wenang:

-Catat blok nomor 3,
-Rekam nomor blok 1,
-Catat blok nomor 2.

Dan, karena menulis ke flash memerlukan menghapus seluruh halaman 1K, saat menggunakan sektor 512 byte dalam drive (dan Anda tidak dapat menggunakan sektor lain), jika akses acak digunakan, informasi di sektor tetangga terhapus. Untuk mencegah hal ini terjadi, contoh di atas menggunakan array 512 byte untuk menyimpan sektor tetangga. Dan rekamannya harus sebagai berikut:

- tentukan alamat awal halaman,
- ingat sektor tetangga,
- hapus halaman,
- menulis sektor yang dihafal,
- tulis data.

Agar tidak mempelajari hutan tanpa kebutuhan yang diperlukan, saya menyiapkan proyek di CubeMX.

Saya akan memberikan contoh fungsi untuk menulis ke flash via HAL (usbd_storage_if.c)

//    flash void writeBuf (uint32_t page_addr, uint8_t *buf){ uint32_t erase_addr=get_erase_addr(page_addr); uint32_t buf_erase_addr; uint32_t buf32; if (page_addr != erase_addr) { buf_erase_addr=erase_addr; } else { buf_erase_addr=erase_addr+STORAGE_BLK_SIZ; } HAL_FLASH_Unlock(); //      set_buf_before_erase(buf_erase_addr); //       FLASH_EraseInitTypeDef EraseInitStruct; uint32_t PAGEError = 0; EraseInitStruct.TypeErase = FLASH_TYPEERASE_PAGES; EraseInitStruct.PageAddress = erase_addr; EraseInitStruct.NbPages = 1; HAL_FLASHEx_Erase(&EraseInitStruct,&PAGEError); //    for (int i=0; i<STORAGE_BLK_SIZ/4;i++) { HAL_FLASH_Program(FLASH_TYPEPROGRAM_WORD,buf_erase_addr,blk_buff[i]); buf_erase_addr+=4; } //   for (int i=0; i<STORAGE_BLK_SIZ/4;i++) { buf32=*(uint32_t *)&buf[i*4]; HAL_FLASH_Program(FLASH_TYPEPROGRAM_WORD, page_addr,buf32); page_addr+=4; } HAL_FLASH_Lock(); } 

Ukuran file biner yang saya dapatkan sekitar 20K, jadi halaman memori data saya didefinisikan dengan 0x08006000 (24K).

Kami mengkompilasi (kode sumber contoh dapat diambil di sini).

Kami terhubung:

 [ 8193.499792] sd 4:0:0:0: Attached scsi generic sg2 type 0 [ 8193.502050] sd 4:0:0:0: [sdb] 128 512-byte logical blocks: (65.5 kB/64.0 KiB) [ 8193.502719] sd 4:0:0:0: [sdb] Write Protect is off [ 8193.502722] sd 4:0:0:0: [sdb] Mode Sense: 00 00 00 00 [ 8193.503439] sd 4:0:0:0: [sdb] Asking for cache data failed [ 8193.503445] sd 4:0:0:0: [sdb] Assuming drive cache: write through [ 8193.523812] sdb: [ 8193.526914] sd 4:0:0:0: [sdb] Attached SCSI removable disk 

Disk ditentukan, semuanya baik-baik saja!

Mari kita mulai membentuk partisi dan memformat disk kita.

Di Linux, ini cukup sederhana dari baris perintah:

 sudo fdisk /dev/sdb 



format dalam FAT12:

 sudo mkfs.fat /dev/sdb -F 12 

Salin file untuk pengujian:



Namun, orang tidak boleh lupa bahwa menurut dokumentasi, jumlah siklus penulisan ulang flash
dijamin hanya dalam 100.000. Misalnya, memformat dan menulis file 30K tunggal akan mengambil (sesuai dengan log debug contoh ini):

 00106 44 67 Write_FS blk_addr=003 0x08006600 

106 tulis ulang siklus.

Pertanyaannya tetap - bagaimana saya bisa membaca data dengan mengakses file FAT12 secara langsung?
Tentang ini di artikel selanjutnya.
Terima kasih atas perhatian anda!

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


All Articles