STM32F4 ile vb.net 2010 express editionla grafik

Başlatan muhittin_kaplan, 13 Şubat 2012, 22:28:57

muhittin_kaplan

STM32F4DISCOVERY  kartlarla yavaş yavaş projeler ortaya çıkmaya başladı. Örnekleri çoğaltmak için elimizden geldiğinde çalışmaya devam edeceğim. Bu projede kart üzerinde bulunan MEMS LIS302DL ivme ölçer ile SPI üzerinden bilgiler alınıyor. Alınan bu bilgiler USART üzrinden vb.net 2010 express edition da yazılmış bir grafik arayüzüne aktarılıyor.
       Aynı yöntemi kullanarak analog dijital çevirici ile scop yapailirim düşüncesideyim.


#include "STM32F4xx.h" 

 
unsigned char WAdr,RAdr;
char RxBuf[128];
char TxBuf[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 

     RCC->APB2ENR|=0x00000100;  // ADC saat kaynağını aktif ettik. 
     //PB->MODER.p0 = PORT_ANALOG; // PortB0 analog
     GPIOB->MODER |= 0x00000003; 

     ADC1->CR1 |=0x00000100; //  ADC scan modunda çalışacak.
     ADC1->SQR3 |= 0x00000008; // Çevrime ilk girecek kanal 8. (PB0)
     ADC1->CR2 |=0x00000003;   // AD converter'i açtık. Sürekli çevirim yapacağımızı belirttik. 

     GPIOA->AFR[0]|=0x55500000;       // SPI1 secelim (Rehber Sayfa 141), Hard Sayfa 49
     GPIOA->MODER|=0x0000A800;       // A7,A6,A5 Alternatif fonksiyon
     RCC->APB2ENR|=0x00001000;       // SPI1 clk enable   //   GPIOE3 pinini output tanimlayalim (LIS302DL SPI/I2C secimi)   
     GPIOE->MODER  = 0x00000040;     // GPIOE nin 3 nolu pini cikis tanimlandi
     GPIOE->OSPEEDR= 0xFFFFFFFF;     // GPIOE nin tum cikislari en yuksek hizda kullanacagiz
     GPIOE->BSRRL=0x0008;            // GPIOE3=1; LIS302DL CS=1   
     SPI1->CR1=0x00000B7F;           // SPI1 16 bit, master , fulldublex vs
     SPI1->CR2=0X0000;

} 
 
/*********************************************************************************
      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

signed char  SPI_CMD(short DAT)    
{
signed char RxDat;
      GPIOE->BSRRH=0x0008;      // LIS302DL CS=0
      RxDat=SPI1->SR;           // AMAC DELAY (kalmasinda fayda var)
      SPI1->DR=DAT;             // Komutu yukle
      while(!(SPI1->SR&0x01));  // RX BUF bos ise beklemede kal  
      while(SPI1->SR&0x80);     // BSY durumu varsa kalkmasini bekleyelim
      RxDat=SPI1->DR;           // Cipten gelen veriyi oku 
      while(SPI1->SR!=0x02);    // CS=1 yapmadan once cipin orjinal duruma donmeyi bekleyelim
      GPIOE->BSRRL=0x0008;      // LIS302DL CS=1
      return(RxDat);
}   
signed char Write(char Adr,unsigned char Data)
{
      return(SPI_CMD(((Adr&0x3F)<<8 )|Data));
}
signed char Read(char Adr)
{
      return(SPI_CMD(((Adr&0x3F)|0x80)<<8 ));
}
      
 
int main()
{
signed char who, b;
int i;
      UsartInit();  
 

      if(Read(0x0F)==0x3B)       // Who are you ?
       {
          Write(0x20,0x47);  // Data Rate=100Hz, Full Scale=2g, Activate, x,y,z enable
        }
          

      while(1){
               who=Read(0x27);   // Statusu ogrenelim. Kim hazir kim değil?
               if (who&1) 
                {
      				b=Read(0x29);
                }  
			   		
					SendChar(b);
					 for (i=0;i<0x00200000;i++);
        		}  	
                                
}


PC programı için http://www.4shared.com/rar/sjOjaWyV/Serial_Chart_1.html . Pc arayüzünün  kodlarında düzenleme yapmanız için VB.net express edition un yüklü olması gerekir.

projenin çalışma videosu


fryrmnd

hocam elinize sağlık güzel olmuş. darısı benim başıma. baya saldım ama.

kadirnohut89

Selam Muhittin Hocam yaptığınız ivme ile ilgili uygulamanın vb.net 2010 express editionla grafik kodlarını gönderebilirmisiniz .

muhittin_kaplan


diot


muhittin_kaplan

Hocam Dosya Silinmiş Garip birşekilde. Bulup Ekleyeyim.