STM32F407VG PLL aktifleştiremedim.

Başlatan ziyaretci, 20 Ekim 2018, 19:14:52

ziyaretci

Merhaba, STM32F407VG'yi ASM ile kodlamaya başladım. Başlangıç için, harici osilatör, dahili osilatör ve prescaller ayarlarını test ettim, değiştirdim. Bunlar sorunsuz bir şekilde oldu. Fakat bir türlü PLL ayarını aktifleştiremedim. PLLON yaptıktan sonra PLLRDY'e 1 bilgisi yüklenmiyor.

Aşağıda aktifleştirmek için yaptığım ayarlar var.
LDR 	R1, =RCC_CR
	LDR 	R0, [R1]
	LDR	R0, =0x00010000
	STR	R0, [R1]    ;; HARICI OSILATOR ETKINLESTIRILDI.
	
TTR
	LDR 	R1, =RCC_CR
	LDR 	R0, [R1]
	AND.W 	R0, #0x00020000
	CBNZ	R0, BEKLERCC
	B	TTR

BEKLERCC	
	LDR 	R1, =RCC_CFGR
	LDR 	R0, [R1]
	ORR.W	R0, #0x00000002 ;PLL selected as system clock
	STR	R0, [R1]   

	
	LDR 	R1, =RCC_CFGR
	LDR 	R0, [R1]
	ORR.W	R0, #0x0000B400  ; PLL selected B4
	STR	R0, [R1]    ;
	
	
	LDR 	R1, =RCC_PLLCFGR
	LDR 	R0, [R1]
	ORR.W	R0, #0x00000008  
	STR	R0, [R1] 

	LDR 	R1, =RCC_PLLCFGR
	LDR 	R0, [R1]
	ORR.W	R0, #0x00005400  
	STR	R0, [R1]  
	
	LDR 	R1, =RCC_PLLCFGR
	LDR 	R0, [R1]
	ORR.W	R0, #0x00400000  
	STR	R0, [R1]  
	
	LDR 	R1, =RCC_CR
	LDR 	R0, [R1]
	ORR.W	R0, #0x01000000
	STR	R0, [R1]    
		
TTR2
	LDR 	R1, =RCC_CR
	LDR 	R0, [R1]
	AND.W 	R0, #0x02000000
	CBNZ	R0, BEKLERCC2 
	B       TTR2          ; PLL ON hazır mı diye kontrol ettiğim
                              ;bu blokta takılıyor program. 
                              ;Sanki PLL nin aktif olması için bir ayarı
                              ;daha bekliyor çekirdek. Ama hangi?
    
BEKLERCC2	

	LDR 	R1, =RCC_CFGR
	LDR 	R0, [R1]
	LDR	R0, =0xC0E00002  
	STR	R0, [R1]   

 PLLN=101010000(336)
 PLLM=1000(8)
 PLLP=00(0) değerlerini yükledim. 168MHz olarak kullanmak istiyorum.

CLR

Xtal frekansını söylersen yardımcı olurum.
Knowledge and Experience are Power

CLR

STM32F4 Discovery board kullanıyorsan
xtal = 8mhz

PLLM=8
PLLN=336
PLLP=2 olmalı
Knowledge and Experience are Power

ziyaretci

Alıntı yapılan: CLR - 21 Ekim 2018, 01:29:08STM32F4 Discovery board kullanıyorsan
xtal = 8mhz

PLLM=8
PLLN=336
PLLP=2 olmalı

Hocam dün akşam denedim o şekilde. Ama RCC_CR register'ında PLLON yapıp PLLRDY bitini test ettiğim bloktan çıkamıyor. Yani ilgili bit 1 olmuyor.

Algoritmada mı hata var acaba?
1-RCC_CR 'de HSE seçtim.
2-HSERDY'i bekledim.
3-RCC_CFGR'de sistem clock'u HSE yaptım.
4-RCC_PLLCFGR' de M, N, P, Q değerlerini yükledim.
5-RCC_CR'de PLLON yaptım.
6-PLLRDY bekledim.(Gözüm yollarda kaldı, gelmedi)
7-RCC_CFGR'de system clock'u PLL seçtim.


Zoroaster

ARM dersleri basliginda 407 kitinin init rutinlerinde registerlere yukleme yaparak bu islemleri yapmistik. 
Ordaki C rutinlerine bir goz at.
Seytan deliginden kacti.

CLR

Aşağıda cortex m3 için bit bazında RCC init var, asm'ye çok yakın, oradan faydalanabilirsin.

http://www.uicroarm.com/stm32f103-ozel-register-kullanimi-ve-systick

Eğer discovery kullanıyorsan ve xtal bazı modellerde farklılık göstermiyorsa(16mhz,25mhz gibi)
xtal = 8mhz  olacak, PLL ayarları aşağıdaki gibi çalışması gerekiyor.

PLLM=8
PLLN=336
PLLP=2
PLLQ=7
Knowledge and Experience are Power

ziyaretci

Stackoverflow'da şöyle bir yorumla karşılaştım. CPU clock frekansı 16MHz'den sonra ilgili ayarı yapmak gerekiyormuş.
Alıntı YapTake a look in the reference manual for "Relation between CPU clock frequency and Flash memory read time". It says what for the CPU speed higher than 16MHz you should set flash latency for 1WS (wait state). Something like this before setting PLL as clock source:
FLASH->ACR  = FLASH_ACR_ACC64;   // 64-bit access
FLASH->ACR |= FLASH_ACR_LATENCY; // one wait state
FLASH->ACR |= FLASH_ACR_PRFTEN;  // prefetch enable

https://stackoverflow.com/questions/31407505/pll-clock-configuration

FLASH_ACR register'ında ilgili biti set edip, gecikmeyi verince, PLLRDY set oldu. Tabi PLLON yapmadan önce bu değeri yükledim.

Kartta örnek  kod olarak 4 ledi sıra ile yakıyorum, yazılımsal 1 saniye gecikme oluşturup. Harici HSE(xtal=8MHz) aktif iken ki hız, PLLN değerini 16 yaptığımdaki hızdan farklı. Bunun nedeni ne olabilir.

N=336
M=8
P=2
Q=7

N'yi 16 yapıyorum, yani sistem clock'u olarak 16/2=8MHz olması gerekiyor. Ama PLL kapalı, HSE(8MHz/1) açık iken ki hızdan farklı bir hızla ledler dönüyor. Bu farklılık neden oluyor? Aynı olması gerekmiyor mu?

CLR

http://www.uicroarm.com/stm32f103-ozel-register-kullanimi-ve-systick

Burada dikkat ettiysen PLL on yapılmadan flash latency=2 yapmışım.

N=336
P=2 olursa ve PLL on ise işlemci 168Mhz'de çalışır

PLL kullanılmıyorsa N,P,Q,M'nin ne olduğunun önemi yok, bu değerler main PLL'in bir parçası.
Bu durumda işlemci 8mhz'de çalışır.
Knowledge and Experience are Power

ziyaretci

@CLR yardımlarınız için teşekkür ederim. Verdiğiniz bağlantıdaki kodu incelemiştim ama dikkat etmemişim. Şimdi tekrar baktım evet dediğiniz gibi.

Yani PLL'yi dediğiniz değerlerde aktif ettim, 168MHz için. Hızlandığı görülüyor, ledlerin hareketinden. Yalnız şunu merak ediyorum. PLL 168MHz için N değeri 366. 366/2=168. Burası tamam. Sadece N değerini 16 yaparsam ilgili formülden 16/2=8MHz olarak CPU frekansı ayarlanıyor. Burasıda tamam. Ama PLL'açıkken ki 8MHz ayarı, PLL kapalıykenki HSE=8MHz ayarı uygulamada farklı seyrediyor.

Yani mantıken ikisinde de ledler eşit süreyle yanmalı ama yanmıyor. Bunun nedeni ne olarabilir onu merak ediyorum.


tekosis

#9
Cubemx programındaki frekans hesaplama eklentisini kullanırsanız hangi değerin ne işe yaradığı daha da somutlaşır, gözünüzde canlanır.
İlim ilim bilmektir, ilim kendin bilmektir, sen kendin bilmezsin, bu nice okumaktır.

CLR

@erkantr67

PLLN, 16 yapılamaz ki, minimum değeri 50

Knowledge and Experience are Power

ziyaretci

Alıntı yapılan: CLR - 21 Ekim 2018, 21:51:14@erkantr67

PLLN, 16 yapılamaz ki, minimum değeri 50


;D

Cahillikten -50 bile yaparım ben onu. :) Kocaman yazıyor registerda öyle ya. :)

 Şunun 168MHz'de çalıştığını bir tespit etsem seviye atlayacağım. TIMER üzerine uğraşıyorum şimdi. Oradan saydıracağım. Nasıl olsa TIMER modülüde 168MHz ile besleniyor. Hazır gecikme ile tam tutmuyor.

CBZ  1 cycle
B    3 cycle
SUBS 1 cycle

Yukarıdaki gibi 1/[5*(1/168M)] buradan çıkan 1 saniyelik değeri ayarlıyorum ama 2 saniye oluşuyor. Bende şüpheleniyorum acaba 84MHz de mi çalışıyor diye. PLLCFGR'yi kontrol ettim kaç defa sorun yok, yani göremedim. Bölme oranlarıda 0'da, yani 1.

Kısa yoldan ikna olacağım bir şekilde denetleyicinin kaç MHZ'de çalıştığını nasıl anlarım? Var mı böyle bir yol?

CLR

debug modunda çalıştırıp aşağıdaki formülden frekansı bulabilirsin,
veya usart yazıp, usarttan yine aşağıdakileri gönderebilirsin

PLL_VCO = (8Mhz(HSE) / PLLM) * PLLN
Sys_Frq = PLL_VCO / PLLP;

veya

http://www.uicroarm.com/stm32f103-ozel-register-kullanimi-ve-systick  'daki gibi

systick ve interuptı kullanıp 1ms'de bir interrupt oluyormu bakarsın
veya DelayMS yazıp yaklaşık olarak izleyerek anlarsın.   



 
Knowledge and Experience are Power

Mucit23

MCO aracılığıyla tam olarak kaç mhz'de çalıştığını görebilirsin. Tabi osiloskop veya frekansmetre lazım :)

M_B

Alıntı yapılan: CLR - 21 Ekim 2018, 14:29:46Aşağıda cortex m3 için bit bazında RCC init var, asm'ye çok yakın, oradan faydalanabilirsin.

http://www.uicroarm.com/stm32f103-ozel-register-kullanimi-ve-systick

Eğer discovery kullanıyorsan ve xtal bazı modellerde farklılık göstermiyorsa(16mhz,25mhz gibi)
xtal = 8mhz  olacak, PLL ayarları aşağıdaki gibi çalışması gerekiyor.

PLLM=8
PLLN=336
PLLP=2
PLLQ=7

Merhaba @CLR Hocam;
Sitenizdeki http://www.4shared.com/archive/twPgPx16/Stm32_Systick.html
Başka  bir upload sitesine yukleme durumunuz olabilir mi ?
http://www.4shared.com/ Burdan indirmede sorun yaşıyorumda
Teşekkürler

İmkanın sınırlarını görmek için imkansızı denemek lazım.                                                             Fatih Sultan Mehmet