Stm32f4 discovery STD lib kullanımında SystemInit()

Başlatan Kaanx, 16 Mart 2013, 15:28:33

Kaanx

Merhaba arkadaşlar stm32f4 dicovery kıtımızde system ınit dosyalarımızın ne kadar iyi olursa o kadar düzgün işleyecegını bılıyoruz (sagolsun bulent hocam bu konuda acıklamaları sayesınde ).Peki std_periph_lib kullanırken de bu systemınit dosylarını olusturmalımıyız ? Bunu neden soruyorum.Atollic true studıo kullananlar bilir systemınıt kodları system_stm32f4xx.c de yazılı bu zaman kadar library kullanarak yazdıgım kodlarda system ınıt kodlarını hıc degıstırmedım.Neden degıstırmedım ? Cunku ornegın gpıo kullanımında a portu ıcın confıg dosyamızda sunu yazıyorum
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA , ENABLE);
burada a portu ıcın gereklı ahb1 yolunu aktıf etmıs oluyorum.Bunu tekrardan SystemInit( ) de belırtmem gerekıyor mu ? kafamın karıstıgı yer burası. Diyeceksniz systemınit in  bu kadar önemli oldugunu bılıyo neden olusturmuyor ? onu da söyleyim Library kodlarını kulalnarak systemınit olusturamadıgım ıcın :) konuyu saptırmadan gercekten merak ettiğim konu bu std_lib kod yazarken kullandıgım port i2c spı ...adc blogu vs modullerı kullanırken bunları önceden system ınıtte yollarını acmalı mıyım ?

memo333

Gömülü Linux Notları --> http://linuxedu.xyz/

Kaanx

mesela atollite kı hazır systemInit kodları sunlar
void SystemInit(void)
{
  /* FPU settings ------------------------------------------------------------*/
  #if (__FPU_PRESENT == 1) && (__FPU_USED == 1)
	SCB->CPACR |= ((3UL << 10*2)|(3UL << 11*2));  /* set CP10 and CP11 Full Access */
  #endif

  /* Reset the RCC clock configuration to the default reset state ------------*/
  /* Set HSION bit */
  RCC->CR |= (uint32_t)0x00000001;

  /* Reset CFGR register */
  RCC->CFGR = 0x00000000;

  /* Reset HSEON, CSSON and PLLON bits */
  RCC->CR &= (uint32_t)0xFEF6FFFF;

  /* Reset PLLCFGR register */
  RCC->PLLCFGR = 0x24003010;

  /* Reset HSEBYP bit */
  RCC->CR &= (uint32_t)0xFFFBFFFF;

  /* Disable all interrupts */
  RCC->CIR = 0x00000000;

#ifdef DATA_IN_ExtSRAM
  SystemInit_ExtMemCtl(); 
#endif /* DATA_IN_ExtSRAM */
         
  /* Configure the System clock source, PLL Multiplier and Divider factors, 
     AHB/APBx prescalers and Flash settings ----------------------------------*/
  SetSysClock();

  /* Configure the Vector Table location add offset address ------------------*/
#ifdef VECT_TAB_SRAM
  SCB->VTOR = SRAM_BASE | VECT_TAB_OFFSET; /* Vector Table Relocation in Internal SRAM */
#else
  SCB->VTOR = FLASH_BASE | VECT_TAB_OFFSET; /* Vector Table Relocation in Internal FLASH */
#endif
}


System ınıti bu sekılde kullansam bı sorun olur mu ? yoksa bulent hocamızın örneklerınde ki bu systemInit i mi kullanmalıyım ?

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 = 0x07405408;      // PLL katsayilarini M=8, N=336, P=2 ve Q=7 yapalim
//  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 = 0x00000705;        // Flash ROM icin 5 Wait state secelim ve ART yi aktif edelim (Rehber Sayfa 55)
    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 |= 0x0000000F;    // GPIO A,B,C,D clock'u aktif edelim 
    GPIOD->MODER = 0x55000000;     // GPIOD nin 15, 14, 13, 12 pinleri cikis tanimlandi (LEDler icin)
    GPIOD->OSPEEDR= 0xFFFFFFFF;   // GPIOD nin tum cikislari en yuksek hizda kullanacagiz 
}


hangisini kullanmalıyım ?

Klein

STDLib kullanıyorsan ikisini de kullanma.

"system_stm32f4xx.c" kullan. içerisinde "SystemInit()" fonksiyonu var zaten. 

Kaanx

Hocam cok sagolun gercekten bugune kadar yaptıklarımın yanlıs oldugunu dusunmeye baslamıstım  iyi çalısmalar :)

muhittin_kaplan

#5
Konunun Üzerinden Vakit geçmiş ama F4 disko kartı ile çalışıyordum. systeminit ile ilgili bakınırken adı geçen dosyaların içerisinde xtal un 25000000hz olarak tanımlandığını gördüm. evet nereden değiştiriyoruz bunu ?

mesaj birleştirme:: 03 Temmuz 2013, 01:25:34

Dosyayı YenidenHAzırlamak Gerekiyor.Muş

diot

25 mhz yi nereden çıkardınız anlayamadım. systeminit'de 8Mhz olarak ayarlı görünüyor.

muhittin_kaplan

system_stm32f4xx.c dosyasının içeriğinde Hocam.
Yada Neden 8Mhz diye Sorayım O dosyada "Sizin İçin" 8Mhz ama 16Mhz lik OSC kullanacaksam Ne yapmalıyım ?

(Aslında Cevabını Buldum.
Stm324 clock configuration tool adında excel dosya vardı. Bu dosyayı çalıtırdığınızda istediğiniz osc ayarını yaparak adı geçen system_stm32f4xx.c dosyasını oluşturuyor)

diot

Peki ben bir soru sorayım malum discovery kit i 168Mhz yerine 200Mhz de overclock calıştırıyorlar. Bu durumda system init ayarları nasıl olacak. ?

muhittin_kaplan

Hocam dediğim Tool Müsade etmiyor.  Bülent Hocanın verdiği İnit gibi bir init hazırlanacak ve Pll At gibi koşturulacak. Ama Mantıklımı Değil, Adanalı.

camby

Aslında header içindeki HSE değerinin ne olduğu çalışma frekansını etkilemiyor. Sysclock ayarı ,bus clock ayarları yine katsayılar ve bölücülerle yapılıyor ve yine sizin hesapladığınız istediğiniz değerden çalışıyor. HSE değeri 8M de olsa 25M de olsa.

Fakat çevresel libraryleri kullanırken örneğin USART olsun , bu modüller bus clocklara bakıp kendi hızlarını alıyorlar ve katsayılardan bunu hesaplayarak öğreniyorlar. Bu da clock_update fonksiyonu.


@Diot

P-L-M-N ayarları ile oynayarak yapabilirsin sanırım. Kim kullanıyor link var mı ?


diot

Örnek : STM32F4-Discovery Motion Player


mesaj birleştirme:: 03 Temmuz 2013, 13:22:51

sanırım 250 Mhz için.
PLL_VCO = (HSE_VALUE / PLL_M) * PLL_N

SYSCLK = PLL_VCO / PLL_P

ex. 250MHz

HSE_VALUE=8MHz

PLL_M = 4

PLL_N = 250

PLL_P = 2

Kaanx

Bülent hocam cok güzel bir uygulama bu kaynak kodlarına ulaşmak mumkun mudr acaba ? Bende günlerdir forumda böyle bişi soruyorum herkese USB_HOSt üzerinden yapılmıs mp3 örneklerı ve mp3 player örneklerı uzerinde bunun üzerine kayıt etme gibi özellikler eklenebilir falan yapa bilirmiyiz böyle bişi ?