Haberler:

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

Ana Menü

STM32F4 USART Module

Başlatan tesladream, 31 Mayıs 2013, 13:42:41

tesladream

Arkadaşlar Merhaba,

    Bülent hocanın Usart kodunu deniyorum Rx,Tx pinlerini kısa devre yaptırınca gönderdiğim veriler geri geliyor RxBuf'a fakat ben direkt com port tan bir şey gönderdiğim zaman RxBuf a veri gelmiyor.Bu konuda bilginiz varsa yardımcı olur musunuz? Asıl amacım Usart 'ı iyi öğrenip GPS Modulden gelen verileri izlemek istiyorum.
#include "STM32F4xx.h" 
 
unsigned char WAdr,RAdr;
char RxBuf[128];
 
/*********************************************************************************
 CPU frekansi 168Mhz
 AHB frekansi 84 Mhz
 APB frekansi 42 Mhz
*********************************************************************************/
 
void SystemInit()
{
unsigned int i;
      (*((int*)0xE000ED88))|=0x0F00000;  
      for (i=0;i<0x00100000;i++);     // OSC oturtma ve kurtarma rutini
      RCC->CFGR |= 0x00009400;        // AHB ve APB hizlarini max degerlere set edelim
      RCC->CR |= 0x00010000;          // HSE Xtal osc calismaya baslasin        
      while (!(RCC->CR & 0x00020000));// Xtal osc stabil hale gelsin
      RCC->PLLCFGR = 0x07402A04;      // PLL katsayilarini M=4, N=168, P=2 ve Q=7 yapalim   168 Mhz 
      RCC->CR |= 0x01000000;          // PLL calismaya baslasin  (Rehber Sayfa 95)
      while(!(RCC->CR & 0x02000000)); // Pll hazir oluncaya kadar bekle
      FLASH->ACR = 0x00000605;        // Flash ROM icin 5 Wait state secelim ve ART yi aktif edelim (Rehber Sayfa 55)
      RCC->CFGR |= 0x00000002;        // Sistem Clk u PLL uzerinden besleyelim
      while ((RCC->CFGR & 0x0000000F) != 0x0000000A); // Besleninceye kadar bekle
      RCC->AHB1ENR |= 0x0000001F;     // GPIO A,B,C,D,E clock'u aktif edelim 
      GPIOD->MODER  = 0x55550000;     // GPIOD nin 15, 14, 13, 12, 11, 10, 9, 8 pinleri cikis tanimlandi (LEDler icin)
      GPIOD->OSPEEDR= 0xFFFFFFFF;     // GPIOD nin tum cikislari en yuksek hizda kullanacagiz 
} 
 
/*********************************************************************************
      USART3 modulunu kullanarak asenkron haberlesme (Hata kontrolu yapilmiyor)
*********************************************************************************/
 
void USART3_IRQHandler()
{
volatile int Sts;
     Sts=USART3->SR;
     RxBuf[WAdr]=USART3->DR;
     WAdr=(WAdr+1)&0x7F;
}
 
void UsartInit()
{
     WAdr=0;RAdr=0;
 
// USART3 MODULUNU AKTIF HALE GETIRELIM
 
      RCC->APB1ENR|=0x00040000;  // USART3 Clk Enable (Rehber Sayfa 113)
      RCC->APB1RSTR|=0x00040000;  // USART3 Resetlendi
      GPIOB->AFR[1]=0x07777700;  // PB10..PB14 pinleri USART3 ile alakalandirildi (Hard Sayfa 49)
      GPIOB->MODER|=0x2AA00000;  // GPIOB 10..14 icin alternatif fonksiyon tanimi (Rehber Sayfa 148)
 
// USART3 MODULUNU AYARLAYALIM  // 1 Start, 8 Data, 1 Stop, No parity (Default degerler)
 
      RCC->APB1RSTR&=~0x00040000;  // USART3 Reseti kaldiralim
//      USART3->SR&=~0X03FF;   // Status registeri silelim
      USART3->BRR=0X1112;    // 9600 Baud
 
      USART3->CR1|=0x0000202C;  // USART3 enable
      NVIC->ISER[1]|=0x80;         // NVIC da USART3 interrupta izin verelim
}
 
void SendChar(char Tx) 
{
      while(!(USART3->SR&0x80));  // TX Buffer dolu ise bekle (Rehber Sayfa 646)
      USART3->DR=Tx;
}
 
void SendTxt(char *Adr)
{
      while(*Adr) 
        {
          SendChar(*Adr);
          Adr++;
        }  
}
 
char DataReady()
{
       return(WAdr-RAdr);
} 
 
char ReadChar()
{
char Dat;
    
      Dat=RxBuf[RAdr];
      RAdr=(RAdr+1)&0x7F;
      return(Dat);
}
 
// Rx ve TX pinlerini (GPIOB10 ve GPIOB11) birbirine baglarsaniz gonderdiginiz datalar geri gelecektir
 
int main()
{
int i;
      UsartInit(); 
      SendTxt("PicProje");
      SendChar(' ');  
      SendTxt("Bunalmis");
 
      for(i=0;i<0x1000000;i++);         // Laf olsun diye bekledik
 
      while(DataReady()) ReadChar(); 
 
      while(1); 
}

Erol YILMAZ

kodlarını incelemedim ama diğer taraftan gelen UART sinyalleri TAM Baudrate hızında mı diye kontrol etmeniz lazım.
STM32 de "Break Error" verince datayı kabul etmiyor olabilir.

tesladream

Comm Operator adında bir program kullanıyorum kodda 9600 baud ayarlamış bende operatoru 9600 e ayarladım bir problem olduğunu düşünmüyorum. Interrupt ın içinde gelen veriyi direkt RxBuf a yazmasına rağmen operatorden gönderdiğim verileri almıyor.

Erol YILMAZ

Alıntı yapılan: tesladream - 31 Mayıs 2013, 13:53:39
Comm Operator adında bir program kullanıyorum kodda 9600 baud ayarlamış bende operatoru 9600 e ayarladım bir problem olduğunu düşünmüyorum. Interrupt ın içinde gelen veriyi direkt RxBuf a yazmasına rağmen operatorden gönderdiğim verileri almıyor.

Operatorden gönderdiğin veriyi skopla bir incele bakalım, istediğin gibi mi ?
Ben de geçenlerde aynen senin dediğin gibi  bir durumla karşılaştım.
Echo modta çalışıyordu... Başka bir yerden alınca çalışmıyordu...
Baud rate leri eşitleyince düzeldi ama bunu ancak skop ile görebildim.

z

Yazılan örnek programda eğer arzulanan baud rate'in hesabı yanlış yapılmış olsa da sözkonusu örnek programda RX-TX pinleri kısa devre yapıldığında doğru çalışacaktır. Örneğin 9600 Baud için yazıldığı sanılan program aslında 9100 baud olsa bile sorun olmayacaktır.

Fakat bu programı bir başka programla denerken karşı taraf 9600'a set edilirse haliyle veri alış verişi sorunlu olacaktır.

Ayrıca Rx-TX pinlerini RS232 interface üzerinden kullanacaksanız araya RS232 çipi koymanınız gerekiyor.

Öncelikle baud rate hesabının doğru yapılıp kodların da doğru olduğunu teyid etmelisiniz.
Bana e^st de diyebilirsiniz.   www.cncdesigner.com

tesladream

   Hocam arada ft232 tarzı çinden aldığım küçük bir kart kullanıyorum .Stm32 yi bu kart üzerinden bilgisayara bağladım.Bahsettiğiniz gibi bir problem olabilir ama nasıl aşacağımı bilmiyorum. Tek amacım bidirectional olarak veri alışverişi yaptırmak istiyorum transmit konusunda sıkıntı yok çünkü görüyorum Com operatorde veri geliyor ama ben burdan ben gönderdiğimde RxBuf dolmuyor 0x00 görünüyor.

Erol YILMAZ

Alıntı yapılan: tesladream - 31 Mayıs 2013, 14:05:36Bahsettiğiniz gibi bir problem olabilir ama nasıl aşacağımı bilmiyorum.

SKOP icat oldu.

tesladream

Baudrate hesabını okula gidince bir ossiloskopta denicem bakalım varsa bir hata orda cıkar buradan yine cozersem problemi yazarım tesekkurler.

Kaanx

Hocam bu uygulamayı Vırtual com port olarak denediniz mi bende Rs232 convertor ft232 yok malesef VCP olarak USART kullanmayı planlıyorum. Micro USB dısında  Yapılması gereken pin baglantıları nedir yada var mıdır ? ? 

tesladream

   Aslında elimizdeki boardlarimiz VCP olarak tanıtılabiliyormuş bir kaç video izledim ama ben yapamadım rs232 to usb convertor üm var onunla direkt bağlayabiliyorum bilgisayara (Rx,Tx,3.3V,GND pinleri ile uP a bağlıyorum).Ama bunun haricinde Max232 veya max3232 gibi entegreler ile kendin bir port yapabilirsin amaç iki taraftaki interface in  voltaj seviyelerini fixlemek.

Kaanx

Anladım hocam ben direk VCP üzerinden gitmeye devam edeyim RS232 conv yapmaya bu ara zamanım yok hazır moduller alınabilir mi ama sizin ki hazır mı kendınız mı yaptnız ?

tesladream

Ben hazır aldım dx.com da 2-3 dolar bişey usta bir hafta da geliyor eline.RS232 to USB Module yazarsan çıkıcaktır.