VCP, bir USB
cihazını bilgisayara bağladığınızda, işletim sisteminin (Windows, Linux, macOS)
bu cihazı bir seri port (örneğin, COM3 veya /dev/ttyACM0) olarak algılamasını
sağlar. VCP, genellikle USB İletişim Cihaz Sınıfı (Communication Device Class -
CDC) protokolünü kullanarak çalışır ve uygun sürücülerle (örneğin,
STMicroelectronics veya FTDI VCP sürücüleri) desteklenir.
Örneğin, bir STM32
mikrodenetleyicisini USB üzerinden bir PC'ye bağladığınızda, VCP sayesinde bu
cihaz bir COM portu olarak görünür. Böylece, seri port protokollerini kullanan
uygulamalar (örneğin, terminal programları gibi PuTTY veya Tera Term) bu cihazla
kolayca iletişim kurabilir.
Burada USB COM portundan veri alma ve gönderme işleminde ön tampon değerlikler gösterilir. tek seferde gönderilebilecek ve alınabilecek veri tamponu 1024 bayt şeklindedir. istenirse bu ayarlar değiştirilebilir.
Burada COM
portundan haberleşme sağlanması için ihtiyaç duyulan 2 fonksiyonumuz yani
CDC_Transmit_FS ve CDC_Receive_FS fonksiyonlarımız bulunmakta.
Terminal ekranında
pratik kullanım adına Terminalde ‘\r\n’, mesajın yeni bir satırda başlamasını
sağlar. \r imleci satır başına getirir, \n ise bir alt satıra geçirir. Bu,
özellikle Windows tabanlı terminal programlarında standart bir beklentidir.
STM32F103C8T6 Blue
pill modülümüzde bir adet Micro-USB girişi vardır bu giriş ile direkt
bilgisayarımızın USB portuna bağlarız. Bu aynı zamanda A12 ve A11 pinlerine
denk gelmektedir.
/* USER CODE BEGIN 0 */
char buffer[64] = "Merhaba ben STM32F103C8T6 Öğreniyorum.\r\n";
/* USER CODE END 0 */
/* USER CODE BEGIN WHILE */
while (1)
{
CDC_Transmit_FS((uint8_t*)buffer, sizeof(buffer));
CDC_Transmit_FS((uint8_t*)buffer, strlen(buffer));
HAL_Delay(1000);
/* USER CODE END WHILE */
/* USER CODE BEGIN 3 */
}
Burada veriyi 2
şekilde yazdırıyoruz.
·
sizeof()
ile bayt türünden verinin ne kadar yer tuttuğunu belirtiriz. Burada
sizeof(buffer)=64 olarak döner. Yani buffer’ın tam uzunluğunu verir. Buffer
değişkenin
· strlen() ile char verisinde saklanan stringin uzunluğu verilir. Yani boş karakterleri dahil etmez. strlen(buffer) =40 olarak döner. Boş verileri de göndererek sistemi yormaz.
Hangisi uygulamanız için daha optimize ise onun için kullanabilirsiniz.
Ve aynı zamanda
veriler uint8_t yani bayt türüne dönüştürülerek gönderilir. (uint8_t*) bu
bağlamda iş görür.
Bu kodu CTRL S ile
kaydedip CTRL B ile build ediyoruz. Debug ile kodu attıktan sonra STM32’nin usb
portundan bilgisayara bağladığımızda USB bağlantısını ‘aygıt yöneticisi’ ile
kontrol ediyoruz.
Daha sonra
bilgisayarımıza Putty, TeraTerm, Hercules gibi programlarla doğrudan com port
okuyabiliriz. Hem Putty hem de TeraTerm programı ile eş zamanlı şekilde nasıl
olacağını gösterelim. Putty’de baudrate bağlantısı standart olarak 9600’dür
fakat buna herhangi bir konfigürasyona gerek yoktur STM32 tarafında USB VCP bağlantısı bu hız
konfigürasyonunu kendi kendine sağlar.
Şimdi de CDC_Receive_FS fonksiyonuna bakalım. burada kaynak kodlarında değişiklik yapmaya gerek vardır. bunun için yeni bir proje açalım ve Receive kodunu gösterelim. yukarıda yapılan konfigürasyon ayarlarını baştan sonra gene yapıyoruz. fakat Receive ederken bazı ayarlamalar yapmak gerek.
/* USER CODE BEGIN PV */
/* Private variables ---------------------------------------------------------*/
extern char Rx_Flag;
extern char Rx_Buf[25];
/* USER CODE END PV */
static int8_t CDC_Receive_FS(uint8_t* Buf, uint32_t *Len)
{
/* USER CODE BEGIN 6 */
USBD_CDC_SetRxBuffer(&hUsbDeviceFS, &Buf[0]);
USBD_CDC_ReceivePacket(&hUsbDeviceFS);
strncpy(&Rx_Buf[0],&Buf[0],25);
Rx_Flag = 1;
return (USBD_OK);
/* USER CODE END 6 */
}
/* USER CODE BEGIN 0 */
char Tx_Buf[25] = "Merhaba VCP PC portu! \n";
char Rx_Buf[25];
char cnt=0;
char Rx_Flag=0;
/* USER CODE END 0 */
/* Infinite loop */
/* USER CODE BEGIN WHILE */
while (1)
{
CDC_Transmit_FS((uint8_t*)Tx_Buf, strlen(Tx_Buf));
HAL_Delay(250);
/* USER CODE END WHILE */
/* USER CODE BEGIN 3 */
}
/* USER CODE END 3 */
Kodu debug edip çalıştıralım. bu sefer com port bağlantısı için hercules kullanıyorum. kodda her 250 milisaniyede bir defa çalışacak şekilde "Merhaba VCP PC portu! \n" verisi bilgisayara ulaşırken, bilgisayardan da Merhaba STM32! verisi gönderildiğinde STM32'ye ulaşmaktadır.
bu şekilde STM32 ile PC arasında herhangi bir ara modüle ihtiyaç duyulmadan doğrudan bir USB bağlantısı gerçekleştirilebilir. fakat bellek yönetimi açısından optimize olmayabilir. 64Kb flash hafızaya ve 20 Kb Ram belleğ sahip STM32F103C8T6 için bu kütüphanelerin bellek kullanımı aşağıda gösterilmiştir.
Yorumlar
Yorum Gönder