/** * \file * * * \author Francesco Sacchi * * \brief LPC2378 CRT. * notest:arm */ #include #include #include #if CPU_FREQ != 72000000UL /* Avoid errors on nightly test */ #if !defined(ARCH_NIGHTTEST) || !(ARCH & ARCH_NIGHTTEST) #warning Clock registers set for 72MHz operation, revise following code if you want a different clock. #endif #endif /* * With a 12MHz cristal, master clock is: * (((2 * 12 * (PLL_MUL_VAL + 1)) / (PLL_DIV_VAL + 1)) / (LPC2_CPUCLOCK_DIV + 1))= 72MHz */ #define PLL_MUL_VAL 11 #define PLL_DIV_VAL 0 #define LPC2_CPUCLOCK_DIV 3 /* PLL feed sequence */ #define PLL_FEED_SEQ() ATOMIC(PLLFEED = 0xAA; PLLFEED = 0x55;) static void configurePll(void) { /* Disconnect and disable the PLL, if already active */ if (PLLSTAT & (1 << 25)) { /* Disconnect PLL, but leave it enabled */ PLLCON = 0x01; PLL_FEED_SEQ(); /* Disable PLL */ PLLCON = 0; PLL_FEED_SEQ(); } /* Enable the main oscillator and wait for it to be stable */ SCS |= (1 << 5); while (!(SCS & (1 << 6))) ; /* Select the main oscillator as the PLL clock source */ CLKSRCSEL = 0x01; /* Set up PLL mul and div */ PLLCFG = PLL_MUL_VAL | (PLL_DIV_VAL << 16); PLL_FEED_SEQ(); /* Enable PLL, disconnected */ PLLCON = 0x01; PLL_FEED_SEQ(); /* Set clock divider */ CCLKCFG = LPC2_CPUCLOCK_DIV; /* Wait for the PLL to lock */ while (!(PLLSTAT & (1 << 26))) ; /* Enable and connect the PLL */ PLLCON = 0x03; PLL_FEED_SEQ(); } void __init1(void); void __init1(void) { /* Map irq vectors to internal flash */ MEMMAP = 0x01; /* Configure PLL, switch from IRC to Main OSC */ configurePll(); /* Set memory accelerator module flash timings */ #if CPU_FREQ < 20000000UL MAMTIM = 1; #elif CPU_FREQ < 40000000UL MAMTIM = 2; #elif CPU_FREQ < 60000000UL MAMTIM = 3; #else MAMTIM = 4; #endif /* Memory accelerator module fully enabled */ MAMCR = 0x02; } void __init2(void); void __init2(void) { vic_init(); }