STM32F407 Cortex M4 şamataları

Başlatan bunalmis, 16 Ekim 2011, 17:14:50

muhittin_kaplan

nvic i wiev de değil peripheral butonuyla görebiliyorsunuz

muhittin_kaplan


z

Alıntı Yap...Ayrica bazilarnin view menusunde ayri ayri tanimlanmasina ragmen header'da array olarak tanimlanmasi nedendir?

Bu benim de canımı sıkan bir durum. Bu registerleri ilgili h dosyada değiştirip array yapısından kurtarmak mümkün. Ancak bu kez de bir başkasının yazdığı programları derlemek istediğimizde sorun çıkar.

Aslını sorarsan rehber dokumanda ne görüyorsam programda da onu yazmak isterdim.

GPIOA->MODER yerine GPIOA_MODER gibi. Fakat bu register tanımlarını yeni baştan yapmayı ve bahsettiğim uyum sorununu beraberinde getirecek.
Bana e^st de diyebilirsiniz.   www.cncdesigner.com

CLR

Alıntı yapılan: bunalmis - 16 Şubat 2012, 11:55:05

Bu benim de canımı sıkan bir durum. Bu registerleri ilgili h dosyada değiştirip array yapısından kurtarmak mümkün. Ancak bu kez de bir başkasının yazdığı programları derlemek istediğimizde sorun çıkar.

Aslını sorarsan rehber dokumanda ne görüyorsam programda da onu yazmak isterdim.

GPIOA->MODER yerine GPIOA_MODER gibi. Fakat bu register tanımlarını yeni baştan yapmayı ve bahsettiğim uyum sorununu beraberinde getirecek.


Uyum sorunu olmaz, hem standart lib'i eklersin hemde senin yazdığın tanımlamaları, yani ikisinide kullanabilirsin. Açıkçası ben öyle kullanıyorum, duruma göre mix yapıyorum, bazı durumlarda benim yazdığım tanımlamaları yeri geldiğinde ST lib.i ekliyorum. Bu da işi hızlandırıyor.


Knowledge and Experience are Power

z

Haklısın neden sorun çıksın ki? Başkasının yazdığı programda zaten onun header dosyalarını kullanacağız kendimizinkini değil.

Fakat STM32F4 ün header dosyası çok kabarık ve bunu istediğim formata getirmem zaman alır uğraşacağımı sanmıyorum.
Bana e^st de diyebilirsiniz.   www.cncdesigner.com

muhittin_kaplan

Hocam Bu Z eksenini neden ölçemiyorum yada ölçüyorumda fark mı etmiyorum bu MEMS ile

z

#876
Sorun yok.

Asagidaki program Z yonundeki ivmelenmeye gore ledleri yakiyor.

#include "STM32F4xx.h"
 
unsigned char PWM[8];  // PWM registerler
unsigned char SRG[8];  // Shadow Registerler
unsigned char CNTR;    // PWM Counter

/*****************************************************************************************************
         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;
   
     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 =1;                   // 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
     
} 
void TIM7_IRQHandler()
{
unsigned short d,i,j;
 
    TIM7->SR=0;                       // Timer Int Flagini silelim 
    d=GPIOD->ODR | 0xFF00;
    CNTR++;
    if(!CNTR)
      {
        for(i=0;i<8;i++) SRG[i]=PWM[i]; 
      }
    j=0x8000;
    for(i=0;i<8;i++)
      {
       if (CNTR>=SRG[i]) d&=~j;
       j=j>>1;
      } 
    GPIOD->ODR=d;
} 
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()
{
int i;
signed char z[16];  // PWM registerler
signed char who,zo, b;
signed short a;   
      
      if(Read(0x0F)==0x3B)       // Who are you ?
       {
          Write(0x20,0x47);  // Data Rate=100Hz, Full Scale=2g, Activate, x,y,z enable
          while(!(Read(0x27)&4)); zo=Read(0x2D);
          
          while(1)
            {
               who=Read(0x27);   // Statusu ogrenelim. Kim hazir kim deðil?
               if (who&4) 
                {
                  a=z[0];
                  b=Read(0x2D)-zo;
                  for(i=15;i>0;i--){ z[i]=z[i-1]; a+=(signed short)z[i];}
                  z[0]=b; a=a>>2;
                  if (a>=0) { PWM[0]=a; PWM[2]=0; }
                  else      { PWM[0]=0; PWM[2]=-a;}
                }  
            }
       }
       
      TIM7->DIER=0x0000;              // Update Int disable
      while(1)
       {
         for(i=0;i<0x1000000;i++);
         GPIOD->ODR^=0x0000F000;
       }  
       
}
Bana e^st de diyebilirsiniz.   www.cncdesigner.com

sseedat

bu program neden çalışmadı fikri olan varmı.

#include "STM32F4xx.h";
#define led1 0x00001000;
#define led2 0x00002000;
#define led3 0x00004000;
#define led4 0x00008000;

void SystemInit()
{
volatile int i;
for(i=0;i<0x00100000;i++);
RCC->CFGR=0x00009400;
RCC->CR |=0x00010000;
while(!(RCC->CR & 0x00020000));
RCC->PLLCFGR=0x07405408;
RCC->CR |=0x01000000;
while(!(RCC->CR & 0x02000000));
FLASH->ACR = 0x00000605;
RCC->CFGR |=0x00000002;
while ((RCC->CFGR & 0x0000000F) != 0x0000000A);
RCC->AHB1ENR |= 0x0000000F;
GPIOD->MODER=0x55000000;
GPIOD->OSPEEDR=0xFFFFFFFF;
}
void delay()
{
unsigned int s;
for(s=0;s<0x800000;s++);

}

int main()
{

while(1)
{
int i=0;
if(GPIOA->IDR & 0x00000001)
{
i++;
if(i==1)
{
GPIOD->ODR=led1;
}
else if(i==2)
{
GPIOD->ODR=led2;
}
else if(i==3)
{
GPIOD->ODR=led3;
}
else if(i==4)
{
GPIOD->ODR=led4;
}
if(i>4)i=0;
}

   }
}

Görünmez bir mezarlıktır Zaman...

z

#878
1) #include "STM32F4xx.h";  satir sonundaki ; silerek warning i kaldir.

2)
while(1)
{
int i=0;
if(GPIOA->IDR & 0x00000001)
{


int i=0; satirini burdan al ve main satirinin ustune yada while(1) satirinin ustune tasi.

Butona bastiginda tum ledler cok hizli sekilde karasimsek yaparak doner,  parmagini butondan cektiginde sansina hangi led yaniyorsa o kalir.
Bana e^st de diyebilirsiniz.   www.cncdesigner.com

sseedat

dediğiniz şekilde oldu hocam
birde
;hocam   buton basılı olunca orda beklenmesini while(GPIOA->IDR); koyup bekletmeye çalıştım pek olmadı.bunu nasıl halledecem
;portun bir bitine erişme nasıl oluyor
Görünmez bir mezarlıktır Zaman...

z

if(i>4)i=0;

satirinin hemen altina asagidaki satiri ekle.

while(GPIOA->IDR & 0x00000001);

Bu durumda butona bastiginda sirasi gelen led yanar ve yeni ekledigimiz satira gelindiginde parmagimizin butondan kaldirilmasi beklenir.

while(GPIOA->IDR & 0x00000001);  0. bit 1 ise bekle demek
while(GPIOA->IDR & 0x00000002);  1. bit 1 ise bekle demek

bir bite bagli beklemenin mantigi boyle.



Bana e^st de diyebilirsiniz.   www.cncdesigner.com

Valiant2023

ya ben bu lcd deki bacakları tutturamıyorum yada baska bı problem var
GPIOD->MODER = 0x55005555;     // GPIOD nin 15, 14, 13, 12 pinleri cikis tanimlandi (LEDler icin) 0..7 arasıda çıkış
    GPIOB->MODER = 0x00000500;     // GPIOB 4 ve 5 i çıkış yaptık.

Valiant2023

kucuk bır azarla beraber  hocam EMG81 cevabı verdı  :)
azar
HD44780.c içerisinde aradığın şey yazıyor..
cevap
//     LCD data Portu GPIOD
//        RS. GPIOB.4
//        E.  GPIOB.5  olarak kullanılmıştır.
sagolsunlar umarım calıstırırım

muhittin_kaplan

hocalarım dün masanın üztünde MCU nun  iç yapısı yazılı olarak dururken bazı çevresel üniteler dikkatimi çekti
CAMERA INTERFACE ve SDIO/MMC bunlarla neler yapabiliriz ?
mesala camera ile OSD, SDIO ile sd kart çalışması yapabilimiyiz ?



muhittin_kaplan

http://www.st.com/internet/com/SOFTWARE_RESOURCES/SW_COMPONENT/FIRMWARE/stm32f10x_stdperiph_lib.zip
adresinde sdio ile ilgili örnek var ama stm32_eval_sdio_sd.c adında dosyalar kullanıyor. (epeyce örnek mevcut)
ben bunu (pin bağlantılarını uyarlayarak) kullanabilir miyim ?