STM32F401 mikrodenetleyicisini bir bilgisayara bağlandığında tıpkı bir USB Flash Bellek gibi görünecek şekilde yapılandırabilirsiniz. Bu moda USB Mass Storage Class (MSC) denir. Bu senaryoda STM32, bilgisayar için bir kart okuyucu veya depolama aygıtı rolünü üstlenir. Depolama alanı olarak mikrodenetleyicinin kendi dahili Flash belleğinin bir kısmı, karta bağlı bir SD Kart veya harici bir SPI Flash entegresi (örn: W25Q64) kullanılabilir.
En yaygın ve performanslı yöntem olan Harici SPI Flash / SD Kart altyapısını kullanarak STM32F401'i bilgisayara USB Bellek olarak tanıtma adımlarını inceleyelim.
Bu projede STM32 hem bilgisayarla USB üzerinden konuşacak hem de arkadaki depolama birimini (SD Kart veya SPI Flash) yönetecektir.
Device_Only olarak seçin.Mass Storage Class olarak ayarlayın.Tavsiye: Büyük veri blokları transfer edileceği için yığın bellek miktarını artırın. Project Manager -> Linker Settings kısmındanMinimum Heap Sizedeğerini0x1000yapın ve kodu üretin.
Kod üretildikten sonra bilgisayar STM32'yi bir USB bellek olarak tanır ancak içine girdiğinizde "Disk Yok" uyarısı verir. Bilgisayardan gelen Okuma/Yazma isteklerini gerçek depolama biriminize yönlendirmek için usbd_storage_if.c dosyasını düzenlemeniz gerekir.
Bilgisayarın diskin boyutunu doğru görebilmesi için sektör sayısı ve sektör boyutunu tanımlamalıyız. usbd_storage_if.c dosyasındaki STORAGE_BLK_NBR (Toplam Sektör Sayısı) ve STORAGE_BLK_SIZ (Sektör Boyutu: Standart 512 Bayttır) alanlarını harici belleğinize göre güncelleyin:
/* usbd_storage_if.c içi - Örnek: 8 Megabaytlık bir SPI Flash için */ #define STORAGE_BLK_SIZ 512 // Standart sektör boyutu (Byte) #define STORAGE_BLK_NBR 16384 // Toplam Sektör Sayısı (16384 * 512 = 8MB)
Bilgisayar diskten veri okumak istediğinde alt seviyedeki STORAGE_Read_FS fonksiyonunu tetikler. Buraya kendi bellek okuma kodunuzu eklemelisiniz:
int8_t STORAGE_Read_FS(uint8_t lun, uint8_t *buf, uint32_t blk_addr, uint16_t blk_len) { /* USER CODE BEGIN 6 */ // Örnek SPI Flash okuma fonksiyonu (Kendi kütüphanenize göre uyarlayın): // W25Qxx_Read_Sectors(buf, blk_addr, blk_len); // Örnek SD Kart (SDIO) okuma fonksiyonu: // BSP_SD_ReadBlocks((uint32_t*)buf, blk_addr, blk_len, HAL_MAX_DELAY); return (USBD_OK); /* USER CODE END 6 */ }
Bilgisayardan STM32'ye bir dosya sürüklendiğinde veya disk biçimlendirildiğinde STORAGE_Write_FS fonksiyonu çalışır:
int8_t STORAGE_Write_FS(uint8_t lun, uint8_t *buf, uint32_t blk_addr, uint16_t blk_len) { /* USER CODE BEGIN 7 */ // Örnek SPI Flash yazma fonksiyonu: // W25Qxx_Write_Sectors(buf, blk_addr, blk_len); // Örnek SD Kart (SDIO) yazma fonksiyonu: // BSP_SD_WriteBlocks((uint32_t*)buf, blk_addr, blk_len, HAL_MAX_DELAY); return (USBD_OK); /* USER CODE END 7 */ }
Henüz yorum yapılmamış. İlk yorumu siz yapın!