Picproje Elektronik Sitesi

MİKRODENETLEYİCİLER => ARM => Cortex ARM => Konuyu başlatan: Erhan YILMAZ - 31 Temmuz 2011, 11:58:59

Başlık: STM32 PLL sorunu
Gönderen: Erhan YILMAZ - 31 Temmuz 2011, 11:58:59
Geçen bana da geldi şu discovery kitlerden. başladım keilde uğraşmaya. Hiç bir clock ayarı yapılmazsa denetleyici direk olarak 8mhz dahili osilatörden çalışıyor. Fakat dedim şuna bi pll ayarı çekim 24 mhzde koşturayım diye. Ama uygun bi PLL kodu yazıpta PLL'ye geçiremedim denetleyiciyi. Bende bıraktım uğraşmayı dahili osilatörden devam ediyorum. Elinde stm32f100 için çalıştığından emin olunan bir PLL kodu olan varsa paylaşırsa çok makbule geçer.
Başlık: Ynt: STM32 PLL sorunu
Gönderen: CLR - 31 Temmuz 2011, 12:03:42
Alıntı yapılan: tamirci_erhan - 31 Temmuz 2011, 11:58:59
Geçen bana da geldi şu discovery kitlerden. başladım keilde uğraşmaya. Hiç bir clock ayarı yapılmazsa denetleyici direk olarak 8mhz dahili osilatörden çalışıyor. Fakat dedim şuna bi pll ayarı çekim 24 mhzde koşturayım diye. Ama uygun bi PLL kodu yazıpta PLL'ye geçiremedim denetleyiciyi. Bende bıraktım uğraşmayı dahili osilatörden devam ediyorum. Elinde stm32f100 için çalıştığından emin olunan bir PLL kodu olan varsa paylaşırsa çok makbule geçer.

Merhaba

Aşağıdaki linkte 103 serisi için yazdığım koddan kopyalayabilirsin.

http://www.uicroarm.com/stm32-ozel-kutuphane#comment-101
Başlık: Ynt: STM32 PLL sorunu
Gönderen: Erhan YILMAZ - 31 Temmuz 2011, 12:05:37
Hocam çok teşekkür ederim. Dün akşam inceliyordum sizin kodlarınızı keilde derlermi diye tereddüt ettim. Hemen deniyorum.
Başlık: Ynt: STM32 PLL sorunu
Gönderen: Erhan YILMAZ - 31 Temmuz 2011, 12:08:53
Hocam aşağıdaki hataları aldım. Header olarak "stm32f10x.h" ekli projede başka bir header eklemek gerekiyor mu?

..\main.c(26): error:  #20: identifier "rcc_cr" is undefined
..\main.c(29): error:  #20: identifier "rcc_cfgr" is undefined
..\main.c(35): error:  #20: identifier "rcc_cir" is undefined
..\main.c(47): error:  #20: identifier "flash_acr" is undefined
Başlık: Ynt: STM32 PLL sorunu
Gönderen: CLR - 31 Temmuz 2011, 12:16:16
Alıntı yapılan: tamirci_erhan - 31 Temmuz 2011, 12:05:37
Hocam çok teşekkür ederim. Dün akşam inceliyordum sizin kodlarınızı keilde derlermi diye tereddüt ettim. Hemen deniyorum.

Rica ederim, Normalde benim yazdığım kütüphane olmadan derleyemezsin, Orada hangi bitlerin ayarlandığı, bit name'leri ile birlikte açık, kolayca registerlere yazabilirsin. Yok ST'nin kütüphanesini kullanıyorsan zaten bolca örnek var. LPC'lerdeki  gibi registerlere doğrudan yazmak istiyorsan aşağıdaki gibi yapabilirsin

mesela ;



rcc_cr.bits.HSION=1; için
RCC'nin CR registerinin HSION bitini set edeceksin yani aşağıdaki gibi

RCC->CR |= (u32)1;




Eğer sormak istediğin veya anlayamadığın bir nokta varsa şimdi cevaplayabilirim.


Başlık: Ynt: STM32 PLL sorunu
Gönderen: Erhan YILMAZ - 31 Temmuz 2011, 12:19:36
Anladım hocam. Bende tek tek çevirmeye başladım kodları keile göre mesela rcc_cr.bits.HSION=1; için RCC->CR |= (1<<0); komutunu yazdım bi sorun oluşturur mu? Yada RCC->CR |= (u32)(1<<0); şeklinde mi yazmalıyım?
Başlık: Ynt: STM32 PLL sorunu
Gönderen: CLR - 31 Temmuz 2011, 12:22:44
Alıntı yapılan: tamirci_erhan - 31 Temmuz 2011, 12:19:36
Anladım hocam. Bende tek tek çevirmeye başladım kodları keile göre mesela rcc_cr.bits.HSION=1; için RCC->CR |= (1<<0); komutunu yazdım bi sorun oluşturur mu? Yada RCC->CR |= (u32)(1<<0); şeklinde mi yazmalıyım?

Olmaz, aynı şekilde keil, iar hepsinde derleyebilirsin. çalıştıramadığın stm32 modulu veya özelliği olursa bana mesaj atarsın, hepsini kullandım nerdeyse. Eskisi gibi foruma pek giremiyorum.
Başlık: Ynt: STM32 PLL sorunu
Gönderen: Erhan YILMAZ - 31 Temmuz 2011, 12:24:51
Peki hocam sağolun. Stabil çalışan bi PLL kodu yazıp modülleri incelemeyi düşünüyorum. Takıldığım yerlerde sizi danışırım. İlginiz için teşekkürler.
Başlık: Ynt: STM32 PLL sorunu
Gönderen: CLR - 31 Temmuz 2011, 12:29:57
Alıntı yapılan: tamirci_erhan - 31 Temmuz 2011, 12:24:51
Peki hocam sağolun. Stabil çalışan bi PLL kodu yazıp modülleri incelemeyi düşünüyorum. Takıldığım yerlerde sizi danışırım. İlginiz için teşekkürler.

STM32 çok iyidir, tavsiye ederim, inceleyin.
Başlık: Ynt: STM32 PLL sorunu
Gönderen: Erhan YILMAZ - 31 Temmuz 2011, 14:26:54
Hocam en sonunda kurabildim pllyi. Kodu ekliyorum uğraşan arkadaşlara yardımcı olabilir. Hocam bu arada AHB, ABP1, ABP2 bus clocklarına bölmeden direk olarak pll frekansını yani 24 mhz uyguladım. Bi sorun çıkartır mı? Birde hocam kodları kontrol edebilir misiniz? Herhangi bir mantık hatası veya sakıncalı bir durum var mı? İlk defa stm32 kullanıyorum bu pll ayarını tüm kodlarda değiştirmeden (Sysclk = 3*8mhz = 24mhz) kullanmayı düşünüyorum. o yüzden emin olmak için soruyorum.

/*PLL_init
Sistem saat kaynağı olarak PLL ayarlanır.
PLL girişi olarak 8mhz harici kristal osilatör seçilir.
PLL çarpma faktörü 3 seçilir. Sistem frekansı 8*3 = 24 mhz olarak ayarlanır.
AHB = ABP1 = ABP2 = 24 mhz AHB, ABP2, ABP2 bus clockları bölünmeden direk 24 mhzde çalıştırılır.
*/

void PLL_init (void) {
RCC->CR |= (u32)(1<<0); //HSI'yı aktif et
while(!(RCC->CR & (u32)(1<<1)));   // HSI aktif olana kadar bekle
//Reset SW[1:0], HPRE[3:0], PPRE1[2:0], PPRE2[2:0], ADCPRE[1:0] and MCO[2:0]
    RCC->CFGR &= (u32)0xF8FF0000;
RCC->CR &= (u32)0xFEF6FFFF;
// HSEBYP bit clear
RCC->CR &= (u32)0xFFFBFFFF;
// PLLSRC, PLLXTPRE, PLLMUL[3:0] and USBPRE bits clear
RCC->CFGR &= (u32)0xFF80FFFF;
RCC->CIR = 0;
RCC->CR &= ~(u32)(1<<17);   // HSE ready bayrağını temizle
RCC->CR |= (u32)(1<<16);           //HSE'yi aktif et   
while(!(RCC->CR & (u32)(1<<17))); //HSE aktif olana kadar bekle

//RCC->CFGR |= (u32)(1<<7 | 1<<5); //AHB = Sysclk/8
//RCC->CFGR |= (u32)(1<<7 | 1<<6); //AHB = Sysclk/64
//RCC->CFGR |= (u32)(1<<13 | 1<<12); //APB2 = AHB/8
//RCC->CFGR |= (u32)(1<<13 | 1<<12 | 1<<11); //APB2 = AHB/16
//RCC->CFGR |= (u32)(1<<10 | 1<<9); //APB1 = AHB/8
//RCC->CFGR |= (u32)(1<<14);   //ADC_clk = APB2/4

// Pllclk=8mhz*pll mul
//RCC->CFGR |= (u32)(1<<17);   //pllin = HSE/2
//RCC->CFGR2 |= (u32)(1<<3 | 1<<2 | 1<<1  | 1<<0);   //pllin = HSE/16
RCC->CFGR |= (u32)(1<<16);   // PLL'ye HSE'yi bağla

//RCC->CFGR |= (u32)(1<<21 | 1<<20 | 1<<19 | 1<<18);   //pll mul=16
RCC->CFGR |= (u32)(1<<18);     //pll mul=3 PLLin = HSE = 8mhz, PLLout = HSE*3 = 24mhz
//RCC->CFGR |= (u32)(1<<20);   //pll mul=6
//RCC->CFGR |= (u32)(1<<21);   //pll mul=10

// pll nable
RCC->CR |= (u32)(1<<24); //PLL aç
while(!(RCC->CR & (u32)(1<<25))); //PLL hazır olana kadar bekle
RCC->CFGR |=  (u32)(1<<1); //Sysclk = PLL
RCC->CFGR &= ~(u32)(1<<0); //Sysclk = PLL
    //while(rcc_cfgr.bits.SWS!=2);
while(!((RCC->CFGR & (u32)0xc) == (u32)0x8)); //Sysclk = PLL olana kadar bekle
}
Başlık: Ynt: STM32 PLL sorunu
Gönderen: CLR - 04 Ağustos 2011, 09:32:34
Alıntı yapılan: tamirci_erhan - 31 Temmuz 2011, 14:26:54
Hocam en sonunda kurabildim pllyi. Kodu ekliyorum uğraşan arkadaşlara yardımcı olabilir. Hocam bu arada AHB, ABP1, ABP2 bus clocklarına bölmeden direk olarak pll frekansını yani 24 mhz uyguladım. Bi sorun çıkartır mı? Birde hocam kodları kontrol edebilir misiniz? Herhangi bir mantık hatası veya sakıncalı bir durum var mı? İlk defa stm32 kullanıyorum bu pll ayarını tüm kodlarda değiştirmeden (Sysclk = 3*8mhz = 24mhz) kullanmayı düşünüyorum. o yüzden emin olmak için soruyorum.

/*PLL_init
Sistem saat kaynağı olarak PLL ayarlanır.
PLL girişi olarak 8mhz harici kristal osilatör seçilir.
PLL çarpma faktörü 3 seçilir. Sistem frekansı 8*3 = 24 mhz olarak ayarlanır.
AHB = ABP1 = ABP2 = 24 mhz AHB, ABP2, ABP2 bus clockları bölünmeden direk 24 mhzde çalıştırılır.
*/

void PLL_init (void) {
RCC->CR |= (u32)(1<<0); //HSI'yı aktif et
while(!(RCC->CR & (u32)(1<<1)));   // HSI aktif olana kadar bekle
//Reset SW[1:0], HPRE[3:0], PPRE1[2:0], PPRE2[2:0], ADCPRE[1:0] and MCO[2:0]
    RCC->CFGR &= (u32)0xF8FF0000;
RCC->CR &= (u32)0xFEF6FFFF;
// HSEBYP bit clear
RCC->CR &= (u32)0xFFFBFFFF;
// PLLSRC, PLLXTPRE, PLLMUL[3:0] and USBPRE bits clear
RCC->CFGR &= (u32)0xFF80FFFF;
RCC->CIR = 0;
RCC->CR &= ~(u32)(1<<17);   // HSE ready bayrağını temizle
RCC->CR |= (u32)(1<<16);           //HSE'yi aktif et   
while(!(RCC->CR & (u32)(1<<17))); //HSE aktif olana kadar bekle

//RCC->CFGR |= (u32)(1<<7 | 1<<5); //AHB = Sysclk/8
//RCC->CFGR |= (u32)(1<<7 | 1<<6); //AHB = Sysclk/64
//RCC->CFGR |= (u32)(1<<13 | 1<<12); //APB2 = AHB/8
//RCC->CFGR |= (u32)(1<<13 | 1<<12 | 1<<11); //APB2 = AHB/16
//RCC->CFGR |= (u32)(1<<10 | 1<<9); //APB1 = AHB/8
//RCC->CFGR |= (u32)(1<<14);   //ADC_clk = APB2/4

// Pllclk=8mhz*pll mul
//RCC->CFGR |= (u32)(1<<17);   //pllin = HSE/2
//RCC->CFGR2 |= (u32)(1<<3 | 1<<2 | 1<<1  | 1<<0);   //pllin = HSE/16
RCC->CFGR |= (u32)(1<<16);   // PLL'ye HSE'yi bağla

//RCC->CFGR |= (u32)(1<<21 | 1<<20 | 1<<19 | 1<<18);   //pll mul=16
RCC->CFGR |= (u32)(1<<18);     //pll mul=3 PLLin = HSE = 8mhz, PLLout = HSE*3 = 24mhz
//RCC->CFGR |= (u32)(1<<20);   //pll mul=6
//RCC->CFGR |= (u32)(1<<21);   //pll mul=10

// pll nable
RCC->CR |= (u32)(1<<24); //PLL aç
while(!(RCC->CR & (u32)(1<<25))); //PLL hazır olana kadar bekle
RCC->CFGR |=  (u32)(1<<1); //Sysclk = PLL
RCC->CFGR &= ~(u32)(1<<0); //Sysclk = PLL
    //while(rcc_cfgr.bits.SWS!=2);
while(!((RCC->CFGR & (u32)0xc) == (u32)0x8)); //Sysclk = PLL olana kadar bekle
}


Merhaba,

24mhz'de sorun olmaz, zaten bu bus hatlarının bazılarının max. değeri 36Mhz dolayısıyla 24mhz'de sorun olmaz.
Kodda da sorun görünmüyor.