Ynt: STM32F100RB Clock Ayarları.

Başlatan muhittin_kaplan, 23 Ekim 2012, 22:18:48

muhittin_kaplan

Birtürlü PLL i aktif edip Çıkış Portlarını Max hız olan 24Mhz de çalıştıramadım. Yardıma ihtiyacım var.

mesaj birleştirme:: 24 Ekim 2012, 02:40:31

Karman Çorman Oldu. bazen 6mhz bazen 3 mhz aldım bazense hiç alamadım
Ayar Kodlarım aşağıda. Yardım eden olursa sevinirim.

#include <stm32f10x.h>

void SystemInit(void)
{

unsigned int i;
			for (i=0;i<0x00100000;i++);     // OSC oturtma ve kurtarma rutini
			
			RCC->CFGR |= 0x00012480;       //AHB,APB1,APB2 hep 2 ye bölüyor

	
			
			RCC->CR |=0X00010000;   // HSE Xtal osc calismaya baslasin        
			while (!(RCC->CR & 0x00020000));// Xtal osc stabil hale gelsin
	
			RCC->CFGR2 =0x00000000; // PREDIV1 BÖLME YOK
			RCC->CFGR |=0x00010000; //PLLSRC PLLDIV OLARAK AYARLANDI.
			RCC->CFGR |=0x00180000; //PLLMUL x8 SEÇILDI 	
			RCC->CR |= 0x01000000;            // PLL calismaya baslasin 
			while(!(RCC->CR & 0x02000000)); // Pll hazir oluncaya kadar bekle
			RCC->CFGR |= 0x00000002;        // Sistem Clk u PLL uzerinden besleyelim
			while ((RCC->CFGR & 0x0000000F) != 0x0000000A); // Besleninceye kadar bekle
			
	
		
		
		RCC->APB2ENR |= 0x0000001C;    
		GPIOC->CRL &= 0x00000000;
		GPIOC->CRL |= 0x33333333;     //PC0-7 Çýkýþ olarak ayarlandý (Max 50MHz)

		GPIOC->CRH &= 0x00000000;
		GPIOC->CRH |= 0x33333333;    //PC8-15 Çýkýþ olarak ayarlandý (Max 50MHz)

}


int main()
{

	
	

	while (1)  // sonsuz döngü
	{
		//Deger[0]++;
		
		GPIOC->ODR=0xFFFFFFFF;
			//delay(0x00000FFF);
		
		GPIOC->ODR=0x00000000;
			//delay(0x00000FFF);


	}
}


c portunu dinleyerek en fazla 6mhz alabildim. onuda nasıl yaptım şu an hatırlamıyorum.

mesaj birleştirme:: 24 Ekim 2012, 22:03:51

bakan yok ama olsun çalışmaya devam.

ne yaptıysam 6mhz i geçemedim.

muhittin_kaplan

#1
------------------------------------------------------------------------
Bu haliyle 3mhz (C portuna bağladığım lojic analizerle ölçüm alıyorum)

#include <stm32f10x.h>

void SystemInit(void)
{         
		RCC->CR |= 0x00010000;                    //HSEON=1
		while(!(RCC->CR & 0x00020000));   //Harici osilatörün stabil olmasi için bekleniliyor(6 komut çevrimi)
		RCC->CIR |= 0x00080000;           //HSERDYC: HSE ready interrupt cleared
		RCC->CR |= 0x00080000;            //Clock security system Enabled.
		RCC->CIR |= 0x00800000;           //CSSC: Clock security system interrupt cleared.
		RCC->CR |= 0x00040000;            //HSE bypassed.  

		RCC->CFGR |= 0x00000000;          //AHB configuration bölme yok
		RCC->CFGR |= 0x00000000;          //APB2 configuration bölme yok


		RCC->CFGR |=0x00010000;	          //PLL girisi PLLDIV olarak ayarland1 PLL OF iken ayarlanmal1
		RCC->CFGR |=0x00040000;           //PLL CARPMA ORANI
		RCC->CFGR2 =0x00000000;
		RCC->CR |=0x01000000;							//PLL ON
		while(!(RCC->CR & 0x02000000));		//PLL stabil oldu mu ?
		RCC->CFGR |=0x0000000A;						//system clock ayari

		RCC->APB2ENR |= 0x0000001C;       //PORT C,A,B Clock Enabled.

		GPIOC->CRL = 0x33333333;    			//C portu Max hizda çikis olarak ayarlandi
		GPIOC->CRH = 0x33333333;    

}

main()

{
	while(1)
	{
		GPIOC->ODR= 0xFFFFFFFF;     // Ledler yansin
		GPIOC->ODR= 0x00000000;
	}
}




img daki balona takılmayın

mesaj birleştirme:: 24 Ekim 2012, 23:48:07

şimdi baktımda her yanması yada sönmesi 3komut saykılı sürüyor. toplamda bir saykıl 6 komut saykılı demek.

3mhz*6=18mhz midir

mistek

1.25DMIPS/Mhz gibi bişey vardı datasheette 4 clock da 5 komut işletir demek olmuyor mu?
boş işlerin adamı ---- OHM Kanunu: I = V/R ---- Güç Formülü: P = V*I = I^2*R = V^2/R

muhittin_kaplan

#3
hımm bakayım..
da hesabım doğrumudur ? Hocalar neredesiniz ?

mesaj birleştirme:: 25 Ekim 2012, 23:26:51

Alıntı Yap24 MHz maximum frequency,1.25 DMIPS/MHz (Dhrystone 2.1) performance

mesaj birleştirme:: 25 Ekim 2012, 23:27:11

demişler.

mesaj birleştirme:: 25 Ekim 2012, 23:32:06

yani ben çıkışı high low yaptığımda 4.8mıps dolayısıyla 14.40mhz mi olur.
şu MCO çıkışı pine bir aktarayım (yapabilirsem eğer) oradan gözlemleyeceğim.

X-Fi

hocam kütüpane kullanın bit hesabı kod yazarsanız çok uğraşırsınız ayrıca kodun okunurluğu kalmaz.
http://www.coskunergan.dev/    (Yürümekle varılmaz, lakin varanlar yürüyenlerdir.)

muhittin_kaplan

Hocam Şöyle ders Kıvamında Keil ve ST kütüphanelerinin kullanımını örneklerle öğretecek bir kişi aranıyor. Açtığım tüm başlıklar başarısız oldu. bende bildiğim yol dan gitme kararı aldım.

Mucit23

Alıntı yapılan: muhittin_kaplan - 26 Ekim 2012, 10:40:33
Hocam Şöyle ders Kıvamında Keil ve ST kütüphanelerinin kullanımını örneklerle öğretecek bir kişi aranıyor. Açtığım tüm başlıklar başarısız oldu. bende bildiğim yol dan gitme kararı aldım.

+1

Bende bu konuda sıkıntı çekiyorum. Hocalarımızı göreve davet ediyorum :)

MC_Skywalker

Birşeyler yapıyoruz ama hep netten bulduklarımızı kopyalyarak.

Alıntı Yap#define BTN1 (!((LPC_GPIO1 -> FIOPIN>>11)&1))


Benim sıkıntım kolay kavrayamamak. yukarıdaki durum gibi. bana açıklayacak biri varmıdır.

muhittin_kaplan

Hocam Buton1 diye bir sabit yapılmış.
GPIO1 in FIOPIN 11i ni 1 ile ve işlemine tabi tutup tersine Buton1 ismi verilmiş

(Yanılıyormuyum ? Artık bildiğim herşreyi sorgulamaya başladım)

XX_CİHAN_XX

Evet hocam benim anladığım da bu şekilde. GPIO1 in 11. bitinin mantıksal olarak "0" olduğu konum BTN1 olarak tanımlanmış.
Yani bu pine bağlı buton (BTN1) aktif "0" olarak çalışıyor demektir.
Yirmi yaşındaki bir insan, dünyayı değiştirmek ister . Yetmiş yaşına gelince , yine dünyayı değiştirmek ister, ama yapamayacağını bilir.

MC_Skywalker

İşte ben deki burumda bu kafam okadar karıştı ki bildiklerimi sorgulanaya başladım.  LPC2138 ders notlarımı paylaşmaya devam ederken bu duruma düştüm.  >> görünce hep shift right geliyor aklıma.

XX_CİHAN_XX

#11
Alıntı yapılan: MC_Skywalker - 26 Ekim 2012, 16:10:33
İşte ben deki burumda bu kafam okadar karıştı ki bildiklerimi sorgulanaya başladım.  LPC2138 ders notlarımı paylaşmaya devam ederken bu duruma düştüm.  >> görünce hep shift right geliyor aklıma.

Aslında zaten orada shift right olarak kullanılmış. >> operatörünün başka bir kullanım şekli yok zaten.
Siz 16 bitlik bir değişkeni (Portu) 11 kez sağa ötelerseniz, o değişkenin 11. biti 0. bitinin yerine geçer. Bu sayıyı 1 ile "and" işlemine tabi tutarsanız 0. bitin konumu 1 mi 0 mı sorgulamış olursunuz. Yani 11. bitin durumunu öğrenmiş olursunuz. Buradaki 11 kez sağa ötelemenin mantığı bu.

Şuna da eminim ki derleyici bu işlemi yaparken portu 11 kez sağa kaydırmıyor direk 11. bitin konumunu sorguluyor.
Yani bu işlem
#define BTN1 (!(LPC_GPIO1 -> FIOPIN & 0x0800))

Bunun ile aynı ancak bu şekilde yazdığımızda okumak zor oluyor. Bu nedenle böyle bir yazım şekli kullanılıyor.
Yirmi yaşındaki bir insan, dünyayı değiştirmek ister . Yetmiş yaşına gelince , yine dünyayı değiştirmek ister, ama yapamayacağını bilir.

muhittin_kaplan

#12
Abi neden döndürüyoruz. ben öyle daha zor okuyorum. bırak doğrudan iki sayıyı & işlemine tabi tutayım.

mesaj birleştirme:: 26 Ekim 2012, 17:06:54

#include <stm32f10x.h>

void SystemInit(void)
{         
		RCC->CR |= 0x00010000;            //HSEON=1
		while(!(RCC->CR & 0x00020000));   //Harici osilatörün stabil olmasi için bekleniliyor(6 komut çevrimi)

	// Asagidaki komutlar HSE OSC nin probminde HSI OSC yi devreye sokar.

		RCC->CIR |= 0x00080000;         //HSERDYC: HSE ready interrupt cleared
		RCC->CR |= 0x00080000;          //Clock security system Enabled.
		RCC->CIR |= 0x00800000;         //CSSC: Clock security system interrupt cleared.
	//*********************************************************************************	
		RCC->CR |= 0x00040000;            //HSE bypassed.  
		RCC->CFGR |= 0x00000080;          //AHB configuration 2 ye bölme
		RCC->CFGR |= 0x00002000;          //APB2 configuration 2 ye bölme

		RCC->CFGR |=0x07000000;						//MCO PLL/2 YAPILDI (GPIOA.8 MCO çikis olarak ayarland1)
	
		RCC->CFGR |=0x00010000;	          //PLL girisi PLLDIV olarak ayarland1 PLL OF iken ayarlanmali
		RCC->CFGR |=0x00280000;           //PLL CARPMA ORANI 3
	
		RCC->CFGR2 =0x00000003;						// cfgr2 ile plldiv ayarlan1yor bu ayar ile osc yi önbölme yapiliyor.
		RCC->CR |=0x01000000;							//PLL ON 
		while(!(RCC->CR & 0x02000000));		//PLL stabil oldu mu ?
	
		RCC->CFGR |=0x0000000A;						//system clock ayari rehber 79

		RCC->APB2ENR |= 0x0000001C;       //PORT C,A,B Clock Enabled.


		GPIOA->CRH &=	0x00000000;
		GPIOA->CRH |= 0x33333339;					//A PORTU MAX P_UP CIKIS , MCO çikis için GPIOA.8 ALTERNATE FUNCTION
		
		GPIOC->CRL &= 0x00000000;    			//C portu Max hizda çikis olarak ayarlandi
		GPIOC->CRH &= 0x00000000;    

		GPIOC->CRL |= 0x33333333;    			//C portu Max hizda çikis olarak ayarlandi
		GPIOC->CRH |= 0x33333333;    

}

main()

{
	while(1)
	{
		GPIOC->ODR= 0xFFFFFFFF;     // Ledler yansin
		GPIOC->ODR= 0x00000000;
	}
}


Core Clock 24mhz. A8 pininden aldığım sinyali ölçtüm (MCO=PLL/2).

XX_CİHAN_XX

Yoğurt yeme meselesi abi :)
Aslında alışınca kaydırma mantığı daha okunaklı geldi bana da. İlk zamanlar bende yadırgıyor ve alışıla geldik şekilde doğrudan bit mask değeri ile and liyordum.
Yirmi yaşındaki bir insan, dünyayı değiştirmek ister . Yetmiş yaşına gelince , yine dünyayı değiştirmek ister, ama yapamayacağını bilir.

muhittin_kaplan

Bu konuyla alakalı değil ama CM4 ve CM3 lerin NVIC reğister leri aynı mı ? daha önceden topladığım dökümanlarda CM3 lerle CM4 leri aynı yazmışım.
NVIC in ISER registerleri aynı degerlerimi barındırıyor ?