STM32F4 Discovery - Vizeler

Başlatan bunalmis, 24 Aralık 2011, 15:13:13

muhittin_kaplan

#include "STM32F4xx.h"
unsigned char WAdr,RAdr;
char RxBuf[128];
/*****************************************************************************************************
         CPU PLL ile 168Mhz de kosturulur
         AHB frekansy 168 Mhz
         APB1 frekansy 42 Mhz
         APB2 frekansy 84 Mhz
*****************************************************************************************************/
void SystemInit()
{
volatile 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
     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 
//  GPIOA da A7, A6, A5 pinleri, LIS302DL cipiyle haberlesmek icin SPI moduna alinacak   
 
     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_IRQHandler
void USART3_IRQHandler()
{
volatile int Sts;
     Sts=USART3->SR;
     RxBuf[WAdr]=USART3->DR;
     WAdr=(WAdr+1)&0x7F;
}

//-----------------------------------------------------------------------------------------------------------SPI_CMD
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);
}   
//-----------------------------------------------------------------------------------------------------------SpiWrite
signed char SpiWrite(char Adr,unsigned char Data)
{
      return(SPI_CMD(((Adr&0x3F)<<8 )|Data));
}
//-----------------------------------------------------------------------------------------------------------SpiRead
signed char SpiRead(char Adr)
{
      return(SPI_CMD(((Adr&0x3F)|0x80)<<8 ));
}
//-----------------------------------------------------------------------------------------------------------SendChar
void SendChar(int Tx) 
{
      while(!(USART3->SR&0x80));  // TX Buffer dolu ise bekle (Rehber Sayfa 646)
      USART3->DR=Tx;
}
//-----------------------------------------------------------------------------------------------------------UsartInit

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

      
int main()
{
int i;
signed char who,xo,yo;
short x=0,y=0;   

      UsartInit();

      if(SpiRead(0x0F)==0x3B)       // Who are you ?
       {
          SpiWrite(0x20,0x47);  // Data Rate=100Hz, Full Scale=2g, Activate, x,y,z enable
          while(!(SpiRead(0x27)&1)); 
          xo=SpiRead(0x29);
          while(!(SpiRead(0x27)&2)); 
          yo=SpiRead(0x2B);
          
          while(1)
            {
               who=SpiRead(0x27);   // Statusu ogrenelim. Kim hazir kim değil?
               if (who&1) 
                	{
                 	x=(SpiRead(0x29));
					SendChar(x);
					//SendChar(0x0A);
                 	}  
         
//               if (who&2) 
//                {
//                 y=(SpiRead(0x2B));            
//                 SendChar(y);
//				 SendChar(0x0A);
//                }  
            }
       }
       
      TIM7->DIER=0x0000;              // Update Int disable
      while(1)
       {
         for(i=0;i<0x1000000;i++);
         GPIOD->ODR^=0x0000F000;
       }  
       
}
//-----------------------------------------------------------------------------------------------------------STOP


programda X den aldgım bilgiyi Usart tan göndrmee çalışıyorum. Yanlış gidn birşeyler var gibi geliyor bana
değer 0-255 arasında olmalı değilmi ?
X yönünde oynattığım değişim görmem gerek ama anlamsız bir değişim var

Klein

ADC örneğini  "Örnek temel programlar" başlışındaki  accelerometer örneği ile biraz modifiye ettim. sorun yok.
Kodlarını incelemedim sorunun nerede bilmiyorum. Bu örneğe bakarak sorunun kaynağını tespit edebilirsin.

#include "STM32F4xx.h" 
#include "stdio.h" 
 
unsigned char WAdr,RAdr;
char RxBuf[128];
char TxBuf[128];
unsigned char timer_update=0; 
uint16_t adc_val;
/*********************************************************************************
 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->APB1ENR|=0x00000020;       // Timer7 CLK'u aktif edelim (84 Mhz)

     TIM7->CR1=0x0080;               // Otomatik Reload
     TIM7->PSC =839;                 // Prescaler degerimiz 839, Count frekansimiz = fCK_PSC / (Yuklenen Deger + 1) 84E6 / (840) = 100 KHz
     TIM7->ARR =5;                   // Counter, Decimal 1 olunca basa donsun. Her 20 mikrosaniye de bir timer int olusacak.
     TIM7->DIER=0x0001;              // Update Int enable
     NVIC->ISER[1] = 0X00800000;     // NVIC de Timer 7 interrupta izin verelim
     TIM7->CR1|=0x0001;              // Counter Enable

	 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);
}


void TIM7_IRQHandler()
{
TIM7->SR=0;    
timer_update=1;
} 
 
// 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()
{
unsigned int ledtime;
signed char who, b;

      UsartInit(); 
      SendTxt("PicProje"); 
			ADC1->CR2 |=0x40000000; // ADC çevrimini başlattık. 

      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);
                }  
	  	if(ADC1->SR & 0x0002){
		    ADC1->SR &= ~0x0002;
			adc_val = ADC1->DR;
		}

	  	if(timer_update){
			timer_update=0;
			if(++ledtime > 5000){
	  			ledtime =0;
				GPIOD->ODR ^= 0x0000008000;
//				sprintf(TxBuf,"ADC Degeri :%u\r",adc_val);
				sprintf(TxBuf,"X = %d\r",b);
				SendTxt(TxBuf);
	  		}
		}
	  }; 
}

muhittin_kaplan

Verdiğiniz Program Tam Olarak ne Yapıyor Hocam ?

Klein

kartın eğimine göre X ekseni ( Y de olabilir) açısını seri porttan gönderiyor.

muhittin_kaplan

"sprintf" i stdio dan mı çalışıyor hocam ?

Klein


muhittin_kaplan

Yeri Gelmişken Sorayım Ozaman.
Bu STDIO bu chip için düzenlenmiş/yazılmış olmalı değil mi ?

Klein

Doğrudan işlemci için değil ama işlemci ailesi için düzenlenmiş olması gerekebilir. emin değilim. 

muhittin_kaplan

Alıntı Yapsprintf fonksiyonu da, printf ve fprintf fonksiyonlarına benzer şekilde çalışmaktadır. Bu fonksiyonun diğerlerinden temel farkı ise, yazacağı ifadeleri bir dosyaya ya da ekrana değil, bir karakter katarına yazmasıdır

Klein


muhittin_kaplan

Şaşırmayın Hocam Dediğinizi Desteklemek için Alıntı yaptım biryerden.