STM32F401 mikrodenetleyicisi üzerinde USB kullanımı, genellikle STM32CubeMX ve HAL Kütüphanesi (Hardware Abstraction Layer) kullanılarak oldukça pratik bir şekilde gerçekleştirilir. STM32F401, USB OTG (On-The-Go) Full Speed (FS) donanımına sahiptir. Bu sayede cihazınızı ister bir bilgisayara bağlanabilen bir çevre birimi (Device), ister flash bellek gibi cihazları okuyan bir ana bilgisayar (Host) olarak yapılandırabilirsiniz.
En yaygın kullanım senaryosu olan USB Device - Virtual COM Port (Sanal Seri Port) kurulumunu adım adım inceleyelim.
Projeyi başlatmak ve gerekli kodları üretmek için STM32CubeMX üzerinde şu ayarları yapmalısınız:
USB biriminin doğru çalışabilmesi için 48 MHz değerinde kararlı bir saat sinyaline ihtiyacı vardır.
Crystal/Ceramic Resonator yapın (Kartınızda harici kristal olduğunu varsayarak).Device_Only olarak ayarlayın.Activate_VBUS seçeneğini devre dışı bırakabilirsiniz.Communication Device Class (Virtual Port Com) seçeneğini seçin.İpucu: Ayarlar bittiğinde sağ üstten Generate Code diyerek projenizi (Keil, STM32CubeIDE vb. için) üretin.
Kod üretildikten sonra, USB üzerinden veri alıp göndermek için HAL kütüphanesinin hazır fonksiyonlarını kullanacağız. USB fonksiyonları genellikle usbd_cdc_if.c ve usbd_cdc_if.h dosyaları içinde yer alır.
Bilgisayara veri göndermek için CDC_Transmit_FS fonksiyonu kullanılır.
/* main.c içinde kullanımı */ #include "usbd_cdc_if.h" // USB kütüphanesini dahil edin char mesaj[] = "Merhaba STM32F401 USB Dünyası!\r\n"; while (1) { // Veriyi USB üzerinden gönder (Veri, Veri Boyutu) CDC_Transmit_FS((uint8_t*)mesaj, strlen(mesaj)); HAL_Delay(1000); // 1 saniye bekle }
Bilgisyardan bir veri geldiğinde, bu veri otomatik olarak usbd_cdc_if.c dosyasındaki CDC_Receive_FS fonksiyonuna düşer. Gelen veriyi işlemek için bu fonksiyonun içini düzenlemeniz gerekir.
/* usbd_cdc_if.c dosyası içindeki ilgili fonksiyon */ static int8_t CDC_Receive_FS(uint8_t* Buf, uint32_t *Len) { /* User code start 6 */ // Örnek: Gelen veriyi aynen geri gönder (Echo) CDC_Transmit_FS(Buf, *Len); // Veya gelen veriyi kendi oluşturduğunuz bir global değişkene kopyalayabilirsiniz. USBD_CDC_SetRxBuffer(&hUsbDeviceFS, Buf); USBD_CDC_ReceivePacket(&hUsbDeviceFS); return (USBD_OK); /* User code end 6 */ }
PA11 -> USB_DM (Data Minus)PA12 -> USB_DP (Data Plus)Minimum Stack Size değerini 0x400 yerine 0x800 veya 0x1000 yaparak yığın boyutunu büyütebilirsiniz.Henüz yorum yapılmamış. İlk yorumu siz yapın!