STM32 PLL sorunu

Başlatan Erhan YILMAZ, 31 Temmuz 2011, 11:58:59

Erhan YILMAZ

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.

CLR

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
Knowledge and Experience are Power

Erhan YILMAZ

Hocam çok teşekkür ederim. Dün akşam inceliyordum sizin kodlarınızı keilde derlermi diye tereddüt ettim. Hemen deniyorum.

Erhan YILMAZ

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

CLR

#4
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.


Knowledge and Experience are Power

Erhan YILMAZ

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?

CLR

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.
Knowledge and Experience are Power

Erhan YILMAZ

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.

CLR

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.
Knowledge and Experience are Power

Erhan YILMAZ

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
	}

CLR

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.
Knowledge and Experience are Power