Haberler:

Forum kuralları güncellendi LÜTFEN  okuyunuz:  https://bit.ly/2IjR3ME

Ana Menü

Stm32 VCP printf

Başlatan yldzelektronik, 13 Nisan 2018, 21:06:56

yldzelektronik

Selamlar.

Stm32f103 kullanarak (keil ide) bir uygulama geliştiriyorum. Bir noktada takıldım.

USB VCP kullanarak printf debugger yapmak istiyorum. Normalde uart kullandığımda en ufak sorun olmaksızın sistem çalışıyor.

Header dosyası içindeki tanım:

#if ( DEBUG == DEBUG_ENABLE )
	/* printf definetion */
	#define DEBUG_MSG( FLAG, fmt, ...)																			
	do
	{
		if( FLAG )
			printf( "[%08d]%s:%d:%s(): " fmt "\r\n", HAL_GetTick(), __FILE__, __LINE__, __func__, ##__VA_ARGS__);
	}while( 0 );
#else
	#define DEBUG_MSG( FLAG, fmt, ... )
#endif

C dosyası içindeki tanım:
PUTCHAR_PROTOTYE
{
#if DEBUG_PORT == USB_DEBUG
	CDC_Transmit_FS((uint8_t *)&ch, 1);
#elif DEBUG_PORT == UART_DEBUG
    HAL_UART_Transmit( pDEBUG_PORT, ( uint8_t * )&ch, 1, 0xFFFF );
#else
	#error "Define a debug port!"
#endif
    return ch;
}

Kullanım şeklim ise
DEBUG_MSG(MAIN_DEBUG, "Gsm manager thread started!");
şeklinde.

Ancak usb vcp kullandığımda pcde terminal ekranında, "[0[0[0[0[0" şeklinde çıktı alıyorum.
Eğer keil debug yaparken,
CDC_Transmit_FS((uint8_t *)&ch, 1);
satırına break point koyarsam ve F5 ile kontrollü çalıştırırsam "[00010046]../Src/main.c:633:gsmmanager_handler(): Gsm manager thread started!
" metnini görebiliyorum.

Veya yine aynı satırın hemen altına
CDC_Transmit_FS((uint8_t *)&ch, 1);
CDC_Transmit_FS((uint8_t *)"test", strlen("test"));
yazarsam "[0[0test" şeklinde bir çıktı alıyorum. Sorunun kaynağını anlayamadım.

putc rutininde usb cdc üzerinden 1 byte göndermekte bir sorun mu var acaba?

Sorunun kaynağı ne olabilir?
Kişinin başına gelen hayır Allah'tandır. Kişinin başına gelen şer nefsindendir. Nefislerimizle kendimize zulüm ediyoruz.

Elektroemre

Yanlış hatırlamıyorsam STM32F103 ün VCP örneği (daha doğrusu tüm USB örnekleri) kötü yazılmıştı.

Veriler aslında, usb nin her senkron frame inde gönderiliyor ve tek frame de endpoint uzunluğu kadar (st nin örneğinde 64 byte tı galiba) gönderiliyor. Yine yanlış hatırlamıyorsam, stnin örneğinde gelen veriler ile parça parça giden verilerin takini yapıp, overrun ya da underrun takibi yapacak düzgün bir fifo yapısı yoktu.

Diğer bir problemde, endpoint hafıza paylaşımları düzgün ayarlanmayınca, farklı endpoint verileri buffer da alakasız verilerin üst üste yasılmasına sebep oluyordu.

Tüm bunları toplayınca kaotik ve tutarsız çalışan bir yapı çıkıyor.

Çözüm olarak Usb libi analiz edip temel kısımlar hariç yeniden yazarak çözebilmiştim.

Ax2_Bx_C

Debugger için kullanılabilecek çözümlerin en güzeli bence modbustır. UART debug vs. ile uğraşmaya değmez. Türkçe kütüphaneye de denk gelmiştim geçenlerde ve güzel de çalışıyordu bulursam tekrar paylaşırım. Modbus kullanırsanız CRC nedeniyle yanlış bilgi gelmesi de söz konusu olmaz.

STM32'nin USB örnekleri gerçekten kötü yalnız.

@Elektroemre kodlarını paylaş demek haksızlık olur ama hangi kısımları düzelttiğini söyleyebilir misin bende projelrimi güncellemek isterim?
Ben Yalnızca Bir Matematik Fonksiyonuyum

OptimusPrime

Bunun adina jtag uart deniyorsa bende birkac platform atinda denemistim. Kafasina gore birseyler basiyordu. Senle mi ugrasacam deyip birakmistim.  >:(
https://donanimveyazilim.wordpress.com || Cihân-ârâ cihân içredir ârâyı bilmezler, O mâhîler ki deryâ içredir deryâyı bilmezler ||

yldzelektronik

#4
@Elektroemre söylediklerinizi biraz araştırdım. USB donanıma hakim değilim. Ancak gözlemlediğim bir şey var. Cubemx ile oluşturulan projeye kopyalanan usb kütüphanesinin versiyonu  oldukça eski. Ancak nasıl güncel olanı kullanacağımdan emin değilim.

Diğer bir nokta, freertos kullanıyorum ve usb init işleminden sonra, bir thread içinde tek tek karakter göndermeyi denedim ve bunu gecikmesiz de denedim. Herhangi bir sorun olmaksızın gönderilebiliyor. Ben diyorumki acaba, sorun thread içinden printf çağrısı yaptığımda çok fazla dallanma olduğunda, bir şekilde stack overflow vs oluşuyor da bundan data gönderemiyor olabilir miyim?

Gerçi debug yaparken tek tek gönderildiğinde başarılı bir şekilde gönderdiğim karakterleri alabiliyorum.
Kişinin başına gelen hayır Allah'tandır. Kişinin başına gelen şer nefsindendir. Nefislerimizle kendimize zulüm ediyoruz.