LPC1769 pll ve gecikme fonksiyonu

Başlatan Justxc, 11 Ekim 2012, 00:44:48

Justxc

lpc17 serisinde pll ayarları ile 12mhzlik harici osc ile 120mhz elde etmek için aldığım kit ile gelen arm calculator isimli bir programdan ayarlama yapıp kodları yapıştırdım. forumda bulduğum bir gecikme fonksiyonunuda ekledim. işlemcinin hangi frekans değerinde çalıstığını anlayabilmek için se bir led yakıp söndürmek istedim. 10sn boyunca led yanacak 10 sn ise sönük kalacak şekilde fakat 7 ile 8sn arasında bir periyodu var. kodlar aşağıda..
#include "LPc17xx.h"
#include "stdint.h"




 // PLL Function for LPC17xx

#define SCS_Val                0x20
#define CLKSRCSEL_Val  0x1
#define PLL0_SETUP        0x1
#define PLL0CFG_Val        0xe
#define CCLKCFG_Val       0x2
#define PLL1_SETUP        0x1
#define PLL1CFG_Val        0x23
#define USBCLKCFG_Val  0x5

void PLL_Init(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;
}




volatile unsigned long SysTickCnt;      /* SysTick Counter                    */
  
void SysTick_Handler (void) {           /* SysTick Interrupt Handler (1ms)    */
  SysTickCnt++;
}	  

void Delay (unsigned long tick) {       /* Delay Function                     */
  unsigned long systickcnt;

  systickcnt = SysTickCnt;
  while ((SysTickCnt - systickcnt) < tick);
}	
int main(void)
{ 
	 
 	SystemInit();
	PLL_Init();

  
       SysTick_Config(SystemCoreClock/1200 - 1); // Generate interrupt each 1 ms   
  


    LPC_PINCON->PINSEL0 = 0x0;			  // Bacakları Gpıo olarak ayarladık 
//	LPC_PINCON->PINSEL1	= 0X0;    
    LPC_GPIO0->FIODIR = 0x00100000;      // set pin P0.20 as output (Output = 1, Input = 0)   
    LPC_GPIO1->FIODIR = 0x03800000; 



	  
  
		
  while(1) {                                            
	   
	   if(LPC_GPIO1->FIOPIN&0x04000000)
	   {
    	LPC_GPIO0->FIOSET=0x00100000;  		
       	Delay(10000);                                              
        LPC_GPIO0->FIOCLR=0x00100000;
		Delay(10000);
		//LPC_GPIO1->FIOSET=0x00800000;
		//Delay(100);
		//LPC_GPIO1->FIOCLR=0x00800000;
		//Delay(100);
		//LPC_GPIO1->FIOSET=0x01000000;
		/*Delay(100);
		LPC_GPIO1->FIOCLR=0x01000000;
		Delay(100);
		LPC_GPIO1->FIOSET=0x02000000;
		Delay(100);
		LPC_GPIO1->FIOCLR=0x02000000;
		Delay(100);*/
		//LPC_GPIO1->FIOSET=0x04000000;
		//Delay(100);
		//LPC_GPIO1->FIOCLR=0x04000000;
		//Delay(100);
        
		}
                          
  }
}

kodlar çalısmaktadır.
sorum şu;
pll ayarları gecikme fonksiyonuna etki eder mi? ediyorsa nasıl bir etkisi vardır? işlemcinin hangi frekansta çalıstığını nasıl öğrenebilirim?

yamak

1200 değerini 1000 yaparsan düzelir. İşlemcini hangi frekansta çalıştığını öğrenmek istiyorsan debug yapabilirsin.Keil da peripherals->clocking and power control closk generation shematics sekmesinde öğrenebilirsin.

Justxc

#2
arkadaşlarada yardımcı olması amacı ile söyleyeyim. main fonksiyonunda StstemInit  i silip sadece pll_Init yazında işlemci 120 mhz de çalışmakta gecikme fonksiyonunu 1 ms ve katları olması için ise 1200 yerine 833 yazmamız gerekmekte.