STM32F4 Usart Sorunu

Başlatan escaqe, 16 Kasım 2013, 11:41:17

escaqe

Arkadaşlar günlerdir uğraşıyorum saçma sapan bi sorunda saplandım kaldım lütfen yardımlarınızı esirgemeyin :(
Gelelim soruna; usart init için kodlarım bunlar.
void USART_Configuration(uint32_t baudrate)
{
    GPIO_InitTypeDef GPIO_InitStruct; 
    USART_InitTypeDef USART_InitStruct;
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE);
    RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOB, ENABLE);
    GPIO_InitStruct.GPIO_Pin = GPIO_Pin_6 | GPIO_Pin_7; 
    GPIO_InitStruct.GPIO_Mode = GPIO_Mode_AF;             
    GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;   
    GPIO_InitStruct.GPIO_OType = GPIO_OType_PP;         
    GPIO_InitStruct.GPIO_PuPd = GPIO_PuPd_UP;            
    GPIO_Init(GPIOB, &GPIO_InitStruct);            
    GPIO_PinAFConfig(GPIOB, GPIO_PinSource6, GPIO_AF_USART1); 
    GPIO_PinAFConfig(GPIOB, GPIO_PinSource7, GPIO_AF_USART1);
    USART_InitStruct.USART_BaudRate = baudrate;                          
    USART_InitStruct.USART_WordLength = USART_WordLength_8b;
    USART_InitStruct.USART_StopBits = USART_StopBits_1;              
    USART_InitStruct.USART_Parity = USART_Parity_No;               
    USART_InitStruct.USART_HardwareFlowControl = USART_HardwareFlowControl_None; 
    USART_InitStruct.USART_Mode = USART_Mode_Tx | USART_Mode_Rx;
    USART_Init(USART1, &USART_InitStruct); 
    USART_Cmd(USART1, ENABLE);
}


Programda sadece basit bir döngü ile veri göndermeye çalışıyorum. Bir türlü sağlıklı bir şekilde istediğim veriyi gönderemiyorum. Veri bozuluyor, BAZEN fazladan başa 1 bit ekleniyor. Arayüz olarak MAX485 entegresini kullanıyorum. http://www.usconverters.com/downloads/max491.pdf
Pin bağlantılarında sorun yok.
    while(1)
    {
    	USART_SendData(USART1, 10);
        Delay_ms(1000);
    }


Örneğin yukarıdaki kod çalıştığında, terminalde sürekli "0A" okumam gerekirken "1A 0A 1A 1A 0A 1A 0A 1A 1A 0A " gibi veriler okuyorum.

Bunun sebebi nedir?
İşlemcinin 3.3v ile çalışması MAX485 entegresinin çalışmasını etkiler mi?
3.3v sinyali 5v çevirmek için http://www.robotistan.com/Lojik-Seviye-Cevirici-Logic-Level-Converter,PR-1771.html gibi ürünler kullanmak sorunu çözer mi?
Sorunu çözmek için tavsiyeleriniz nelerdir?

Yardımlarınız için teşekkür ediyorum.

Bayramsumbul

Merhabalar ve kolay gelsin.Debug yapma şansınız var ise Usart Tx ve Rx pinlerini kısa devre yapıp debug yapabilirmisiniz?Bence bu şekilde sorunun MCO'damı olduğu algılanabilir.
Bir Elektronik Meraklısının Serüveni...

Pir-O

Usart pinleri ayarlanırken tek tek ayarlanması gerekiyor. Bu benim çalışan kodum.

GPIO_Tanimi.GPIO_Pin = GPIO_Pin_10;
GPIO_Tanimi.GPIO_Mode = GPIO_Mode_AF;
GPIO_Tanimi.GPIO_Speed = GPIO_Speed_100MHz;
GPIO_Tanimi.GPIO_OType = GPIO_OType_PP;
GPIO_Tanimi.GPIO_PuPd = GPIO_PuPd_UP;
GPIO_Init (GPIOB, &GPIO_Tanimi);
GPIO_Tanimi.GPIO_Pin = GPIO_Pin_11;
GPIO_Init (GPIOB, &GPIO_Tanimi);

GPIO_PinAFConfig (GPIOB,GPIO_PinSource10,GPIO_AF_USART3);
GPIO_PinAFConfig (GPIOB,GPIO_PinSource11,GPIO_AF_USART3);

İkinci olarak neden max485 kullanıyorsun anlamadım max232 kullanabilirsin 3.3 v için ise max3232 var.
Mikrodenetleyiciyi max485 ten ayır. Hyper tetminali aç. Max485 devresine 5v besleme ver. Rx ve tx uçlarını kısadevre et. Hyper terminalden verileri gonder eğer düzgün alabiliyorsan sorun yok. Sonra beslemeyi 3.3 v ver tekrar rx ve tx i kısa devre et veri düzgünse devrede sorun yok. Demektir.

escaqe

    Merhaba teşekkürler"Bayramsumbul",
Söylediğiniz şekilde sorunsuz çalışıyor, MCU kısmında sorun olduğunu sanmıyorum.

    "Pir-O" program ve MCU kısmında sorun yok, osiloskop ile sinyalleri dinlediğimde hiç bir sorun görünmüyor. Ayrıca endüstriyel bir projemde kullanacağım bu yüzden MAX485 kullanmam gerekiyor. Söylediğiniz gibi mikrodenetleyiciyi devre dışı bırakıp, RX-TX kısa devre atıp gönderilen veriyi tekrar almak pek mümkün olmuyor. Çünkü MAX485 entegresinde okuma yazma modunun kontrol edilmesi gerekiyor.

    Sonuç olarak hala sorun devam etmekte...  :(

escaqe

     Logic Level Converter kullandığım halde aynı şekilde sorunlu çalışıyor. Yardımcı olabilecek kimse yok mu? :(

escaqe

Sorun "stm32f4xx.h" dosyasındaki HSE_VALUE değeri imiş. Default olarak 25mhz verilmiş, 8mhz çekince USART clock yerine oturdu. Bilginize.

engerex

 Geri dönüşüm için teşekkürler.