__main () fonksiyonu problemi stm32f407

Başlatan superconductor, 12 Haziran 2012, 12:18:02

superconductor

Merhabalar.
ARM öğreniyoruz başlığını takip etmekteyim.Örnek kodlar vermiş hocam orada led yak söndür gibi.Bu kodları derlerken problem oluşmuyor lakin debug ettiğimde kodlar starup kısmında
; Reset handler
Reset_Handler    PROC
                 EXPORT  Reset_Handler             [WEAK]
        IMPORT  SystemInit
        IMPORT  __main

                 LDR     R0, =SystemInit
                 BLX     R0
                 LDR     R0, =__main
                 BX      R0
                 ENDP


BX ile başlayan  satırda çaklılıyor.
İşin garip kısmı koddaki main fonksiyonunu   " __main ()"  şekline  yazınca  problem olmadan çalışıyor."  main () " yazınca çalışmıyor.Normalde çift alttireli ifadeler  derleyici için ayrılmıştır diye biliyorum ve kullanmamamız gerekiyor.

kodun orjinali
#include "STM32F4xx.h"
 
void SystemInit()
{
    RCC->AHB1ENR|=0x00000008;    // GPIOD donanımının clock sinyalini uygulayalım
    GPIOD->MODER=0x55000000;     // GPIOD nin 15, 14, 13, 12 pinleri cikis tanimlandi (Ledler bu pinlerde)
    GPIOD->OSPEEDR= 0xFFFFFFFF; // GPIOD nin tum cikislari en yuksek hizda kullanacagiz 
} 
 
int main()
{
    while(1)
   {
     GPIOD->ODR= 0x0000F000;     // Ledler yansin
     GPIOD->ODR= 0x00000000;     // Ledler sonsun
   } 
}

// Programın sonudur.



bende çalışan halide budur
#include "STM32F4xx.h"
 
void SystemInit()
{
    RCC->AHB1ENR|=0x00000008;    // GPIOD donanımının clock sinyalini uygulayalım
    GPIOD->MODER=0x55000000;     // GPIOD nin 15, 14, 13, 12 pinleri cikis tanimlandi (Ledler bu pinlerde)
    GPIOD->OSPEEDR= 0xFFFFFFFF; // GPIOD nin tum cikislari en yuksek hizda kullanacagiz 
} 
 
int __main()
{
    while(1)
   {
     GPIOD->ODR= 0x0000F000;     // Ledler yansin
     GPIOD->ODR= 0x00000000;     // Ledler sonsun
   } 
}

// Programın sonudur.




burada çakıldım kaldım yardımlarınızı bekliyorum şimdiden teşekkürler.

z

Soruna odaklanamadım program çalışıyor demene rağmen ledler yanıp sönüyor vs ibaresi görmediğim için öncelikle;

Debug işlemini kart ile mi yapıyorsun kartsız mı yapıyorsun?

Eğer kartsız yapıyorsan Debug.ini adında bir dosyamız olacak bunu oluşturman Option Debug menüde Debug başlığında simulatör bölümünde Initialization File kısmında seçmen gerekiyor.

Debug.ini dosyasının içeriği;

FUNC void Setup (void) {
SP = _RDWORD(0x08000000); // Setup Stack Pointer
PC = _RDWORD(0x08000004); // Setup Program Counter
xPSR = 0x01000000; // Set flag "T"
}
load %L incremental
MAP 0x00000000, 0x000000FF READ WRITE;
MAP 0x40000000, 0x400FFFFF READ WRITE;
_WDWORD(0x00000000,_RDWORD(0x08000000));
_WDWORD(0x00000004,_RDWORD(0x08000004));
Setup();

Yok eğer kart ile çalışıyorsan gene Debug modunda simulatörün aktif edilmediğinden emin ol.
Bana e^st de diyebilirsiniz.   www.cncdesigner.com

superconductor

#2
hocam kart ile çalışıyorum." __main" yazınca ledler  yanıp sönüyor "main" yazınca  çakılıyor. SystemInıt den dışarı çıkamıyor.Ve bu sıkıntı sadece debug için geçerlide değil.Debug etmeden  Load deyip programı karta atıyorum ve reset tuşuna basıyorum ledlerde yine bir hareket yok  main fonksiyonunu dediğim gibi __main  yazınca   ledler yanıp sönüyor.derslerdeki tüm programları ancak bu şekilde çalıştırabildim  keil 4.53 kullanıyorum  derste anlattığınız tüm ayarlamaları yaptım 
#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
}

void Delay()
{
unsigned int i;
 
     for(i=0;i<0x800000;i++); 
}

int main()
{
    while(1)
      {
         GPIOD->ODR= 0x0000F000;     // Ledler yansin
         Delay();
         GPIOD->ODR= 0x00000000;     // Ledler sonsun
         Delay();
      } 
}
// Programın sonu.
    bu şekilde ne debug oluyor nede  karta yükleyince çalışıyor.

z

#3
Startup dosyan orjinal mi?

main fonksiyonunu __ olmadan yaz. (ÇAlışmadığını söylediğin hali ile kalsın)

Startup dosyasında                 

LDR     R0, =__main
BX      R0

satırlarından BX R0 olan satıra breakpoint koy. Run ile programı koştur.
Breakpoint satırında takılıyormu? Takılıyorsa F11 e basınca main fonksiyonuna giriyormu?

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

superconductor

startup dosyasında hiç değişiklik yapmadım zaten kendisi kopyalıyor ben hiç ellemiyorum.Şimdi forumu karıştırırken sizin bir dosyanıza rastladım "deneme" isimli "keil kurulumu ve kullanımı hakkında tartışmalar" başlığında  onun içindeki startup ile ilgili dosyaları kendi projeme kopyalayınca sorun kalmadı.Yapacağım projelerde startup dosyasını manuel kopyalayacağım zira 4.53 versiyonundaki startup sorun çıkartıyor en azından bende.

Teşekkürler.

superconductor

Sadece programı karta atıp çalışıyormu diye denemiştim, çalışıyor sıkıntı yok ama debug da sanırım sıkıntı var. Brakepoint koyup run dediğimde  brakepointe  kadar gelip duruyor sonra f11 basınca kartın üzerindeki ledler yanıp sönmeye başlıyor.  Yanda çıkan ok işareti mavi rengi alıyor ve o satırda takılıp kalıyor main içine girmiyor ancak dediğim gibi ledler bu sırada yanıp sönüyor.Stopa bastığımda ok işareti delay fonksiyonu içindeki for döngüsünde  oluyor.

z

Program counter bir sekilde kaciyor. Breakpointi main icinde uygun gordugun bir yere koy. Adim adim islemesi lazim.
Bana e^st de diyebilirsiniz.   www.cncdesigner.com

superconductor

Cevaplarınız için çok teşekkürler üstadlar.Sizin problem yaşamadan kullandığınız Keil versiyonu nedir bende onu kullanayım.Okuduğum kadarı ile forumda böyle bir problemle karşılaşan olmamış.