STM32F4 Discovery - Vizeler

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

z

Sinav sorularinin samatalarini bu basliktan yapalim.
Bana e^st de diyebilirsiniz.   www.cncdesigner.com

fryrmnd

hocam m4 şamatalarda yazmıştım okudunuz mu bilmem. emin olmamakla birlikte birkaç cevap ve soru yazdım ;D.

GPIOx_OSPEEDR resette sadece B portu için 0x0000 00C0 diğerleri için 0x0000 0000 değerinde.
siz tüm bitleri set ediyorsunuz. 16 bitlik port için her bir bitin 4 farklı alabileceği değerden 11=100MHz i seçiyorsunuz. 30pf da diyor tabiii. bu kristal ile 30pf kullanıldığında anlamına mı geliyor.


System clock (SYSCLK) selection

                                   After a system reset, the HSI oscillator is selected as the system clock. When a clock source
                                   is used directly or through PLL as the system clock, it is not possible to stop it.

sistem 16MHz Rc osilatör ile çalışıyor.

RCC-CFRG reset değeri 0x0000 0000 ile çalışacağıncan AHB ve APB ler için presecale yok. Hepsi 16MHz de çalışır.

PORTlarda AHB den çalıştığına göre onlarda 16MHz de olmazmı.

GPIOD->OSPEEDR= 0xFFFFFFFF bunu yapmanın bir anlamı varmı?

hocam puanları bol verin biraz. hepsini çözdüm soru bile yazdım. ;D

z

Evet cevaplar dogru. Fakat soyle yapalim ki okuyanlara daha cok faydasi bulunsun.

Rehber yada Hard dokumana atifta bulunun sayfa numarasini verin.

Mesela

GPIOx_OSPEEDR resette sadece B portu için 0x0000 00C0 diğerleri için 0x0000 0000 değerinde. (Rehber Sayfa 149)

Sorulari sorarken cevaplarini hazirlamadim. Burda tartisacagiz.

Bu arada yazdigim kodlarin temellerini cogunlukla bir once yazdigim programlardan cut copy ile aliyorum. Dolayisi ile miras yoluyla gelen kodlarda fazlalik satirlar yakalayabilirsiniz.
Bu satirlar kaldirip atilsa bile kodlar duzgun calisacaktir. Bu tip satirlar yakalarsaniz bunlari da tartismaya acabilirsiniz.

Mesela OSPEEDR portunu daha ilk ornekten en yuksek hiza aldim. Cunku bir sonraki ornekte ele almak yada kendi merakimi gidermek icin, portun herhangi bir pininnden en yuksek kac Mhz sinyal cikabilirim sorusuna cevap arayacaktim. Dolayisi ile ilk ornekte port hizinin en yuksek hiza alma sebebi bu.

Ote yandan, kart uzerinde sadece 4 led oldugu halde bu 4 ledin bagli oldugu pinlerin hizini maxa almadim da toptan tum portun tum pinlerini en yuksek hiza aldim sorusu akla gelebilir. Cevabi, boyle yapmamin zarari yok. Fazladan kafa yormak istemedim.

Gene de kafaniza takilan sorulari sorun bazilarinin cevabi yukaridakiler kadar basit olabilir bosu bosuna kafanizi kurcalamasin.

Alıntı YapSystem clock (SYSCLK) selection

                                   After a system reset, the HSI oscillator is selected as the system clock. When a clock source
                                   is used directly or through PLL as the system clock, it is not possible to stop it.

sistem 16MHz Rc osilatör ile çalışıyor.

Hangi sayfada yaziyor? Gene mesajinizda referans verin.

Bu cevaba ilave olarak asagidaki eklentiyi de yapmanizi arzu ederim.

RCC_CR registeri  (Rehber Sayfa 93) reset ardindan 0x0000 XX83 degerini alir.

Bunun anlami HSI High Speed Internal osilator on ve PLL off vaziyettedir.


Yukaridaki blok semadaya bakalim.  (Rehber Sayfa 85) (Blogu sadelestirmistim)

HSI osc calismakta ok. Yukaridaki blok semada HSI, HSE ve PLL den clock secimi yapan SW komutatoru hangi pozisyonda?

RCC_CFGR registeri (Rehber Sayfa 97)  resette 0x0000 0000 degerini almaktadir SW1, SW0 bitleri 0 olacaktir.

Bu bitlerin 0 olmasi asagidaki tablodan da gorulecegi uzere HSI nin sistem osilatoru olarak kullanildiginin gostergesidir.

00: HSI oscillator selected as system clock
01: HSE oscillator selected as system clock
10: PLL selected as system clock
11: not allowed


Seklinde cevap yazarsaniz mesajlar okunasi zevkli ve ogretici olacaktir.

Evet CPU muz 16Mhz ile kosuyor.

AHB ve APB frekanslari icin RCC clock configuration register (RCC_CFGR) (Rehber Sayfa 97) ya bakalim.

Bu registerin resetteki default degeri 0x0000 0000 imis. Bu durumda .......

Seklinde devam edelim.
Bana e^st de diyebilirsiniz.   www.cncdesigner.com

fryrmnd

evet hocam haklısınız. sayfa vs belirtirsek daha güzel olacak. öğrenciyiz biz mazur görün. registerlar felan programdan takip ederken nerden neye baktığımı bende karıştırmaya başladım.
örnek programlarınızda void SystemInit() içini dediğiniz gibi miras yoluyla doldurmuşsunuz. aslında ben biraz da fazlalılığından değilde tam emin olamadığım için(clock mekanizmasından tam emin olamadığımdan) sordum. yani portlar şu durumda 16MHz de mi yoksa GPIOD->OSPEEDR ayarlmasıyla başka bir şekilde daha yüksek frekanslarda mı çalışır merak etmiştim.

z

Mesela ornek kodlarda RCC->AHB1ENR |= 0x0000000F;    // GPIO A,B,C,D clock'u aktif edelim satirini goreceksiniz. Halbuki uygulamada atiyorum sadece D portu kullaniliyor A,B,C portlari kullanilmiyor.

Neden GPIO A,B,C clock sinyallerini aktif ettiniz diye dusunebilirsiniz. Gene cevabi cok basit. Nasil olsa sonraki ornek kodlarda bu portlari kullanma durumum var simdiden acayim gibi basit bir  mantikla bunlari da harekete gecirdim.

Cipin icinde, clock isareti aktif edilen her donanim akim cekmeye baslar ve cipin guc tuketimini arttirir. Bu aklinizda bulunsun.




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

fryrmnd

peki hocam.anlaşılmıştır. sorularınızı takip ediyoruz. içinden çıkabilirsem açıklayıcı cevaplar vermeye çalışırım. teşekkürler.

fryrmnd

hocam 23.5MHz için uygun P,Q ve N değerleri çıkmıyor gibi geliyor bana. usb yi de 48 alırsak tabi.

z

USB iyi isin icine karistirma. 48Mhz uretmeyecegiz.
Bana e^st de diyebilirsiniz.   www.cncdesigner.com

mozkan87

Alıntı yapılan: fryrmnd - 24 Aralık 2011, 18:07:50
hocam 23.5MHz için uygun P,Q ve N değerleri çıkmıyor gibi geliyor bana. usb yi de 48 alırsak tabi.
Evet bende aynı şekilde buldum ama usb frekansını 48 MHz'i geçemeyecek şekilde ayarlarsak sonuç çıkıyor.

Edit: Ben yazarken siz cevap yazmışsınız hocam.

sayment

Hocam final dönemi vize mi olur :(

z

Ne zaman isterseniz o zaman vizeye girin

Fakat pesin pesin soyleyeyim, en az 70 alamayanin kartini alirim.
Bana e^st de diyebilirsiniz.   www.cncdesigner.com

sayment

Malesef anca tatilde tüm konuları okuyup halledebilirim.

ErsinErce

#12
PLL giriş değeri 1-2 MHz arasında olmak zorunda bu yüzden M değerini 8'e ayarlamak 1MHz çıkış ile işimizi kolaylaştırıyor
HARD sf:96
Alıntı YapCaution: The software has to set these bits correctly to ensure that the VCO input frequency
ranges from1 to 2 MHz. It is recommended to select a frequency of 2 MHz to limit
PLL jitter.

P değeri maximum 8 değerine sahip olabiliyor, çıkış frekansımız düşük olduğu için bu değeri kullandım

N/P değeri 23,5 olması için N 188 değerine sahip oluyor, notumuza baktığımızda istenilen değerler içinde olduğunu görebiliyoruz
HARD sf:96
Alıntı YapCaution: The software has to set these bits correctly to ensure that the VCO output frequency is between 64 and 432 MHz.

Bu durumda M=8 P=8 N=188 değeri ile 23,5MHz değerini yakalayabiliyoruz

fakat STM'in kendi clock configuration tool'unda N değerini 192 den aşağı veremiyoruz burada bir çelişki var ve datasheet de sebebini de bulamadım
N değerini 192 den aşağı veremezsek böyle bir frekansta çalışamayız


Kodu sizin kodlardan çalarak yazarsak :)
void SystemInit()
{
unsigned int i;
    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 = 0x04432F08;      // PLL katsayilarini M=8, N=188, P=8 ve Q=4 yapalim

    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 
}

fryrmnd

ersin hocam şuhliyle PLL N 376 mı gözüküyor. yoksa farklı bir sebepten dolayı 2 katı mı yapmak gerekiyor(188x2)?

ErsinErce

yok hocam yerleştirirken kaydırmışım, düzelttim şimdi =)