Haberler:

Foruma Resim Yükleme ve Boyut Sınırlaması ( ! )  https://bit.ly/2GMFb8H

Ana Menü

STM32F4 Discovery - Vizeler

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

muhittin_kaplan

clock configuration tool
indirdim ama çalıştıramadım. macro lar felan tamam ama olmuyor.

fryrmnd

muhittin hocam pll ayarı yapılıyor. AHB=160MHz, APB1=42MHZ, APB2=84Mhz elde etmek için presclale değerleri bu registerda ilgili yerlere yazılıyor. ilk sayfada pll blok şeması var.

muhittin_kaplan


z

Benim kodlarimla fryrmnd nin kodlarinda

birimiz TIM7->PSC =23500; yazdi

birimiz TIM7->PSC =11749;

Fakat buna ragmen her iki kod da saniyede 1 kez ledleri yakip sonduruyor.

Cok guzel bir ornek oldu. Sebebini aciklayacak varmi?

Muhittin Kaplan sorunu daha netlestirirmisin? (Sayfa no vermeyi unutmayalim)

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

muhittin_kaplan

Hocam Başlık 5.3.2 de RCC PLL configuration register (RCC_PLLCFGR) var.
Sanırım rehber di.
Sizin verdiğiniz değer olan 0x00009400 değeri verilmiş
Etki eden Bitler 6-14 nolu bitler.
Bunlar PLLN: Main PLL (PLL) multiplication factor for VCO
peki neden kullanılmayan 15. biti de 1 yapmaya çalışıyoruz ?

z

Alıntı yapılan: muhittin_kaplan - 24 Aralık 2011, 20:46:19
Hocam Başlık 5.3.2 de RCC PLL configuration register (RCC_PLLCFGR) var.
Sanırım rehber di.
Sizin verdiğiniz değer olan 0x00009400 değeri verilmiş
Etki eden Bitler 6-14 nolu bitler.
Bunlar PLLN: Main PLL (PLL) multiplication factor for VCO
peki neden kullanılmayan 15. biti de 1 yapmaya çalışıyoruz ?

RCC->CFGR |=0x00009400; yapiyorum.

Sen RCC_PLLCFGR registerine bakiyorsun.
Bana e^st de diyebilirsiniz.   www.cncdesigner.com

muhittin_kaplan

Ben Pc yi kapatayım Hocam. Doğrusunuz. :-[

ErsinErce

Alıntı yapılan: muhittin_kaplan - 24 Aralık 2011, 20:30:28
clock configuration tool
indirdim ama çalıştıramadım. macro lar felan tamam ama olmuyor.
hocam şu an için hiç uğraşmayın mantığını kapmaya çalışın, finallerden sonra C# üzerinde ayarları yapmamızı sağlayacak bir wizard oluşturmayı düşünüyorum
işlerimiz o zaman daha kolay olacaktır

z

Alıntı yapılan: bunalmis - 24 Aralık 2011, 20:41:10
Benim kodlarimla fryrmnd nin kodlarinda

birimiz TIM7->PSC =23500; yazdi

birimiz TIM7->PSC =11749;

Fakat buna ragmen her iki kod da saniyede 1 kez ledleri yakip sonduruyor.

Cok guzel bir ornek oldu. Sebebini aciklayacak varmi?


Bu soruyu atlamayin. Konuyu pekistirmek adina cok onemli.
Bana e^st de diyebilirsiniz.   www.cncdesigner.com

fryrmnd

#39
Timer1 geri sayım ile 1sn aralıklı led yakıp söndürme

#include "STM32F4xx.h"

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 = 0x07405408;      // 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 
} 

int main()
{
    RCC->APB2ENR|=0x00000001; // Timer1 CLK'u aktif edelim (84 Mhz)
    TIM1->CR1=0x0090;               // Otomatik Reload(Timer 1 geri sayıcak(down counter şeklinde ayarlandı)
    TIM1->PSC =41999;               // Prescaler değerimiz 41999, Count frekansimiz = fCK_PSC / (Yuklenen Deger + 1) (84?2)E6 / (42000) = 4000 Hz
    TIM1->ARR =4000;                 // 
    TIM1->CR1|=0x0001;             // Counter Enable
 
    while(1)
      {
         if (TIM1->CNT > 2000) GPIOD->ODR= 0x00000000;     // Ledler yansin
         else GPIOD->ODR= 0x0000F000;                            // Ledler sonsun
      } 
}



ErsinErce

Alıntı yapılan: bunalmis - 24 Aralık 2011, 21:11:34
Bu soruyu atlamayin. Konuyu pekistirmek adina cok onemli.

RCC->CFGR |= 0x00009400 koduyla APB1 frekansını böldüğünüzden kaynaklanıyor hocam
TIM7 e sistem frekansının yarı frekansı giriyor bu şekilde

z

@fryrmnd

Hangi timer hangi busdan clocklaniyor konusuna dikkat etmelisin.

#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 = 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 = 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 
} 

int main()
{
    RCC->APB2ENR|=0x00000001;     // Timer1 CLK'u aktif edelim (84 x 2 =168 Mhz)
    TIM1->CR1=0x0080;             // Otomatik Reload
    TIM1->PSC =41999;             // 168E6 / (42000) = 4000 Hz
    TIM1->ARR =4000;              // 4000 de bir yenilensin
    TIM1->CR1|=0x0001;            // Counter Enable
 
    while(1)
      {
         if (TIM1->CNT > 2000) GPIOD->ODR= 0x0000F000;     // Ledler yansin
         else GPIOD->ODR= 0x00000000;                      // Ledler sonsun
      } 
}
Bana e^st de diyebilirsiniz.   www.cncdesigner.com

fryrmnd

evet hocam baştan sona hatalı hesapladım. APB nin prescale oranı 1 olmadığını, 2 katı hızda saycağını bile bile yanlış hesapladım. TMR->CNt yi bile 2000 başlangıç değeri verip 500 yapmışım. kusura bakmayın. ben eskisini azıcık değiştireyim. 4000 den geri sayan haliyle değiştireyim.yanlış kalıp kafa karıştırmasın.

z

Yalniz 3.soruyu neden atladik?

3.soru su ana kadarki donanim bilgileri ile C bilginizi birlestirmeye yonelik.
Bana e^st de diyebilirsiniz.   www.cncdesigner.com

fryrmnd

hocam 3. soruda deidğiniz  gibi c bilgisi girdiğinden c ye biraz bakmam lazım. define felan. tam emin değilim. kolayıma geleni yapmaya çalıştım da onu da beceremedim  :(