Picproje Elektronik Sitesi

MİKRODENETLEYİCİLER => ARM => Cortex ARM => Konuyu başlatan: hyperalika - 15 Ocak 2012, 18:33:40

Başlık: STM32F4 UART3 Gelen Veriyi Kullanma Yardım
Gönderen: hyperalika - 15 Ocak 2012, 18:33:40
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
Başlık: Ynt: STM32F4 UART3 Gelen Veriyi Kullanma Yardım
Gönderen: hyperalika - 18 Ocak 2012, 21:07:24
Bu konu hakkında bilgisi olan kimse yok mu?
Başlık: Ynt: STM32F4 UART3 Gelen Veriyi Kullanma Yardım
Gönderen: Klein - 18 Ocak 2012, 21:21:00
En basit haliyle şöyle:

      if(RxBuf[0] == 'A'){
          WAdr = 0;
           RxBuf[WAdr]=0;
           PD->ODR.pin.p13 =!PD->ODR.pin.p13;
      }

Başlık: Ynt: STM32F4 UART3 Gelen Veriyi Kullanma Yardım
Gönderen: hyperalika - 18 Ocak 2012, 21:45:31
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;
}
}
Başlık: Ynt: STM32F4 UART3 Gelen Veriyi Kullanma Yardım
Gönderen: Klein - 18 Ocak 2012, 23:06:12
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.
Başlık: Ynt: STM32F4 UART3 Gelen Veriyi Kullanma Yardım
Gönderen: hyperalika - 18 Ocak 2012, 23:11:19
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.
Başlık: Ynt: STM32F4 UART3 Gelen Veriyi Kullanma Yardım
Gönderen: hyperalika - 18 Ocak 2012, 23:18:08
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;
}
}