STM32F4 Discovery - Vizeler

Başlatan bunalmis, 24 Aralık 2011, 15:13:13


z

Bana e^st de diyebilirsiniz.   www.cncdesigner.com

fryrmnd

hocam bir bildiğiniz vardır diyorum bakınıp duruyorum ama bir türlü göremedim ve olayı  çözemedim. şimdi spu frekansı zaten pll frekansı olmuyor mu?

z

Olurmu? PLL, istenirse 432Mhz e kadar kitlenebiliyor. Halbuki CPU en fazla 168Mhz de işletilebiliyor. PLL çıkışında P bölücüsü var. Rehber Sayfa 85.

Şimdi bu durumda 2 soru biraz ezbere çözüldü gibi duruyor. 2. soruyu çözebiliyorsan bu soruyu da çözebilmen gerekir. En azından CPU clk için gerekli M, N, P değerlerini hesaplayabilirsin.

Mesela atıyorum 8Mhz xtal ile CPU yu 84Mhz de koşturmak istesek M, N ve P yi bulamazmısın?

Bana e^st de diyebilirsiniz.   www.cncdesigner.com

ErsinErce

#64
Tam istediğiniz kod değil hocam, biraz işi compiler yüklensin istedim ama hesaplama kısmında istediğim verileri bulamadım
Hiç içime sinmedi ama şimdilik bunu vereceğim, Optimizasyon ile de çalışmıyor >:( ayrıca bilginize, yarın düzeltmeye çalışırım

bu arada belki arkadaşlar kopya çekerler  :)

#define KHZ		1000
#define MHZ		1000000
#define XTAL	8*MHZ
#define F_CPU	23500*KHZ
#define F_AHB	23500*KHZ
#define F_APB1	23500*KHZ
#define F_APB2	23500*KHZ

#if F_CPU >168*MHZ
#error "F_CPU >168MHz"
#elif F_AHB >168*MHZ
#error "F_AHB >168MHz"
#elif F_APB1 >42*MHZ
#error "F_APB1 >42MHz"
#elif F_APB2 >84*MHZ
#error "F_APB2 >84MHz"
#endif

#if XTAL < 2*MHZ
#error "Crystal frequency too Low"
#elif XTAL > 63*MHZ
#error "Crystal frequency too High"
#endif

#if !((F_AHB!=F_CPU)||(F_AHB!=F_CPU/2)||(F_AHB!=F_CPU/4)||(F_AHB!=F_CPU/8)||(F_AHB!=F_CPU/16)||(F_AHB!=F_CPU/32)||(F_AHB!=F_CPU/64)||(F_AHB!=F_CPU/128)||(F_AHB!=F_CPU/256)||(F_AHB!=F_CPU/512))
#error "You can't produce AHB Frequency with current CPU Frequency"
#endif

#if !((F_APB1!=F_AHB)||(F_APB1!=F_AHB/2)||(F_APB1!=F_AHB/4)||(F_APB1!=F_AHB/8)||(F_APB1!=F_AHB/16))
#error "You can't produce APB1 Frequency with current AHB Frequency"
#endif

#if !((F_APB2!=F_AHB)||(F_APB2!=F_AHB/2)||(F_APB2!=F_AHB/4)||(F_APB2!=F_AHB/8)||(F_APB2!=F_AHB/16))
#error "You can't produce APB2 Frequency with current AHB Frequency"
#endif


void SystemInit(void){
volatile unsigned int i,j,chk_brk=0;
volatile unsigned int PLL_P=0,PLL_M=0,PLL_N=0,PLL_RG=0,PLL_Q=2;
	for(i=(XTAL/(2*MHZ));i<=(XTAL/MHZ);i++){
		for(j=32;j<433;j++){	//P=2 için
			if ((F_CPU==((XTAL*j)/(i*2)))&&(((XTAL*j)/(i*MHZ))>63)){
				PLL_P=0; //2
				PLL_M=i;
				PLL_N=j;
				chk_brk=1;
				break;
			}
		}
		if(chk_brk==1) break;
		for(j=32;j<433;j++){	//P=4 için
			if ((F_CPU==((XTAL*j)/(i*4)))&&(((XTAL*j)/(i*MHZ))>63)){
				PLL_P=1; //4
				PLL_M=i;
				PLL_N=j;
				chk_brk=1;
				break;
			}
		}
		if(chk_brk==1) break;
		for(j=32;j<433;j++){	//P=6 için
			if ((F_CPU==((XTAL*j)/(i*6)))&&(((XTAL*j)/(i*MHZ))>63)){
				PLL_P=2; //6
				PLL_M=i;
				PLL_N=j;
				chk_brk=1;
				break;
			}
		}
		if(chk_brk==1) break;
		for(j=32;j<433;j++){	//P=8 için
			if ((F_CPU==((XTAL*j)/(i*8)))&&(((XTAL*j)/(i*MHZ))>63)){
				PLL_P=3; //8
				PLL_M=i;
				PLL_N=j;
				chk_brk=1;
				break;
			}
		}
		if(chk_brk==1) break;
	}
	if((PLL_M==0)||(PLL_N==0)){
		while(1);
	}
	PLL_RG=(PLL_Q<<24)|(PLL_P<<16)|(PLL_N<<6)|PLL_M;


sorun çözüldü düzgün değerler üretiyor, şimdi kısaltmada  :)

z

#65
Eline sağlık. Kodları tamamen incelemedin ve denemedim. Gözüme ilişen bir durum var.

#if !((F_AHB!=F_CPU)||(F_AHB!=F_CPU/2)||(F_AHB!=F_CPU/4)..........

yerine

#if !((F_AHB!=F_CPU)||(2*F_AHB!=F_CPU)||(4*F_AHB!=F_CPU)..........   olması gerekmez mi?





Bana e^st de diyebilirsiniz.   www.cncdesigner.com

ErsinErce

#66
Haklısınız hocam o kısımları düzelttim, biraz kısaltma ile bu hale getirdim, Optimizasyon ile de çalışıyor
#define KHZ		1000
#define MHZ		1000000
#define XTAL	8*MHZ
#define F_CPU	47000*KHZ
#define F_AHB	23500*KHZ
#define F_APB1	23500*KHZ
#define F_APB2	23500*KHZ
#define XTAL_K	XTAL/MHZ

#if F_CPU >168*MHZ
#error "F_CPU >168MHz"
#elif F_AHB >168*MHZ
#error "F_AHB >168MHz"
#elif F_APB1 >42*MHZ
#error "F_APB1 >42MHz"
#elif F_APB2 >84*MHZ
#error "F_APB2 >84MHz"
#endif

#if XTAL < 2*MHZ
#error "Crystal frequency too Low"
#elif XTAL > 63*MHZ
#error "Crystal frequency too High"
#endif

#if !((F_AHB!=F_CPU)||(2*F_AHB!=F_CPU)||(4*F_AHB!=F_CPU)||(8*F_AHB!=F_CPU)||(16*F_AHB!=F_CPU)||(32*F_AHB!=F_CPU)||(64*F_AHB!=F_CPU)||(128*F_AHB!=F_CPU)||(256*F_AHB!=F_CPU)||(512*F_AHB!=F_CPU))
#error "You can't produce AHB Frequency with current CPU Frequency"
#endif

#if !((F_APB1!=F_AHB)||(2*F_APB1!=F_AHB)||(4*F_APB1!=F_AHB)||(8*F_APB1!=F_AHB)||(16*F_APB1!=F_AHB))
#error "You can't produce APB1 Frequency with current AHB Frequency"
#endif

#if !((F_APB2!=F_AHB)||(2*F_APB2!=F_AHB)||(4*F_APB2!=F_AHB)||(8*F_APB2!=F_AHB)||(16*F_APB2!=F_AHB))
#error "You can't produce APB2 Frequency with current AHB Frequency"
#endif


void SystemInit(void){
volatile unsigned int i,j,chk_brk=0;
volatile unsigned int PLL_P=0,PLL_M=0,PLL_N=0,PLL_RG=0,PLL_Q=2;
	for(i=(XTAL_K/2);i<=XTAL_K;i++){ // VCO girişi 1MHz-2MHz arası tara
		for(j=((64*i)/XTAL_K);j<((432*i)/XTAL_K);j++){	// 64 - 432 MHz arası tara
			if ((((XTAL/2)*j)/i)==F_CPU){ //P=2 için
				PLL_M=i;PLL_N=j;PLL_P=0;chk_brk=1;break;
			}
			if ((((XTAL/4)*j)/i)==F_CPU){ //P=4 için
				PLL_M=i;PLL_N=j;PLL_P=1;chk_brk=1;break;
			}
			if ((((XTAL/6)*j)/i)==F_CPU){ //P=6 için
				PLL_M=i;PLL_N=j;PLL_P=2;chk_brk=1;break;
			}
			if ((((XTAL/8)*j)/i)==F_CPU){ //P=8 için
				PLL_M=i;PLL_N=j;PLL_P=3;chk_brk=1;break;
			}
		}
		if(chk_brk==1) break;
	}
	if((PLL_M==0)||(PLL_N==0)){
		while(1);
	}
	PLL_RG=(PLL_Q<<24)|(PLL_P<<16)|(PLL_N<<6)|PLL_M;
    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 = 0x00400000 | PLL_RG;     // PLL ayarlansın
    RCC->CR |= 0x01000000;         // PLL calismaya baslasin  (Rehber Sayfa 95)
    while(!(RCC->CR & 0x02000000));// Pll hazir oluncaya kadar bekle
    FLASH->ACR = 0x00000600;       // Flash ROM icin 0 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 
}

ErsinErce

Kağıt kalemsiz hesaplardaki cambazlıklar pek gözükmüyor, birkaç kez düzenleme yedi ama Q çıkışına bakmaksızın kullanılabilir durumda

muhittin_kaplan

Hocam ne Yapmışsınız Siz ?

fryrmnd

evet hocam haklısınız. ben blok  şemadan bakıp pll frekansı herzaman system clock a eşit olcak diye bağlamışım kendimi. halbuki dediğiniz gibi N 432 ye kadar gidiyor. dediğim gibi ben yaptıklarımdanemin değilim hocam zaten c kodlamada da sıkıntı var. birşeyler bölük pörçük aklımda şuan birleştiremiyorum. c programlama başlığını da tam olarak inceleyemedim. gerçi kodda da pek bir zorluk gözükmüyor.
ersin hocam eline sağlık.
kitler bunalmış hocama gidecek bu gidişle.  :)


ErsinErce

hocam başka soru yok mu  :)

@muhittin_kaplan hocam o kadar karmaşık bir yapı değil, sadece bilinmeyen fazlalığı var

fryrmnd

hocam programlama konusundaki başlıkları hala bitiremedim hızla ilerliyorum. tabii yazmadan aşama kaydedilmeyecek. ama üşünmeden önceki başlıklarda cevabını yazdığınızı  gördüğüm sorularımı cevapladığınız için sağolun.
kafama takıldı. ersin hocamın programında
if((PLL_M==0)||(PLL_N==0)){
        while(1);
    }

kısmında uygun frekans değeri yoksa sonsuz döngüye girmek için sanırım. peki ramin 0x20000000 adresine 1 byetlık veri yazan kod kısmı var mı? farkedemedim de.

ErsinErce

#72
hata kodlarını başta ürettiğim için bir değişken koymadım, şu an sadece cpu üretilemiyorsa çakılıyor diğer türlü hiç derlenmiyor

ayrıca programda AHB APB1 APB2 atamalarıda eksik hocam

hatta işin içine wait state hesabınıda sokmak lazım ama soruda yazmıyor =)

z

Burada bir ara verelim. Cok az katilimci var. Diger kart sahiplerinin durumunu bilmiyoruz. Muhittin kaplanin sorusuna cevap olmasi acisindan

Asagidaki soruyu adim adim cozelim.

Xtal frekansimiz 8Mhz dir.

Islemcimizi 100Mhz de kosturmak istiyoruz. AHB frekansimiz 100Mhz, APB1 ve APB2 frekanslarimiz 25Mhz olacaktir. USB donanimini kullanmayacagiz.

Bu amaci gercekleyecek register ayarlamalarini yapalim.

Cozum:

(Burada USB donaninminin kullanilmayacak olmasi, FPLL/Q oraninin 48Mhz olmasi sartini kaldirir. Dolayisi ile FPLL icin sinirlayici faktorlerden birisi kalkmis durumdadir.
Bu aciklamayi anlamaya bu asamada calismayin)

PLLin kitlendigi frekans    FPLL=(Xtal/M)*N bagintisi ile hesaplanir.

FCPU=FPLL/P dir.   Bu konuyu anlatmistik. https://www.picproje.org/index.php/topic,35721.0.html

Uretici bazi sinirlamalar getirmis. (Rehber Sayfa 96) Bunlar;

Xtal/M orani 1...2 araliginda olmak zorundadir.

N 64...432 araliginda olmak zorundadir.

M 2...63 araliginda olmak zorundadir.

P 2, 4, 6 yada 8 olabilir.

Bu sartlar altinda

M=4 yaparak Xtal/4 den 2 buluruz.

FPLL=(Xtal/M)*N  ve FCPU=FPLL/P bagintilarindan

FCPU= 100= 2*N/P  yazariz.

O halde N/P orani 50 dir. Yani N=50P olmalidir.

P=2 alirsak N=100 cikar ve uretici sinirlamalarina uymus oluruz.

Yani PLL e 2 Mhz girer 200Mhz cikar. Bunu 2 ye bolunce de 100Mhz CPU clock elde etmis oluruz.

@Muhittin_kaplan su ana kadar her hangi bir sorun varmi?



Bana e^st de diyebilirsiniz.   www.cncdesigner.com

muhittin_kaplan