Haberler:

Forum kuralları güncellendi LÜTFEN  okuyunuz:  https://bit.ly/2IjR3ME

Ana Menü

STM32F4 LED SORUNU

Başlatan electricker, 22 Mart 2013, 13:45:20

electricker


0 hata ve 0 uyarı ile derliyor fakat ledler çalışmıyor arkadaşlar
Sitedeki STM32F4 ün anlatımından yazılmıştır.

Klein

Ledler hiç yanmıyor mu? hiç sönmüyor mu?

Proje ayarlarında "Target" sekmesinde "Floating point hardware" swçimi yapılan bir combobox göreceksin.
Oradan "Not Used" seçip bir dene.

Yine çalışmazsa debug ederek bak bakalım program nerede takılıyor.

Kaanx

Kitin driverlarını yuklemısmıydınız yani sorunsuz bir şekilde debug edebiliyor musunuz ?

electricker

Kendi dosyasındaki blinky projesi çalışıyor ancak bu yazmış olduğum çalışmıyor , Not used seçeneğinide kullandım fakat yine ledler yanmıyor.. Eğer ki blinky projesi çalışıyorsa driverlarda sıkıntı yoktur diye düşünüyorum. Proje dosyalarımda sıkıntı var mı peki ? eklemem gereken başka sürücü dosyaları falan ?

fatih6761

Hocam döngüde hata var. Daha doğrusu ledler muhteşem bir hızla yanıp sönmeye çalışıyor. O yüzden göremiyorsunuzdur. Şöyle deneyin:
void Delay(uint32_t nCount) {
  while(nCount--) {
  }
}
int main()
{
	volatile int i;
	
	while(1)
	{
		GPIOD->ODR = 0xF000;
		Delay(0x7FFF);
		GPIOD->ODR = 0x0000;
		Delay(0x7FFF);
	}
}

Burada 0x7FFF değerini büyütürseniz gecikme artar, ledler daha yavaş yanıp söner.

electricker

Aynen dediğiniz gibi delay fonksiyonunu kullanınca sorun çözüldü teşekkür ederim  ;)

z

En başta verdiğiniz programın yayınlandığı sayfanın başında F11 ile adım adım çalıştırılacak gibisinden bir uyarı olması lazım.
Bana e^st de diyebilirsiniz.   www.cncdesigner.com

electricker

Haklısınız hocam ancak adım adım çalıştırmada debug ederken while döngüsüne girememiştim diye hatırlıyorum. Debug dosyalarında da sıkıntı olsa daha önceden blinky projesini adım adım çalıştırmazdı sanıyorum.

magnetron

ben de bir soru sorayım

hocam benim STM32F4 ü 168 MHz de çalıştırıyorum
yazdığım programlarda Delay çok kullanıyorum

bu Delay fonksiyonu kaç mikrosaniye gecikme sağlıyor ?

ben 0.1 mikrosaniye tahmin ediyorum doğru mudur ?

z

#9
Akşam eve gidince bakayım. Bir tane de System Tick kullanan genel amaçlı delay fonksiyonu yayınlayayım.

mesaj birleştirme:: 02 Nisan 2013, 18:14:32

Aşağıdaki programı denemedim, muhtemelen çalışacaktır.
168 Mhz de koşan işlemci için örnek programlarda olduğu gibi system init ayarlamalarını yapın.
4 adet zaman sayacınız var. System Tick sizin için bunları set ettiğiniz değerden itibaren sıfıra doğru 1ms adımlarla düşürür.


volatile int zaman1, zaman2, zaman3, zaman4;

/*****************************************************************************************************
     STS TICK COUNTER AHB FREKANSINDA (168 MHZ) KOSACAK
*****************************************************************************************************/

void SysTickInit()
{
     STK_LOAD= 0X00029040>>1; // 168E6/1000/2=168000 TICK TIME 1MS
     STK_CTRL&=~0x00010000;   // Count Flagi silelim,
     STK_CTRL|= 0x00000007;   // int enb ve count enb yapalim, clk kaynagini AHB yapalim 
}

void SysTick_Handler()
{
     STK_CTRL&= ~0x00010000; // Count Flagi silelim
     if (zaman1) Zaman1--;
     if (zaman2) Zaman2--;
     if (zaman3) Zaman3--;
     if (zaman4) Zaman4--;
}

int main()
{
     SysTickInit();
     while(1)
        {
           zaman1=100;    // 100ms
           while (Zaman);  // 100ms sonra alt satıra geç
           zaman1=10000;
           While (Zaman1) // 10 saniye boyunca işlem yapacağız
              {
                    //  Led yak
                   zaman2=500;   
                   While(Zaman2); // Ledimiz yarım saniye yanık kalsın
                   zaman2=1000;
                    //  Led sondur
                   While(Zaman2); // Ledimiz 1 saniye boyunca sönük kalsın
              }

//  Bu tarz beklemeli programlar hoş karşılanmasa da deneme yapmak için kullanabilirsiniz.

        }
}

------------------------------------

Aşağıdaki programda herhangi bir zamanda zamanX değişkenine değer yükleyip 1 ms adımlarla otomatik azalmasını sağlayabilir ve sıfır olduğunda ilgili fonksiyonun otomatik koşmasını sağlayabilirsiniz. (fonk adlı fonksiyonlar içinde zaman kaybettirecek işlemler yapmayın)

Mesela fonk1 içinde bir ledi yakıp çıkın.
fonk2 de de bu ledi söndürüp çıkın.

volatile int zaman1, zaman2, zaman3, zaman4;

/*****************************************************************************************************
     STS TICK COUNTER AHB FREKANSINDA (168 MHZ) KOSACAK
*****************************************************************************************************/

void SysTickInit()
{
     STK_LOAD= 0X00029040>>1; // 168E6/1000/2=168000 TICK TIME 1MS
     STK_CTRL&=~0x00010000;   // Count Flagi silelim,
     STK_CTRL|= 0x00000007;   // int enb ve count enb yapalim, clk kaynagini AHB yapalim 
}

void SysTick_Handler()
{
     STK_CTRL&= ~0x00010000; // Count Flagi silelim
     if (zaman1)
       {
          zaman1--;
          if (!zaman1) fonk1();
       }
     if (zaman2)
       {
          Zaman2--;
          if (!zaman2) fonk2();
       }
     if (zaman3)       
       {
          Zaman3--;
          if (!zaman3) fonk3();
       }
     if (zaman4)
       {
          Zaman4--;
          if (!zaman4) fonk4();
       }
}

fonk1()
{
//      zaman1 sıfır olursa burası çalışır     
}

fonk2()
{
//      zaman2 sıfır olursa burası çalışır     
}

fonk3()
{
//      zaman3 sıfır olursa burası çalışır     
}

fonk4()
{
//      zaman4 sıfır olursa burası çalışır     
}

int main()
{
     SysTickInit();
     zaman1=1000;   
     zaman2=2000;   
     zaman3=3000;   
     zaman4=4000;   

     while(1)
        {
        }
}
Bana e^st de diyebilirsiniz.   www.cncdesigner.com

fatih6761

Bülent hocama ek olarak ben de StdPeriph Delay fonksiyonunu vereyim:
#include "stm32f4xx.h"

volatile uint32_t nTime;

void Setup_SysTick(void)
{
	SystemCoreClockUpdate();
	SysTick_Config(SystemCoreClock / 1000);
	nTime = 0;
}

void DelayMs(uint32_t n)
{
	nTime = n;
	while(nTime > 0)
	{
	}
}

void Delay_Decrease(void)
{
	if(nTime > 0)
		nTime--;
}

void SysTick_Handler(void)
{
	Delay_Decrease();
}


main fonksiyonu başında yerel değişkenleri ilklendirdikten sonra setup kısmında Setup_Systick() fonksiyonunu çağırın. Sonra DelayMs fonksiyonunu kullanarak gecikme yaratabilirsiniz. Örneğin:
DelayMs(1); 1 milisaniye
DelayMs(500); yarım saniye
DelayMs(3000); 3 saniye gecikme yaratır.