STM32F4 UART3 Gelen Veriyi Kullanma Yardım

Başlatan hyperalika, 15 Ocak 2012, 18:33:40

hyperalika

Bunalmis hocamın yazdığı uart3 modülünü kullanarak Rs232 bluetooth modülü bağladım. Ve bluetooth modülünü telefonla eşleştirdim. Stm32 den telefona veri göndere biliyorum ve gelen veriyi okuyabiliyorum. Telefondan Stm32f4 e yolldığım veriyi nasıl kontrol ediceğimi bulamadım. Örneğin "FF" verisi geldiğinde D 12 deki led yansın gibi . if komutunun programınını yazamadım. gelen veriyi nasıl if de kontrol edebilirim

hyperalika

Bu konu hakkında bilgisi olan kimse yok mu?

Klein

En basit haliyle şöyle:
      if(RxBuf[0] == 'A'){					
          WAdr = 0;
           RxBuf[WAdr]=0;
           PD->ODR.pin.p13 =!PD->ODR.pin.p13;
      }

hyperalika

#3
Hocam verdiğin kodu ekledim ama veri gönderiyorum ama veri yolladığımda hiç bişi olmuyor. Koddamı bir yanlışlık var
#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;
      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); 
	  {
	     if(RxBuf[0] == 'A'){					
          WAdr = 0;
           RxBuf[WAdr]=0;
           GPIOD->ODR= 0x0000F000;
		   for(i=0;i<0x1000000000;i++);
      }
	  else GPIOD->ODR= 0x00000000;
}
}

Klein

while(1);
1- döngü bu saturda kalır senin satırlara sıtr hiç gelmez. ';' kaldır.
2- 'A' karakterinden başka hiç bir veri gönderme.  başka bir veri gelirse WAdr değerini sıfırlayamayız.

hyperalika

Saol hocam kaç gündür bunu yapmak için uğraştım. Sonunda başardım. ";" gözümden kaç mış çok saol.

hyperalika

#6
Hocam A dan başka birşey geldiğinde etkilenmesin diye . İf in dışında while döngüsünde sürekli WAdr ve RAdr yi sürekli 0 sıfırlıyor. Ve başka karakter göndersemde etkilenmiyor.

      while(1) 
      {
         if(RxBuf[0] == 'A'){					
           GPIOD->ODR= 0x0000F000;
		   for(i=0;i<0x1000000;i++);
      }
      else GPIOD->ODR= 0x00000000;
	  WAdr=0; RAdr=0;
      RxBuf[WAdr]=0;
}
}