SystemInit fonksiyonu hakkında

Başlatan l0rd, 06 Şubat 2015, 14:41:48

l0rd

Merhaba , bu hafta verdiğim karar ile yeni başlamış olduğum pic mikrodenetleyicileri öğrenme işini bırakıp dün arm mimarisi üzerinde çalışmaya karar verdim.Bilmiyorum doğru mu yaptım?(Bu konuda düşüncelerinizi alabilirim) Bugün ise bu konudaki araştırmalara başladım bundan sonra forumda takılıp konuları okuyup anlamadığım yerleri sorup bu işi halletmeyi düşünüyorum.

https://www.picproje.org/index.php/topic,35896.0.html
Bu konudaki ikinci örnekte (User butonuna basıldığında ledleri yakan basılmadığında ledleri söndüren program)    SystemInit() fonksiyonunda yapılan ayarlamalar genel olarak mı yapıldı yani bu örnek için bukadar ayar yapmaya gerek var mı?

SystemInit() fonksiyonumuz

void SystemInit()
{
unsigned int i;

    (*((int*)0xE000ED88))|=0x0F00000;  
    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 
}


Böyle değilde aşağıdaki gibi olsaydı ne olurdu?

void SystemInit()
{
	RCC->AHB1ENR |= 0x0000000F; 
	GPIOD->MODER = 0x55000000; 
	GPIOD->OSPEEDR= 0xFFFFFFFF;
 
}


Yani demek istediğim böyle basit örnekler içinde osc ayarlarını vs yapmaya gerek var mı?
what you do that defines you

z

Gerek yok.

İşlemcinin power on aşamasında firma tarafından öngörülen clock ayarlamaları ile de işini görebilirsin. Tabiki bu durumda işlemci hızını sorun etmeyeceksin. Yani Ferrari arabayı 60 ile sürmeye razı olacaksın.
Bana e^st de diyebilirsiniz.   www.cncdesigner.com

l0rd

Yani hocam kısa olan SystemInit() fonksiyonu kullandığımda firmanın öngörülen clock ayarlarıyla çalışmış oluyorum.Bu fonksiyonla mikroişlemci işlemleri yapabileceğinden daha yavaş yapıyor.Fakat bu program için sorun olmuyor.Ama Uzun olan SystemInıt () fonksiyonu daha avantajlıdır.Doğru anlamışmıyım :)

Eğer ben buton ile ledlerin durumlarını değiştirmek isteseydim ve butona hızlı hızlı bassaydım öngörülen hız buton kaçırmadan sonucu ledlerde gösterebilir miydi? (Kısa olan SystemInıt fonksiyonu ile )
what you do that defines you

MC_Skywalker

en basit açıklalmayı z hoca yapmış.

SystemInit() ile işlemcinn harici xtal/rezenator vb. ile çalışıp pll üsütünden sistemi beslemsini sağlar. bu kodları yazmazsan ve MCU içinde RC osilatör baındırıyorsa onunla çalışır ama MCU içinde RC osilatör yoksa?

systemInit() kısımını tam yapılması çalışma anında oluşaca Fault/Halt durumlarının önüne geçmiş olur. kodunuzun uzadığını düşünüyorsanız   bu tanımları header file olarak yapar kaydersiniz sonra projenizin içinden çağırısınız.