void Chip_SetupXtalClocking(void) { /* Disconnect the Main PLL if it is connected already */ if (Chip_Clock_IsMainPLLConnected()) { Chip_Clock_DisablePLL(SYSCTL_MAIN_PLL, SYSCTL_PLL_CONNECT); } /* Disable the PLL if it is enabled */ if (Chip_Clock_IsMainPLLEnabled()) { Chip_Clock_DisablePLL(SYSCTL_MAIN_PLL, SYSCTL_PLL_ENABLE); } /* Enable the crystal */ if (!Chip_Clock_IsCrystalEnabled()) Chip_Clock_EnableCrystal(); while(!Chip_Clock_IsCrystalEnabled()) {} /* Set PLL0 Source to Crystal Oscillator */ Chip_Clock_SetCPUClockDiv(0); Chip_Clock_SetMainPLLSource(SYSCTL_PLLCLKSRC_MAINOSC); /* FCCO = ((15+1) * 2 * 12MHz) / (0+1) = 384MHz */ Chip_Clock_SetupPLL(SYSCTL_MAIN_PLL, 15, 0); Chip_Clock_EnablePLL(SYSCTL_MAIN_PLL, SYSCTL_PLL_ENABLE); /* 384MHz / (3+1) = 96MHz */ Chip_Clock_SetCPUClockDiv(3); while (!Chip_Clock_IsMainPLLLocked()) {} /* Wait for the PLL to Lock */ Chip_Clock_EnablePLL(SYSCTL_MAIN_PLL, SYSCTL_PLL_CONNECT); }
/* Clock and PLL initialization based on the external oscillator */ void Chip_SetupXtalClocking(void) { /* Enable the crystal */ if (!Chip_Clock_IsCrystalEnabled()) Chip_Clock_EnableCrystal(); while(!Chip_Clock_IsCrystalEnabled()) {} /* Clock the CPU from SYSCLK, in case if it is clocked by PLL0 */ Chip_Clock_SetCPUClockSource(SYSCTL_CCLKSRC_SYSCLK); /* Disable the PLL if it is enabled */ if (Chip_Clock_IsMainPLLEnabled()) { Chip_Clock_DisablePLL(SYSCTL_MAIN_PLL, SYSCTL_PLL_ENABLE); } /* It is safe to switch the PLL Source to Crystal Oscillator */ Chip_Clock_SetMainPLLSource(SYSCTL_PLLCLKSRC_MAINOSC); /* FCCO = 12MHz * (9+1) * 2 * (0+1) = 240MHz */ /* Fout = FCCO / ((0+1) * 2) = 120MHz */ Chip_Clock_SetupPLL(SYSCTL_MAIN_PLL, 9, 0); Chip_Clock_EnablePLL(SYSCTL_MAIN_PLL, SYSCTL_PLL_ENABLE); Chip_Clock_SetCPUClockDiv(1); while (!Chip_Clock_IsMainPLLLocked()) {} /* Wait for the PLL to Lock */ Chip_Clock_SetCPUClockSource(SYSCTL_CCLKSRC_MAINPLL); /* Peripheral clocking will be derived from PLL0 with a divider of 2 (60MHz) */ Chip_Clock_SetPCLKDiv(2); }
void setupClock(void) { /* Disconnect the Main PLL if it is connected already */ if (Chip_Clock_IsMainPLLConnected()) { Chip_Clock_DisablePLL(SYSCTL_MAIN_PLL, SYSCTL_PLL_CONNECT); } /* Disable the PLL if it is enabled */ if (Chip_Clock_IsMainPLLEnabled()) { Chip_Clock_DisablePLL(SYSCTL_MAIN_PLL, SYSCTL_PLL_ENABLE); } /* Enable the crystal */ if (!Chip_Clock_IsCrystalEnabled()) Chip_Clock_EnableCrystal(); while(!Chip_Clock_IsCrystalEnabled()) {} /* Set PLL0 Source to Crystal Oscillator */ Chip_Clock_SetCPUClockDiv(0); Chip_Clock_SetMainPLLSource(SYSCTL_PLLCLKSRC_MAINOSC); /* FCCO = ((19+1) * 2 * 12MHz) / (0+1) = 480MHz */ Chip_Clock_SetupPLL(SYSCTL_MAIN_PLL, 19, 0); Chip_Clock_EnablePLL(SYSCTL_MAIN_PLL, SYSCTL_PLL_ENABLE); /* 480MHz / (3+1) = 120MHz */ Chip_Clock_SetCPUClockDiv(3); while (!Chip_Clock_IsMainPLLLocked()) {} /* Wait for the PLL to Lock */ Chip_Clock_EnablePLL(SYSCTL_MAIN_PLL, SYSCTL_PLL_CONNECT); Chip_SYSCTL_SetFLASHAccess(FLASHTIM_120MHZ_CPU); }
/* Setup Chip Core clock */ void Chip_SetupCoreClock(CHIP_CGU_CLKIN_T clkin, uint32_t core_freq, bool setbase) { int i; if (clkin == CLKIN_CRYSTAL) { /* Switch main system clocking to crystal */ Chip_Clock_EnableCrystal(); } Chip_Clock_SetBaseClock(CLK_BASE_MX, clkin, true, false); if (core_freq > 110000000UL) { /* Setup PLL for 100MHz and switch main system clocking */ Chip_Clock_SetupMainPLLHz(clkin, CGU_IRC_FREQ, 110 * 1000000, 110 * 1000000); Chip_Clock_SetBaseClock(CLK_BASE_MX, CLKIN_MAINPLL, true, false); } /* Setup PLL for maximum clock */ Chip_Clock_SetupMainPLLHz(clkin, OscRateIn, core_freq, core_freq); if (setbase) { /* Setup system base clocks and initial states. This won't enable and disable individual clocks, but sets up the base clock sources for each individual peripheral clock. */ for (i = 0; i < (sizeof(InitClkStates) / sizeof(InitClkStates[0])); i++) { Chip_Clock_SetBaseClock(InitClkStates[i].clk, InitClkStates[i].clkin, InitClkStates[i].autoblock_enab, InitClkStates[i].powerdn); } } }
/* Setup system clocking */ STATIC void SystemSetupClocking(void) { int i; /* Switch main system clocking to crystal */ Chip_Clock_EnableCrystal(); Chip_Clock_SetBaseClock(CLK_BASE_MX, CLKIN_CRYSTAL, true, false); /* Setup PLL for 100MHz and switch main system clocking */ Chip_Clock_SetupMainPLLHz(CLKIN_CRYSTAL, CRYSTAL_MAIN_FREQ_IN, 100 * 1000000, 100 * 1000000); Chip_Clock_SetBaseClock(CLK_BASE_MX, CLKIN_MAINPLL, true, false); /* Setup PLL for maximum clock */ Chip_Clock_SetupMainPLLHz(CLKIN_CRYSTAL, CRYSTAL_MAIN_FREQ_IN, MAX_CLOCK_FREQ, MAX_CLOCK_FREQ); /* Setup system base clocks and initial states. This won't enable and disable individual clocks, but sets up the base clock sources for each individual peripheral clock. */ for (i = 0; i < (sizeof(InitClkStates) / sizeof(InitClkStates[0])); i++) { Chip_Clock_SetBaseClock(InitClkStates[i].clk, InitClkStates[i].clkin, InitClkStates[i].autoblock_enab, InitClkStates[i].powerdn); } /* Reset and enable 32Khz oscillator */ LPC_CREG->CREG0 &= ~((1 << 3) | (1 << 2)); LPC_CREG->CREG0 |= (1 << 1) | (1 << 0); /* SPIFI pin setup is done prior to setting up system clocking */ for (i = 0; i < (sizeof(spifipinmuxing) / sizeof(spifipinmuxing[0])); i++) { Chip_SCU_PinMuxSet(spifipinmuxing[i].pingrp, spifipinmuxing[i].pinnum, spifipinmuxing[i].modefunc); } /* Setup a divider E for main PLL clock switch SPIFI clock to that divider. Divide rate is based on CPU speed and speed of SPI FLASH part. */ #if (MAX_CLOCK_FREQ > 180000000) Chip_Clock_SetDivider(CLK_IDIV_E, CLKIN_MAINPLL, 5); #else Chip_Clock_SetDivider(CLK_IDIV_E, CLKIN_MAINPLL, 4); #endif Chip_Clock_SetBaseClock(CLK_BASE_SPIFI, CLKIN_IDIVE, true, false); /* Attach main PLL clock to divider C with a divider of 2 */ Chip_Clock_SetDivider(CLK_IDIV_C, CLKIN_MAINPLL, 2); /* Setup default USB PLL state for a 480MHz output and attach */ Chip_Clock_SetupPLL(CLKIN_CRYSTAL, CGU_USB_PLL, &usbPLLSetup); /* USB1 needs a 60MHz clock. To get it, a divider of 4 and then 2 are chained to make a divide by 8 function. Connect the output of divider D to the USB1 base clock. */ Chip_Clock_SetDivider(CLK_IDIV_A, CLKIN_USBPLL, 4); Chip_Clock_SetDivider(CLK_IDIV_D, CLKIN_IDIVA, 2); Chip_Clock_SetBaseClock(CLK_BASE_USB1, CLKIN_IDIVD, true, true); /* Setup default audio PLL state for a FIXME output */ // Chip_Clock_SetupPLL(CGU_AUDIO_PLL, &audioPLLSetup); // FIXME }
/* Setup system clocking */ STATIC void SystemSetupClocking(void) { int i; /* Switch main system clocking to crystal */ Chip_Clock_EnableCrystal(); Chip_Clock_SetBaseClock(CLK_BASE_MX, CLKIN_CRYSTAL, true, false); /* Setup PLL for 100MHz and switch main system clocking */ Chip_Clock_SetupMainPLLHz(CLKIN_CRYSTAL, CRYSTAL_MAIN_FREQ_IN, 100 * 1000000, 100 * 1000000); Chip_Clock_SetBaseClock(CLK_BASE_MX, CLKIN_MAINPLL, true, false); /* Setup PLL for maximum clock */ Chip_Clock_SetupMainPLLHz(CLKIN_CRYSTAL, CRYSTAL_MAIN_FREQ_IN, MAX_CLOCK_FREQ, MAX_CLOCK_FREQ); /* Setup system base clocks and initial states. This won't enable and disable individual clocks, but sets up the base clock sources for each individual peripheral clock. */ for (i = 0; i < (sizeof(InitClkStates) / sizeof(InitClkStates[0])); i++) { Chip_Clock_SetBaseClock(InitClkStates[i].clk, InitClkStates[i].clkin, InitClkStates[i].autoblock_enab, InitClkStates[i].powerdn); } /* Reset and enable 32Khz oscillator */ LPC_CREG->CREG0 &= ~((1 << 3) | (1 << 2)); LPC_CREG->CREG0 |= (1 << 1) | (1 << 0); /* SPIFI pin setup is done prior to setting up system clocking */ for (i = 0; i < (sizeof(spifipinmuxing) / sizeof(spifipinmuxing[0])); i++) { Chip_SCU_PinMux(spifipinmuxing[i].pingrp, spifipinmuxing[i].pinnum, spifipinmuxing[i].pincfg, spifipinmuxing[i].funcnum); } /* Setup a divider E for main PLL clock switch SPIFI clock to that divider. Divide rate is based on CPU speed and speed of SPI FLASH part. */ #if (MAX_CLOCK_FREQ > 180000000) Chip_Clock_SetDivider(CLK_IDIV_E, CLKIN_MAINPLL, 5); #else Chip_Clock_SetDivider(CLK_IDIV_E, CLKIN_MAINPLL, 4); #endif Chip_Clock_SetBaseClock(CLK_BASE_SPIFI, CLKIN_IDIVE, true, false); }
/* Setup system clocking */ void Chip_SetupXtalClocking(void) { int i; /* Switch main system clocking to crystal */ Chip_Clock_EnableCrystal(); Chip_Clock_SetBaseClock(CLK_BASE_MX, CLKIN_CRYSTAL, true, false); /* Setup PLL for 100MHz and switch main system clocking */ Chip_Clock_SetupMainPLLHz(CLKIN_CRYSTAL, OscRateIn, 100 * 1000000, 100 * 1000000); Chip_Clock_SetBaseClock(CLK_BASE_MX, CLKIN_MAINPLL, true, false); /* Setup PLL for maximum clock */ Chip_Clock_SetupMainPLLHz(CLKIN_CRYSTAL, OscRateIn, MAX_CLOCK_FREQ, MAX_CLOCK_FREQ); /* Setup system base clocks and initial states. This won't enable and disable individual clocks, but sets up the base clock sources for each individual peripheral clock. */ for (i = 0; i < (sizeof(InitClkStates) / sizeof(InitClkStates[0])); i++) { Chip_Clock_SetBaseClock(InitClkStates[i].clk, InitClkStates[i].clkin, InitClkStates[i].autoblock_enab, InitClkStates[i].powerdn); } }