123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169 |
- /*
- * @brief LPC5410X Chip specific SystemInit
- *
- * @note
- * Copyright(C) NXP Semiconductors, 2014
- * All rights reserved.
- *
- * @par
- * Software that is described herein is for illustrative purposes only
- * which provides customers with programming information regarding the
- * LPC products. This software is supplied "AS IS" without any warranties of
- * any kind, and NXP Semiconductors and its licensor disclaim any and
- * all warranties, express or implied, including all implied warranties of
- * merchantability, fitness for a particular purpose and non-infringement of
- * intellectual property rights. NXP Semiconductors assumes no responsibility
- * or liability for the use of the software, conveys no license or rights under any
- * patent, copyright, mask work right, or any other intellectual property rights in
- * or to any products. NXP Semiconductors reserves the right to make changes
- * in the software without notification. NXP Semiconductors also makes no
- * representation or warranty that such application will be suitable for the
- * specified use without further testing or modification.
- *
- * @par
- * Permission to use, copy, modify, and distribute this software and its
- * documentation is hereby granted, under NXP Semiconductors' and its
- * licensor's relevant copyrights in the software, without fee, provided that it
- * is used in conjunction with NXP Semiconductors microcontrollers. This
- * copyright, permission, and disclaimer notice must appear in all copies of
- * this code.
- */
- #include "chip.h"
- /*****************************************************************************
- * Private types/enumerations/variables
- ****************************************************************************/
- /*****************************************************************************
- * Public types/enumerations/variables
- ****************************************************************************/
- /*****************************************************************************
- * Private functions
- ****************************************************************************/
- /* Sets the best FLASH clock arte for the passed frequency */
- static void setupFlashClocks(uint32_t freq)
- {
- /* v17.0 ROM support only - coarse FLASH clocking timing.
- FLASH access is setup based on voltage for v17.1 and later ROMs
- as part of the power library. */
- if (Chip_POWER_GetROMVersion() == LPC5410X_ROMVER_0) {
- if (freq < 20000000) {
- Chip_SYSCON_SetFLASHAccess(SYSCON_FLASH_1CYCLE);
- }
- else if (freq < 48000000) {
- Chip_SYSCON_SetFLASHAccess(SYSCON_FLASH_2CYCLE);
- }
- else if (freq < 72000000) {
- Chip_SYSCON_SetFLASHAccess(SYSCON_FLASH_3CYCLE);
- }
- else {
- Chip_SYSCON_SetFLASHAccess(SYSCON_FLASH_4CYCLE);
- }
- }
- }
- /*****************************************************************************
- * Public functions
- ****************************************************************************/
- /* Clock and PLL initialization based on the internal oscillator */
- void Chip_SetupIrcClocking(uint32_t iFreq)
- {
- PLL_CONFIG_T pllConfig;
- PLL_SETUP_T pllSetup;
- PLL_ERROR_T pllError;
- /* Turn on the IRC by clearing the power down bit */
- Chip_SYSCON_PowerUp(SYSCON_PDRUNCFG_PD_IRC_OSC | SYSCON_PDRUNCFG_PD_IRC);
- /* Select the PLL input to the IRC */
- Chip_Clock_SetSystemPLLSource(SYSCON_PLLCLKSRC_IRC);
- /* Setup FLASH access û½øÈ¥??*/
- setupFlashClocks(iFreq);
- /* Power down PLL to change the PLL divider ratio */
- Chip_SYSCON_PowerDown(SYSCON_PDRUNCFG_PD_SYS_PLL);
- /* Setup PLL configuration */
- pllConfig.desiredRate = iFreq;
- pllConfig.InputRate = 0;
- pllConfig.flags = PLL_CONFIGFLAG_FORCENOFRACT;
- pllError = Chip_Clock_SetupPLLData(&pllConfig, &pllSetup);
- if (pllError == PLL_ERROR_SUCCESS) {
- pllSetup.flags = PLL_SETUPFLAG_WAITLOCK | PLL_SETUPFLAG_ADGVOLT;
- pllError = Chip_Clock_SetupSystemPLLPrec(&pllSetup);
- }
- /* Set system clock divider to 1 */
- Chip_Clock_SetSysClockDiv(1);
- /* Set main clock source to the system PLL. This will drive 24MHz
- for the main clock and 24MHz for the system clock */
- Chip_Clock_SetMainClockSource(SYSCON_MAINCLKSRC_PLLOUT);
- /* ASYSNC SYSCON needs to be on or all serial peripheral won't work.
- Be careful if PLL is used or not, ASYNC_SYSCON source needs to be
- selected carefully. */
- Chip_SYSCON_Enable_ASYNC_Syscon(true);
- Chip_Clock_SetAsyncSysconClockDiv(1);
- Chip_Clock_SetAsyncSysconClockSource(SYSCON_ASYNC_IRC);
- }
- /* Clock and PLL initialization based on the external clock input */
- void Chip_SetupExtInClocking(uint32_t iFreq)
- {
- PLL_CONFIG_T pllConfig;
- PLL_SETUP_T pllSetup;
- PLL_ERROR_T pllError;
- /* IOCON clock left on, this is needed is CLKIN is used. */
- Chip_Clock_EnablePeriphClock(SYSCON_CLOCK_IOCON);
- /* Select external clock input pin */
- Chip_IOCON_PinMuxSet(LPC_IOCON, 0, 22, (IOCON_MODE_PULLUP |
- IOCON_FUNC1 | IOCON_DIGITAL_EN | IOCON_INPFILT_OFF));
- /* Select the PLL input to the EXT clock input */
- Chip_Clock_SetSystemPLLSource(SYSCON_PLLCLKSRC_CLKIN);
- /* Setup FLASH access */
- setupFlashClocks(iFreq);
- /* Power down PLL to change the PLL divider ratio */
- Chip_SYSCON_PowerDown(SYSCON_PDRUNCFG_PD_SYS_PLL);
- /* Setup PLL configuration */
- pllConfig.desiredRate = iFreq;
- pllConfig.InputRate = 0;
- pllConfig.flags = PLL_CONFIGFLAG_FORCENOFRACT;
- pllError = Chip_Clock_SetupPLLData(&pllConfig, &pllSetup);
- if (pllError == PLL_ERROR_SUCCESS) {
- pllSetup.flags = PLL_SETUPFLAG_WAITLOCK | PLL_SETUPFLAG_ADGVOLT;
- pllError = Chip_Clock_SetupSystemPLLPrec(&pllSetup);
- }
- /* Set system clock divider to 1 */
- Chip_Clock_SetSysClockDiv(1);
- /* Set main clock source to the system PLL. This will drive 24MHz
- for the main clock and 24MHz for the system clock */
- Chip_Clock_SetMainClockSource(SYSCON_MAINCLKSRC_PLLOUT);
- /* ASYSNC SYSCON needs to be on or all serial peripheral won't work.
- Be careful if PLL is used or not, ASYNC_SYSCON source needs to be
- selected carefully. */
- Chip_SYSCON_Enable_ASYNC_Syscon(true);
- Chip_Clock_SetAsyncSysconClockDiv(1);
- Chip_Clock_SetAsyncSysconClockSource(SYSCON_ASYNC_IRC);
- }
- /* Set up and initialize hardware prior to call to main */
- void Chip_SystemInit(void)
- {
- /* Initial internal clocking @100MHz */
- Chip_SetupIrcClocking(100000000);
- }
|