STM32F401 mikrodenetleyicisini bir USB Host (Ana Bilgisayar) olarak yapılandırıp içerisine bir USB Flash Bellek bağlamak, veri lojistiği ve taşınabilir depolama projeleri için harika bir çözümdür. Bu senaryoda STM32, belleğin içindeki dosya sistemini okumak ve yazmak için FATFS (FatFs File System Module) kütüphanesini kullanır.
USB Bellek (Mass Storage Class) okuma/yazma uygulamasını STM32CubeMX ve HAL kütüphanesi ile adım adım gerçekleştirelim.
USB Host yapısı, Device moduna göre biraz daha fazla bellek ve doğru saat frekansı yönetimi gerektirir.
Crystal/Ceramic Resonator olarak aktif edin.Host_Only olarak ayarlayın.Activate_VBUS seçeneğini seçebilirsiniz. Doğrudan bağlantılarda boş bırakabilirsiniz.Bu projede hem USB kütüphanesine hem de dosya sistemine ihtiyacımız var:
Mass Storage Class yapın.USB Disk seçeneğini aktif edin (Check kutusunu işaretleyin).Önemli Not: Projeyi üretmeden önce Project Manager -> Linker Settings alanına gidin. Host ve FATFS yapıları RAM'de çok yer kapladığı için Minimum Heap Size değerini0x800, Minimum Stack Size değerini ise en az0x1000yapın. Ardından Generate Code diyerek kodu üretin.
STM32CubeMX, USB belleğin takılıp çıkarılma durumlarını takip eden bir durum makinesi (State Machine) oluşturur. Biz işlemlerimizi usb_host.c içerisindeki uygulama döngüsünde veya main.c altında bu durumu sorgulayarak yaparız.
Dosya işlemleri için FATFS kütüphanesinin nesnelerini global alanda tanımlıyoruz:
/* USER CODE BEGIN PV */ extern ApplicationTypeDef Appli_state; // USB durumunu takip eden harici değişken FATFS USBDISKFatFs; // Dosya sistemi nesnesi FIL MyFile; // Dosya nesnesi char USBDiskPath[4]; // USB sürücü yolu (örn: "0:/") uint32_t byteswritten; // Yazılan bayt sayısı char veri_tamponu[] = "STM32F401 USB Bellek Yazma Testi basarili!\r\n"; /* USER CODE END PV */
USB bellek takıldığında Appli_state değişkeni APPLICATION_READY konumuna gelir. Bu durumda dosyayı oluşturup yazma işlemini başlatabiliriz:
while (1) { /* USB Host süreçlerini arka planda çalıştırır */ MX_USB_HOST_Process(); switch(Appli_state) { case APPLICATION_READY: // 1. USB Sürücüsünü Bağla (Mount Et) if(f_mount(&USBDISKFatFs, (TCHAR const*)USBDiskPath, 0) == FR_OK) { // 2. Dosyayı Yazma Modunda Aç veya Oluştur (log.txt) if(f_open(&MyFile, "log.txt", FA_CREATE_ALWAYS | FA_WRITE) == FR_OK) { // 3. Veriyi Dosyaya Yaz f_write(&MyFile, veri_tamponu, strlen(veri_tamponu), (void *)&byteswritten); // 4. Dosyayı Kapat ve Güvenli Kaydet f_close(&MyFile); } // Sürücü bağlantısını kes (İşlem bitti) f_mount(NULL, (TCHAR const*)USBDiskPath, 0); } // Sonsuz döngüde sürekli yazmasın diye durumu IDLE'a çekiyoruz Appli_state = APPLICATION_IDLE; break; case APPLICATION_DISCONNECT: // USB Bellek çıkartıldığında yapılacak işlemler break; default: break; } }
Henüz yorum yapılmamış. İlk yorumu siz yapın!