Stm32F4 Std_Lib SysInit (Örnek)

Başlatan Klein, 31 Ekim 2012, 22:23:59

Klein

Daha önceki örneklerimizde  SysInit fonksiyonu  ana programımızın içinde tanımlıydı ve osilatör başlatma rutini olarak, @bunalmış hocanın yazdığı örnekleri kullanıyorduk.   Artık kütüphane kullanarak sistemimizi ve osilatörümüzü başlatacağız.
Bunun için önce
system_stm32f4xx.c
system_stm32f4xx.h
dosyalarını  proje klasörüne kopyalıyoruz. Kütüphane klasöründe de durabilir ancak, kristal frekansımıza göre dosyada değşiklik yapacağız. Bu sebeple proje klasöründe olmasında fayda var.


Önceki SystemInit kodlarımız şöyleydi:
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 
	 
	 RCC->APB1ENR|=0x00000020;       // Timer7 CLK'u aktif edelim (84 Mhz)
	 TIM7->CR1=0x0080;               // Otomatik Reload
     TIM7->PSC =4199;                 // 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
     TIM7->CR1|=0x0001;              // Counter Enable
     NVIC->ISER[1] = 0X00800000;     // NVIC de Timer 7 interrupta izin verelim
}


Öncelikle bu fonksiyon içindeki osilatör başlatma kodlarının dışındaki kodları başka bir fonksiyonun içine alın.
Sonra  SystemInit(){} fonksiyonunu komple silin.

system_stm32f4xx.c dosyasını , proje yöneticisinden sisteme dahil edin.
system_stm32f4xx.h dosyası başka bir yerde #include edilmemişse, #include edin.

system_stm32f4xx.c  dosyasını açıp  aşağıdaki satırı
/* PLL_VCO = (HSE_VALUE or HSI_VALUE / PLL_M) * PLL_N */
#define PLL_M      25 // başka bir değer de olabilir
#define PLL_N      336


şu şekilde değiştirin.
/* PLL_VCO = (HSE_VALUE or HSI_VALUE / PLL_M) * PLL_N */
#define PLL_M      8 // MHz cinsinden kristal frekansımız. stm32F4 discovery kartında 8MHz.
#define PLL_N      336


stm32f4xx.h dosyasını açıp, aşağıdaki satırı bulun. Eğer buradaki değer kristal frekansınızdan farklıysa, düzeltin.
#if !defined  (HSE_VALUE)
  #define HSE_VALUE    ((uint32_t)8000000) /*!< Value of the External oscillator in Hz */
#endif /* HSE_VALUE */

Derleyin ve çalıştırın.

Gökhan BEKEN

Teşekkürler hocam,
ST_Lib ile frekans değiştirmek için kolay bir yöntem var mı?
Yani şöyle bir kolaylıktan bahsediyorum: Parametre olarak, kullandığım kristal değerini vereceğim, istediğim frekansı vereceğim, otomatik olarak frekansı ayarlayacak.
Böyle bir şey yoksa bile, yazmam gereken kodları üreten bir arayüz,
hiç olmadı bana M,N,Q,P değerlerini verebilecek bir hesaplama uygulaması var mıdır?
Özel mesaj okumuyorum, lütfen göndermeyin.

fgokcegoz

#2
Alıntı yapılan: meftun - 19 Mayıs 2014, 04:35:40
Teşekkürler hocam,
ST_Lib ile frekans değiştirmek için kolay bir yöntem var mı?
Yani şöyle bir kolaylıktan bahsediyorum: Parametre olarak, kullandığım kristal değerini vereceğim, istediğim frekansı vereceğim, otomatik olarak frekansı ayarlayacak.
Böyle bir şey yoksa bile, yazmam gereken kodları üreten bir arayüz,
hiç olmadı bana M,N,Q,P değerlerini verebilecek bir hesaplama uygulaması var mıdır?

"Clock configuration tool" lar var. Excel dosyası olarak hazırlanmış. Onu kullanarak rahatlıkla clock ayarları yapılabilir. Ayarları yaptıktan sonra "system_stm32f4xx.c" dosyasını üretiyor. Sizde projenize ekleyip kullanıyorsunuz.

http://yadi.sk/d/8B7M91PAQfJ9r
"Vicdanın ziyası, ulûm-u diniyedir. Aklın nuru, fünun-u medeniyedir. İkisinin imtizacıyla hakikat tecelli eder." (Bediüzzaman Said Nursi)

sfiber

Alıntı yapılan: fgokcegoz - 19 Mayıs 2014, 08:24:35
"Clock configuration tool" lar var. Excel dosyası olarak hazırlanmış. Onu kullanarak rahatlıkla clock ayarları yapılabilir. Ayarları yaptıktan sonra "system_stm32f4xx.c" dosyasını üretiyor. Sizde projenize ekleyip kullanıyorsunuz.

http://yadi.sk/d/8B7M91PAQfJ9r

libre office de basic söz dizimi hatası verdi.acaba sadece excel e mi özgü bu.

fgokcegoz

Alıntı yapılan: sfiber - 19 Mayıs 2014, 12:31:15
libre office de basic söz dizimi hatası verdi.acaba sadece excel e mi özgü bu.

libre office ile denemediğim için bilemiyorum...
"Vicdanın ziyası, ulûm-u diniyedir. Aklın nuru, fünun-u medeniyedir. İkisinin imtizacıyla hakikat tecelli eder." (Bediüzzaman Said Nursi)

Gökhan BEKEN

Ferudun hocam teşekkür ederim, inceliyorum.
Özel mesaj okumuyorum, lütfen göndermeyin.

fgokcegoz

Alıntı yapılan: meftun - 19 Mayıs 2014, 13:56:04
Ferudun hocam teşekkür ederim, inceliyorum.

Rica ederim. STM32F4x9 serisi 180MHz olunca güncellenmesini bekledik ama güncel versiyonu çıkmadı herhalde. ST nin sayfasında yeni "CUBE" librarylerine yönlendiriyor. Belki içinde mevcuttur, güncel halleri.
"Vicdanın ziyası, ulûm-u diniyedir. Aklın nuru, fünun-u medeniyedir. İkisinin imtizacıyla hakikat tecelli eder." (Bediüzzaman Said Nursi)