STM32F4 Discovery - Vizeler

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

z

Bahsettiginiz tool USB donaniminin calismama ihtimalinden dolayi sinirlama getirmis olabilir. CPU donaniminin 23.5Mhz de calismamasi icin bir neden yok.

Toolda USB donanimini lullanmayacagim diye bir secenek yokmu?

Birde wizardlari bosverin Wizard biziz.
Bana e^st de diyebilirsiniz.   www.cncdesigner.com

ErsinErce

Wizard modda kullanmıyorum hocam, girdiğimiz değeri direk sonuca ulaştırdığı için kolay olur dedim ama yine hesabı kendim yaptım birşey değişmedi =)

z

#17
Soruyu hazirlarken sinirlamalari da dikkate alarak P, N, M degerlerini secip 23.5 Mhz gibi bir sonuc elde ettim ve sizlerin 23.5 Mhz den yola cikip tersine bu degerleri tespit etmenizi istedim. 23.5 i ozellikle kafadan atmadim.

Peki sonuc ne bu durumda? 8Mhz xtal ile CPU 23.5Mhz de kosacakmi kosmayacakmi?

Deneyen, olcum yapan oldumu?

Osiloskopunuz yok. Frekansmetreniz yok. CPU nun kosturdugu frekansin 23.5Mhz olup olmadigini bilmek istiyorsunuz. Ne yapardiniz?


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

fryrmnd

hocam 23.5 e göre led yakma söndürme felan ayarlayamazmıyız. 23.5 te 1sn yansın 1sn sönsün.

z

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

fryrmnd

pek iyi bir çözüm olmadı galiba. başka nasıl anlaşılarbilir scopsuz 23.5 te koştuğu? ???

z

Cevabin dogru. Bu is icin kisa bir kod yazip ledleri yakip sondurur ve  kol saatimi bakarim.
Sonucta CPU ya calisir ya calismaz. Calisirsa 23.5 Mhz e set ettigim clock frekansinin belki 23.45 oldugunu anlayamam ama 11.75 yada 47Mhz olup olmadigini anlarim.

Fakat ledleri nasil yakip sondureceksiniz de 23.5 Mhz olduguna karar vereceksiniz kismina daha cok aciklik getirin demek istedim.

PIC projelerinde Delay yerine 1200020200 yaziyorum for dongusunde sayidiririyorum vs diyorlar oyle mi yaparsin?
Bana e^st de diyebilirsiniz.   www.cncdesigner.com

fryrmnd


NaMcHo

#23
Timer birimini 23.5MHz'e göre 1ms'de bir kesme üretecek şekilde ayarlanır , her kesmede bir değişkenin değeri arttırılır  değişken 1000 değerine ulaşınca led'in durumu terslenir.

1ms'yerine 100ms'de bir kesme oluşturmak hata oranını azaltacıktır demek yanlış olmaz sanırım.


1ms'yeye kurmaya ne gerek var :) 1000ms'de bir kesme oluşturulacak şekildede timer sayacına yazım yapılabiliyor.

fryrmnd

3. örnekteki gibi yani yazdığınız gibi delay ekleyerek yazılan program sakatmı olur hocam. yoksa namcho hocamın dediği gibi timer mı kurmak gerekli.

ErsinErce

şebekeden opto ile herhangi bir interrupt pinine giriş yapıp ayarladığım timer'ın değerini yedekleyip sıfırlamasını sağlarım
elde ettiğim değeri şebeke frekansına göre hesaplayıp sonucu çıkarırım
şebekeyi referans almak biraz tehlikeli ama benzer bildiğiniz bir frekans değer girişi ile aynı şekilde sonuç elde edilebilir

z

Ersinin verdigi system inite ornek kodlardaki timer 7 ile yanip sonen led projesini birlestirdim.

Ledlerin saniyede bir yanip sondugunu gordum. (Scopla da teyid ettim) Evet CPUmuz tami tamina 23.5Mhz de kosuyor.

(Soruyu hazirlarken kullandigim degerler. M=4 N=94 P=8 idi.)

#include "STM32F4xx.h"
 
// FAHB=FCPU
// FAPB2=FCPU/2
// FAPB1=FCPU/4
 
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;     // 23.5Mhz icin ayarlayalim
    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 
} 
int main()
{
    RCC->APB1ENR|=0x00000020;      // Timer7 CLK'u aktif edelim (FCPU/4) x 2  (23.5 / 2 = 11.75 Mhz)
    TIM7->CR1=0x0080;              // Otomatik Reload
    TIM7->PSC =11749;              // Count frekansimiz = 11.75 E6 / 11750 = 1000 Hz
    TIM7->ARR =1000;               // Counter, Decimal 1000 olunca basa donsun 1 sn demek
    TIM7->CR1|=0x0001;             // Counter Enable
 
    while(1)
      {
         if (TIM7->CNT > 500) GPIOD->ODR= 0x0000F000;     // Ledler yansin
         else GPIOD->ODR= 0x00000000;                     // Ledler sonsun
      } 
}


Bir arkadas M=8  N=188 P=8 degerlerinden  RCC->PLLCFGR = 0x04432F08;   nin nasil olusturuldugunu usenmeden aciklarsa super olur. (Ben usendim)
Bana e^st de diyebilirsiniz.   www.cncdesigner.com

fryrmnd

#27
hocam valla gene önce davrandınız.ben de gene azcık çaldım çırptım debelendim aşağıdakini denedim. ama sanki 1sn den biraz uzun yanıyor gibi.

#include "STM32F4xx.h"

void SystemInit()
{
unsigned int i;

    for (i=0;i<0x00100000;i++);          // OSC oturtma ve kurtarma rutini
    RCC->CFGR |= 0x00000000;         // AHB ve APB de prescale yok. timer7 ye direk 23.5 MHz gidicek.
    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=336, P=2 ve Q=7 yapalim
//  RCC->PLLCFGR = 0x07402A04;     // PLL katsayilarini M=4, N=168, P=2 ve Q=7 yapalim
    RCC->CR |= 0x01000000;            // PLL calismaya baslasin  (Rehber Sayfa 95)
    while(!(RCC->CR & 0x02000000)); // Pll hazir oluncaya kadar bekle
//  FLASH->ACR = 0x00000705;        // Flash ROM icin 5 Wait state secelim ve ART yi aktif edelim (Rehber Sayfa 55)
    FLASH->ACR = 0x00000605;        // Flash ROM icin 5 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 
//  Yukarıdaki örnek programdaki kodların aynısı
}

int main()
{
    RCC->APB1ENR|=0x00000020; // Timer7 CLK'u aktif edelim (23.5 Mhz)
    TIM7->CR1=0x0080;               // Otomatik Reload
    TIM7->PSC =23500;               // Prescaler değerimiz 23500, Count frekansimiz = fCK_PSC / (Yuklenen Deger + 1) 23.5E6 / (23500) = 1000 Hz
    TIM7->ARR =1000;                 // Counter, Decimal 1000 olunca basa donsun 1 sn demek (2000 yapmadım çünkü aPB presclae değerim 1)
    TIM7->CR1|=0x0001;             // Counter Enable
 
    while(1)
      {
         if (TIM7->CNT > 500) GPIOD->ODR= 0x0000F000;     // Ledler yansin
         else GPIOD->ODR= 0x00000000;                            // Ledler sonsun
      } 
}


hata yaptım düzelticem

şimdi düzeldi.1 sn de bir yanıp sönüyor.

muhittin_kaplan

Soru Şu
RCC->CFGR |= 0x00009400; Kodu ile Ne yapılmaya Çalışılmış ?
(RCC nin CFGR registerini sayıyla orlama
Kayıcıyı inceledim böyle bir ayar yok
)

fryrmnd

bunalmış hocam P=8, N=188, M=8 verince 23.5 çıkıyor tam. 23.5=(8/M=8)*(N=188/P=8)

registerda tam sağlıyor. versiğiniz 32 bit hesaplayıcı ile baktım.