Error: L6218E: Undefined symbol SystemInit (referred from startup_lpc17xx.o)

Başlatan MC_Skywalker, 21 Kasım 2011, 19:05:58

MC_Skywalker

LPC1768 ile basit deneme yapmaya çalışıyorum aşağıdaki hata mesajını alıyorum. sorunu anlayamdım.


LPC1768-0001.axf: Error: L6218E: Undefined symbol SystemInit (referred from startup_lpc17xx.o).


LPC1768 nin system init ve PLL olayını öğrenmeye çalışıyorum.

#include <LPC17xx.H>

void activate_PLL(void)
{
    LPC_SC->SCS=0x20;				    //System Control and Status R/W 0 0x400F C1A0 5. bit 1 yapılıp xtal osc (main) aktif ediliyor
										//OSCRANGE 4.bit  0 ise 1Mhz ile 2Mhz arası 1 ise 15Mhz ile 25Mhz arası    
										//OSCEN 5.bit	0 ise devredışı 1 ise xtal uçlarına bağlı kristali kullanır
										//OSCSTAT 6.bit	0 ise osilatör hazır değil 1 ise osilatör hazır (sadece okunur)
    LPC_SC->CLKSRCSEL=0x01;				//select main oscilator	CLKSRCSEL 2 bir uzunluğunda
										//00 iç RC kaynağı osilatör olarak seçilmiş
										//01 ana osilatörü PLL0 için kaynak seç							  
										//10 iç RTC (geröek zaman saati) osilatör olarak seç
										//11 bu durum kullanımaz rezerve edilmiş bir değerdir.
    LPC_SC->CCLKCFG=0x03;				//pllclk/4
    LPC_SC->PLL0CON=0x01;				//pll activeted
    LPC_SC->PLL0CFG=0x20031; 			//msel=49,nsel=2;
    LPC_SC->PLL0FEED=0xAA;				// pll i beslemek için yazılmalı datadheet e belirtiyor
    LPC_SC->PLL0FEED=0x55;				//
    while(!(LPC_SC->PLL0STAT&(1<<26)));
    LPC_SC->PLL0CON=0x07;
    LPC_SC->PLL0FEED=0xAA;				// pll i beslemek için yazılmalı datadheet e belirtiyor
    LPC_SC->PLL0FEED=0x55;				//
    LPC_SC->PCLKSEL0=0;   
}

// Gecikme Fonksiyonu 
void Gecikme(long int sure)
{
long int i,k;							// 16 bitlik i degiskeni tanimlaniyor.
for (i = 1; i<=sure; i++) 				// girilen deger i degiskeninden büyük olana kadar for içerisinde dön
	{
		for (k = 0; k <= 12000; k++)
		{}
	}
}
// Ana Fonksiyon
int main(void) 
{
	SystemInit ();      // ilk ayarlar yapılıyor
	LPC_GPIO1->FIODIR0 = 0x00000001;	 						//giris cikis ayarlama komutu 1 cikis 0 giris
	LPC_GPIO1->FIOCLR0 = 0x00000001;							// 1. biti cikis digerleri giris
	activate_PLL();	

		while (1) 
			{									//sonsuz döngü
				
				LPC_GPIO1->FIOSET0 = 0x00000001; 	//1. biti 1 yap
				Gecikme(500); 						//bekleme yap 
				LPC_GPIO1->FIOCLR0 = 0x00000001; 	//1. biti 0 yap
				Gecikme(500); 						//bekleme yap 
	        }
}



M_B

\Keil\ARM\Startup\NXP dizininde bulunanan system_LPC17xx.c dosyasını projeye ve klasore dahil etmek gerekiyor.
İmkanın sınırlarını görmek için imkansızı denemek lazım.                                                             Fatih Sultan Mehmet

MC_Skywalker

Sağol. Bir yandan datasheet okuryup PLL i anlamaya çalışırken eklemeyi unutmuşum.

mbed ile çalışmak tembelleştirdi. Herşey hazır kütüpanede olunca.

fatihinanc

LPCXpresso IDE'si sağlam bir günümü harcamıştı bunun için :)
Proje dahil etmekte sıkıntı yok da yeni proje oluşturmak için bir sürü dosyayı siteme tanıtmak ve yolunu göstermek gerekiyor. Eclipse için biraz karın ağrıtıcı bir durum. Ama Keil'da o kadar zor değil...
Kainat dediğimiz kitap, yazıldığı dil ve harfler öğrenilmedikçe anlaşılamaz.  (Galileo Galilei)

buzkırıcı

void SystemInit (void)
{
#if (CLOCK_SETUP)                       /* Clock Setup                        */
  LPC_SC->SCS       = SCS_Val;
  if (LPC_SC->SCS & (1 << 5)) {             /* If Main Oscillator is enabled  */
    while ((LPC_SC->SCS & (1<<6)) == 0);/* Wait for Oscillator to be ready    */
  }

  LPC_SC->CCLKCFG   = CCLKCFG_Val;      /* Setup Clock Divider                */
  /* Periphral clock must be selected before PLL0 enabling and connecting
   * - according errata.lpc1768-16.March.2010 -
   */
  LPC_SC->PCLKSEL0  = PCLKSEL0_Val;     /* Peripheral Clock Selection         */
  LPC_SC->PCLKSEL1  = PCLKSEL1_Val;

#if (PLL0_SETUP)
  LPC_SC->CLKSRCSEL = CLKSRCSEL_Val;    /* Select Clock Source for PLL0       */

  LPC_SC->PLL0CFG   = PLL0CFG_Val;      /* configure PLL0                     */
  LPC_SC->PLL0FEED  = 0xAA;
  LPC_SC->PLL0FEED  = 0x55;

  LPC_SC->PLL0CON   = 0x01;             /* PLL0 Enable                        */
  LPC_SC->PLL0FEED  = 0xAA;
  LPC_SC->PLL0FEED  = 0x55;
  while (!(LPC_SC->PLL0STAT & (1<<26)));/* Wait for PLOCK0                    */

  LPC_SC->PLL0CON   = 0x03;             /* PLL0 Enable & Connect              */
  LPC_SC->PLL0FEED  = 0xAA;
  LPC_SC->PLL0FEED  = 0x55;
  while (!(LPC_SC->PLL0STAT & ((1<<25) | (1<<24))));/* Wait for PLLC0_STAT & PLLE0_STAT */
#endif


buradaki PLL0CFG_Val değerini biz direk #define şeklinde tanımlarsak eğer pll kısmında kendimiz kod yazmadan systemini() otomatik olarak ayarlamaz mı?
İmza Atmayı bilmem Parnak Bassam olur mu?

buzkırıcı

Bide PLL1 nedir? PLL0 ın mantığını anladım da. PLL1 usb diyor datasheet te ama anlamadım
İmza Atmayı bilmem Parnak Bassam olur mu?

MC_Skywalker

PLL0'ı öyle kurmalısın ki PLL1 ile tam 48Mhz USB clk değeri ede edebilesin. Bu sadece USB ile haberleşme yapacağız zaman set etmen gerekmekte. USB harici çalışma yapacasan PLL1 i kurmana gerek yok.


buzkırıcı

Alıntı yapılan: MC_Skywalker - 21 Kasım 2011, 19:05:58
LPC1768 ile basit deneme yapmaya çalışıyorum aşağıdaki hata mesajını alıyorum. sorunu anlayamdım.


LPC1768-0001.axf: Error: L6218E: Undefined symbol SystemInit (referred from startup_lpc17xx.o).


LPC1768 nin system init ve PLL olayını öğrenmeye çalışıyorum.

#include <LPC17xx.H>

void activate_PLL(void)
{
    LPC_SC->SCS=0x20;				    //System Control and Status R/W 0 0x400F C1A0 5. bit 1 yapılıp xtal osc (main) aktif ediliyor
										//OSCRANGE 4.bit  0 ise 1Mhz ile 2Mhz arası 1 ise 15Mhz ile 25Mhz arası    
										//OSCEN 5.bit	0 ise devredışı 1 ise xtal uçlarına bağlı kristali kullanır
										//OSCSTAT 6.bit	0 ise osilatör hazır değil 1 ise osilatör hazır (sadece okunur)
    LPC_SC->CLKSRCSEL=0x01;				//select main oscilator	CLKSRCSEL 2 bir uzunluğunda
										//00 iç RC kaynağı osilatör olarak seçilmiş
										//01 ana osilatörü PLL0 için kaynak seç							  
										//10 iç RTC (geröek zaman saati) osilatör olarak seç
										//11 bu durum kullanımaz rezerve edilmiş bir değerdir.
    LPC_SC->CCLKCFG=0x03;				//pllclk/4
    LPC_SC->PLL0CON=0x01;				//pll activeted
    LPC_SC->PLL0CFG=0x20031; 			//msel=49,nsel=2;
    LPC_SC->PLL0FEED=0xAA;				// pll i beslemek için yazılmalı datadheet e belirtiyor
    LPC_SC->PLL0FEED=0x55;				//
    while(!(LPC_SC->PLL0STAT&(1<<26)));
    LPC_SC->PLL0CON=0x07;
    LPC_SC->PLL0FEED=0xAA;				// pll i beslemek için yazılmalı datadheet e belirtiyor
    LPC_SC->PLL0FEED=0x55;				//
    LPC_SC->PCLKSEL0=0;   
}

// Gecikme Fonksiyonu 
void Gecikme(long int sure)
{
long int i,k;							// 16 bitlik i degiskeni tanimlaniyor.
for (i = 1; i<=sure; i++) 				// girilen deger i degiskeninden büyük olana kadar for içerisinde dön
	{
		for (k = 0; k <= 12000; k++)
		{}
	}
}
// Ana Fonksiyon
int main(void) 
{
	SystemInit ();      // ilk ayarlar yapılıyor
	LPC_GPIO1->FIODIR0 = 0x00000001;	 						//giris cikis ayarlama komutu 1 cikis 0 giris
	LPC_GPIO1->FIOCLR0 = 0x00000001;							// 1. biti cikis digerleri giris
	activate_PLL();	

		while (1) 
			{									//sonsuz döngü
				
				LPC_GPIO1->FIOSET0 = 0x00000001; 	//1. biti 1 yap
				Gecikme(500); 						//bekleme yap 
				LPC_GPIO1->FIOCLR0 = 0x00000001; 	//1. biti 0 yap
				Gecikme(500); 						//bekleme yap 
	        }
}


hocam burada ilk olarak Pll0 ı kendiniz set etmişiniz ama aşağıda SystemInit() i çağırmışınız ve daha sonra activite_pll demişsiniz. SystemInit() Pll i aktif etmiyormu? burada hep SystemInit(); çağırmalımıyız? Bu arada Pll1 için teşekkürler..
İmza Atmayı bilmem Parnak Bassam olur mu?

MC_Skywalker

o kodd sağlam olmaya bilri LPC2138 kodunu değiştirerek yazdığım için unuttuğum yerler var.
o kod çalışmaya bilir. dediğim gibi önceki programdan kalma kod parçaçıkları var.
sadece PLL ektif etme kısımına bak.

Aşağıdaki resimde PLL0 için kullanılan gesiterlerin tablosu var çalışımalarım için çıkartmaya başladım.

[IMG]http://img64.imageshack.us/img64/4244/lpc1768reister.jpg[/img]

buzkırıcı

hocam çok teşekkürler. Bu resim benim çok işime yaradı. Nasıl buluyorsunuz böle kaynakları? ben bulamıyorum. Eğer daha başka varsa böyle kaynaklar gönderirseniz sevinirm. tekrar Teşekkürler...
İmza Atmayı bilmem Parnak Bassam olur mu?

MC_Skywalker

o resimi ben datashetten bakarak kendim execlde yaptım sonra resim formatına cevirdim.

daha henüz bitmedi. Şu sıralar Star Wars™: The Old Republic™ oyunun Beta testinde oynadığım için tembellik yapıyorum .

buzkırıcı

Hocam, bir sorum daha olucak, Cpu clock configuration register(CCLKCFG) PLLO çıkışını niye bölüyor? Kaça istersek bölüyor ama neden? şimdi ben PLL0 ayarı yaptım ve çıkışın 480 mhz olmasını istedim. direk cclk 480 olur mu? arada CCLKCFG var olduğundan bu değer düşer mi?
İmza Atmayı bilmem Parnak Bassam olur mu?

MC_Skywalker

LPC17xx user manual in 4. bölümü sorunlarına cevap olacaktır.

aşağıdaki resim LPC 17xx için clock sinyali üretininin block diyagramı sana fikir verecektir.

[IMG]http://img854.imageshack.us/img854/3716/lpc17xxclock.jpg[/img]


Aşağıdaki kodlar ise PLL0 ve PLL1  ile ilgili SystemInit() in düzeltilmiş hali

#define SCS_Val     0x20
#define CLKSRCSEL_Val   0x1
#define PLL0_SETUP  0x1
#define PLL0CFG_Val 0xb
#define CCLKCFG_Val 0x17
#define PLL1_SETUP  0x0
#define PLL1CFG_Val 0x0
#define USBCLKCFG_Val   0x5
 
void SystemInit (void)
{
    LPC_SC->SCS       = SCS_Val;
    if (SCS_Val & (1 < < 5))
    {
        while ((LPC_SC->SCS & (1< <6)) == 0);
    }
 
    LPC_SC->CCLKCFG   = CCLKCFG_Val;
 
    if (PLL0_SETUP)
    {
        LPC_SC->CLKSRCSEL = CLKSRCSEL_Val;
        LPC_SC->PLL0CFG   = PLL0CFG_Val;
        LPC_SC->PLL0CON   = 0x01;
        LPC_SC->PLL0FEED  = 0xAA;
        LPC_SC->PLL0FEED  = 0x55;
        while (!(LPC_SC->PLL0STAT & (1< <26)));
 
        LPC_SC->PLL0CON   = 0x03;
        LPC_SC->PLL0FEED  = 0xAA;
        LPC_SC->PLL0FEED  = 0x55;
    }
 
    if (PLL1_SETUP)
    {
        LPC_SC->PLL1CFG   = PLL1CFG_Val;
        LPC_SC->PLL1CON   = 0x01;
        LPC_SC->PLL1FEED  = 0xAA;
        LPC_SC->PLL1FEED  = 0x55;
        while (!(LPC_SC->PLL1STAT & (1< <10)));
 
        LPC_SC->PLL1CON   = 0x03;
        LPC_SC->PLL1FEED  = 0xAA;
        LPC_SC->PLL1FEED  = 0x55;
    }
    else
 
        LPC_SC->USBCLKCFG = USBCLKCFG_Val;
}


buzkırıcı

Alıntı yapılan: MC_Skywalker - 26 Kasım 2011, 09:40:49
LPC17xx user manual in 4. bölümü sorunlarına cevap olacaktır.

aşağıdaki resim LPC 17xx için clock sinyali üretininin block diyagramı sana fikir verecektir.

[IMG]http://img854.imageshack.us/img854/3716/lpc17xxclock.jpg[/img]
bende BU resimden bakarak öğrenemeye çalışıyorum. ancak CPU CLock divider pll0 çıkışına niçin konulmuş ve mesala keil startup da otomatik
cclksel i 4 e eşitlenmiş halde geliyor. cclksel nedemek? direk cpu ya göndermiyor da arada böyle bir uygulama koymuş. Acaba koruma amaçlımı?
İmza Atmayı bilmem Parnak Bassam olur mu?

z

Alıntı yapılan: buzkırıcı - 27 Kasım 2011, 15:35:10
bende BU resimden bakarak öğrenemeye çalışıyorum. ancak CPU CLock divider pll0 çıkışına niçin konulmuş ve mesala keil startup da otomatik
cclksel i 4 e eşitlenmiş halde geliyor. cclksel nedemek? direk cpu ya göndermiyor da arada böyle bir uygulama koymuş. Acaba koruma amaçlımı?

PLL cikisindaki sinyal CPU'nun max frekansindan daha yuksek degerlere set edilebilir. Bu durumda CPU overclock olacagindan CPU sapitir. PLL cikisini bolerek CPU nun duzgun calisabilecegi clk degerini elde ediyorsun.

Ayrica, CPU'yu max clkda kosturacagiz diye sart yok. CPU'yu cok dusuk hizlarda kostururken mesela USB unitesi gene olmasi gereken degerde clk ile beslenmek zorunda.
Bu durumda gene CPU clk degerini clock divider ile ayarlayabiliyoruz.
Bana e^st de diyebilirsiniz.   www.cncdesigner.com