Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Fork of mbed-src by
system_LPC17xx.c
00001 /**************************************************************************//** 00002 * @file system_LPC17xx.c 00003 * @brief CMSIS Cortex-M3 Device System Source File for 00004 * NXP LPC17xx Device Series 00005 * @version V1.11 00006 * @date 21. June 2011 00007 * 00008 * @note 00009 * Copyright (C) 2009-2011 ARM Limited. All rights reserved. 00010 * 00011 * @par 00012 * ARM Limited (ARM) is supplying this software for use with Cortex-M 00013 * processor based microcontrollers. This file can be freely distributed 00014 * within development tools that are supporting such ARM based processors. 00015 * 00016 * @par 00017 * THIS SOFTWARE IS PROVIDED "AS IS". NO WARRANTIES, WHETHER EXPRESS, IMPLIED 00018 * OR STATUTORY, INCLUDING, BUT NOT LIMITED TO, IMPLIED WARRANTIES OF 00019 * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. 00020 * ARM SHALL NOT, IN ANY CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR 00021 * CONSEQUENTIAL DAMAGES, FOR ANY REASON WHATSOEVER. 00022 * 00023 ******************************************************************************/ 00024 00025 00026 #include <stdint.h> 00027 #include "LPC17xx.h" 00028 00029 00030 /** @addtogroup LPC17xx_System 00031 * @{ 00032 */ 00033 00034 /* 00035 //-------- <<< Use Configuration Wizard in Context Menu >>> ------------------ 00036 */ 00037 00038 /*--------------------- Clock Configuration ---------------------------------- 00039 // 00040 // <e> Clock Configuration 00041 // <h> System Controls and Status Register (SCS) 00042 // <o1.4> OSCRANGE: Main Oscillator Range Select 00043 // <0=> 1 MHz to 20 MHz 00044 // <1=> 15 MHz to 25 MHz 00045 // <e1.5> OSCEN: Main Oscillator Enable 00046 // </e> 00047 // </h> 00048 // 00049 // <h> Clock Source Select Register (CLKSRCSEL) 00050 // <o2.0..1> CLKSRC: PLL Clock Source Selection 00051 // <0=> Internal RC oscillator 00052 // <1=> Main oscillator 00053 // <2=> RTC oscillator 00054 // </h> 00055 // 00056 // <e3> PLL0 Configuration (Main PLL) 00057 // <h> PLL0 Configuration Register (PLL0CFG) 00058 // <i> F_cco0 = (2 * M * F_in) / N 00059 // <i> F_in must be in the range of 32 kHz to 50 MHz 00060 // <i> F_cco0 must be in the range of 275 MHz to 550 MHz 00061 // <o4.0..14> MSEL: PLL Multiplier Selection 00062 // <6-32768><#-1> 00063 // <i> M Value 00064 // <o4.16..23> NSEL: PLL Divider Selection 00065 // <1-256><#-1> 00066 // <i> N Value 00067 // </h> 00068 // </e> 00069 // 00070 // <e5> PLL1 Configuration (USB PLL) 00071 // <h> PLL1 Configuration Register (PLL1CFG) 00072 // <i> F_usb = M * F_osc or F_usb = F_cco1 / (2 * P) 00073 // <i> F_cco1 = F_osc * M * 2 * P 00074 // <i> F_cco1 must be in the range of 156 MHz to 320 MHz 00075 // <o6.0..4> MSEL: PLL Multiplier Selection 00076 // <1-32><#-1> 00077 // <i> M Value (for USB maximum value is 4) 00078 // <o6.5..6> PSEL: PLL Divider Selection 00079 // <0=> 1 00080 // <1=> 2 00081 // <2=> 4 00082 // <3=> 8 00083 // <i> P Value 00084 // </h> 00085 // </e> 00086 // 00087 // <h> CPU Clock Configuration Register (CCLKCFG) 00088 // <o7.0..7> CCLKSEL: Divide Value for CPU Clock from PLL0 00089 // <1-256><#-1> 00090 // </h> 00091 // 00092 // <h> USB Clock Configuration Register (USBCLKCFG) 00093 // <o8.0..3> USBSEL: Divide Value for USB Clock from PLL0 00094 // <0-15> 00095 // <i> Divide is USBSEL + 1 00096 // </h> 00097 // 00098 // <h> Peripheral Clock Selection Register 0 (PCLKSEL0) 00099 // <o9.0..1> PCLK_WDT: Peripheral Clock Selection for WDT 00100 // <0=> Pclk = Cclk / 4 00101 // <1=> Pclk = Cclk 00102 // <2=> Pclk = Cclk / 2 00103 // <3=> Pclk = Hclk / 8 00104 // <o9.2..3> PCLK_TIMER0: Peripheral Clock Selection for TIMER0 00105 // <0=> Pclk = Cclk / 4 00106 // <1=> Pclk = Cclk 00107 // <2=> Pclk = Cclk / 2 00108 // <3=> Pclk = Hclk / 8 00109 // <o9.4..5> PCLK_TIMER1: Peripheral Clock Selection for TIMER1 00110 // <0=> Pclk = Cclk / 4 00111 // <1=> Pclk = Cclk 00112 // <2=> Pclk = Cclk / 2 00113 // <3=> Pclk = Hclk / 8 00114 // <o9.6..7> PCLK_UART0: Peripheral Clock Selection for UART0 00115 // <0=> Pclk = Cclk / 4 00116 // <1=> Pclk = Cclk 00117 // <2=> Pclk = Cclk / 2 00118 // <3=> Pclk = Hclk / 8 00119 // <o9.8..9> PCLK_UART1: Peripheral Clock Selection for UART1 00120 // <0=> Pclk = Cclk / 4 00121 // <1=> Pclk = Cclk 00122 // <2=> Pclk = Cclk / 2 00123 // <3=> Pclk = Hclk / 8 00124 // <o9.12..13> PCLK_PWM1: Peripheral Clock Selection for PWM1 00125 // <0=> Pclk = Cclk / 4 00126 // <1=> Pclk = Cclk 00127 // <2=> Pclk = Cclk / 2 00128 // <3=> Pclk = Hclk / 8 00129 // <o9.14..15> PCLK_I2C0: Peripheral Clock Selection for I2C0 00130 // <0=> Pclk = Cclk / 4 00131 // <1=> Pclk = Cclk 00132 // <2=> Pclk = Cclk / 2 00133 // <3=> Pclk = Hclk / 8 00134 // <o9.16..17> PCLK_SPI: Peripheral Clock Selection for SPI 00135 // <0=> Pclk = Cclk / 4 00136 // <1=> Pclk = Cclk 00137 // <2=> Pclk = Cclk / 2 00138 // <3=> Pclk = Hclk / 8 00139 // <o9.20..21> PCLK_SSP1: Peripheral Clock Selection for SSP1 00140 // <0=> Pclk = Cclk / 4 00141 // <1=> Pclk = Cclk 00142 // <2=> Pclk = Cclk / 2 00143 // <3=> Pclk = Hclk / 8 00144 // <o9.22..23> PCLK_DAC: Peripheral Clock Selection for DAC 00145 // <0=> Pclk = Cclk / 4 00146 // <1=> Pclk = Cclk 00147 // <2=> Pclk = Cclk / 2 00148 // <3=> Pclk = Hclk / 8 00149 // <o9.24..25> PCLK_ADC: Peripheral Clock Selection for ADC 00150 // <0=> Pclk = Cclk / 4 00151 // <1=> Pclk = Cclk 00152 // <2=> Pclk = Cclk / 2 00153 // <3=> Pclk = Hclk / 8 00154 // <o9.26..27> PCLK_CAN1: Peripheral Clock Selection for CAN1 00155 // <0=> Pclk = Cclk / 4 00156 // <1=> Pclk = Cclk 00157 // <2=> Pclk = Cclk / 2 00158 // <3=> Pclk = Hclk / 6 00159 // <o9.28..29> PCLK_CAN2: Peripheral Clock Selection for CAN2 00160 // <0=> Pclk = Cclk / 4 00161 // <1=> Pclk = Cclk 00162 // <2=> Pclk = Cclk / 2 00163 // <3=> Pclk = Hclk / 6 00164 // <o9.30..31> PCLK_ACF: Peripheral Clock Selection for ACF 00165 // <0=> Pclk = Cclk / 4 00166 // <1=> Pclk = Cclk 00167 // <2=> Pclk = Cclk / 2 00168 // <3=> Pclk = Hclk / 6 00169 // </h> 00170 // 00171 // <h> Peripheral Clock Selection Register 1 (PCLKSEL1) 00172 // <o10.0..1> PCLK_QEI: Peripheral Clock Selection for the Quadrature Encoder Interface 00173 // <0=> Pclk = Cclk / 4 00174 // <1=> Pclk = Cclk 00175 // <2=> Pclk = Cclk / 2 00176 // <3=> Pclk = Hclk / 8 00177 // <o10.2..3> PCLK_GPIO: Peripheral Clock Selection for GPIOs 00178 // <0=> Pclk = Cclk / 4 00179 // <1=> Pclk = Cclk 00180 // <2=> Pclk = Cclk / 2 00181 // <3=> Pclk = Hclk / 8 00182 // <o10.4..5> PCLK_PCB: Peripheral Clock Selection for the Pin Connect Block 00183 // <0=> Pclk = Cclk / 4 00184 // <1=> Pclk = Cclk 00185 // <2=> Pclk = Cclk / 2 00186 // <3=> Pclk = Hclk / 8 00187 // <o10.6..7> PCLK_I2C1: Peripheral Clock Selection for I2C1 00188 // <0=> Pclk = Cclk / 4 00189 // <1=> Pclk = Cclk 00190 // <2=> Pclk = Cclk / 2 00191 // <3=> Pclk = Hclk / 8 00192 // <o10.10..11> PCLK_SSP0: Peripheral Clock Selection for SSP0 00193 // <0=> Pclk = Cclk / 4 00194 // <1=> Pclk = Cclk 00195 // <2=> Pclk = Cclk / 2 00196 // <3=> Pclk = Hclk / 8 00197 // <o10.12..13> PCLK_TIMER2: Peripheral Clock Selection for TIMER2 00198 // <0=> Pclk = Cclk / 4 00199 // <1=> Pclk = Cclk 00200 // <2=> Pclk = Cclk / 2 00201 // <3=> Pclk = Hclk / 8 00202 // <o10.14..15> PCLK_TIMER3: Peripheral Clock Selection for TIMER3 00203 // <0=> Pclk = Cclk / 4 00204 // <1=> Pclk = Cclk 00205 // <2=> Pclk = Cclk / 2 00206 // <3=> Pclk = Hclk / 8 00207 // <o10.16..17> PCLK_UART2: Peripheral Clock Selection for UART2 00208 // <0=> Pclk = Cclk / 4 00209 // <1=> Pclk = Cclk 00210 // <2=> Pclk = Cclk / 2 00211 // <3=> Pclk = Hclk / 8 00212 // <o10.18..19> PCLK_UART3: Peripheral Clock Selection for UART3 00213 // <0=> Pclk = Cclk / 4 00214 // <1=> Pclk = Cclk 00215 // <2=> Pclk = Cclk / 2 00216 // <3=> Pclk = Hclk / 8 00217 // <o10.20..21> PCLK_I2C2: Peripheral Clock Selection for I2C2 00218 // <0=> Pclk = Cclk / 4 00219 // <1=> Pclk = Cclk 00220 // <2=> Pclk = Cclk / 2 00221 // <3=> Pclk = Hclk / 8 00222 // <o10.22..23> PCLK_I2S: Peripheral Clock Selection for I2S 00223 // <0=> Pclk = Cclk / 4 00224 // <1=> Pclk = Cclk 00225 // <2=> Pclk = Cclk / 2 00226 // <3=> Pclk = Hclk / 8 00227 // <o10.26..27> PCLK_RIT: Peripheral Clock Selection for the Repetitive Interrupt Timer 00228 // <0=> Pclk = Cclk / 4 00229 // <1=> Pclk = Cclk 00230 // <2=> Pclk = Cclk / 2 00231 // <3=> Pclk = Hclk / 8 00232 // <o10.28..29> PCLK_SYSCON: Peripheral Clock Selection for the System Control Block 00233 // <0=> Pclk = Cclk / 4 00234 // <1=> Pclk = Cclk 00235 // <2=> Pclk = Cclk / 2 00236 // <3=> Pclk = Hclk / 8 00237 // <o10.30..31> PCLK_MC: Peripheral Clock Selection for the Motor Control PWM 00238 // <0=> Pclk = Cclk / 4 00239 // <1=> Pclk = Cclk 00240 // <2=> Pclk = Cclk / 2 00241 // <3=> Pclk = Hclk / 8 00242 // </h> 00243 // 00244 // <h> Power Control for Peripherals Register (PCONP) 00245 // <o11.1> PCTIM0: Timer/Counter 0 power/clock enable 00246 // <o11.2> PCTIM1: Timer/Counter 1 power/clock enable 00247 // <o11.3> PCUART0: UART 0 power/clock enable 00248 // <o11.4> PCUART1: UART 1 power/clock enable 00249 // <o11.6> PCPWM1: PWM 1 power/clock enable 00250 // <o11.7> PCI2C0: I2C interface 0 power/clock enable 00251 // <o11.8> PCSPI: SPI interface power/clock enable 00252 // <o11.9> PCRTC: RTC power/clock enable 00253 // <o11.10> PCSSP1: SSP interface 1 power/clock enable 00254 // <o11.12> PCAD: A/D converter power/clock enable 00255 // <o11.13> PCCAN1: CAN controller 1 power/clock enable 00256 // <o11.14> PCCAN2: CAN controller 2 power/clock enable 00257 // <o11.15> PCGPIO: GPIOs power/clock enable 00258 // <o11.16> PCRIT: Repetitive interrupt timer power/clock enable 00259 // <o11.17> PCMC: Motor control PWM power/clock enable 00260 // <o11.18> PCQEI: Quadrature encoder interface power/clock enable 00261 // <o11.19> PCI2C1: I2C interface 1 power/clock enable 00262 // <o11.21> PCSSP0: SSP interface 0 power/clock enable 00263 // <o11.22> PCTIM2: Timer 2 power/clock enable 00264 // <o11.23> PCTIM3: Timer 3 power/clock enable 00265 // <o11.24> PCUART2: UART 2 power/clock enable 00266 // <o11.25> PCUART3: UART 3 power/clock enable 00267 // <o11.26> PCI2C2: I2C interface 2 power/clock enable 00268 // <o11.27> PCI2S: I2S interface power/clock enable 00269 // <o11.29> PCGPDMA: GP DMA function power/clock enable 00270 // <o11.30> PCENET: Ethernet block power/clock enable 00271 // <o11.31> PCUSB: USB interface power/clock enable 00272 // </h> 00273 // 00274 // <h> Clock Output Configuration Register (CLKOUTCFG) 00275 // <o12.0..3> CLKOUTSEL: Selects clock source for CLKOUT 00276 // <0=> CPU clock 00277 // <1=> Main oscillator 00278 // <2=> Internal RC oscillator 00279 // <3=> USB clock 00280 // <4=> RTC oscillator 00281 // <o12.4..7> CLKOUTDIV: Selects clock divider for CLKOUT 00282 // <1-16><#-1> 00283 // <o12.8> CLKOUT_EN: CLKOUT enable control 00284 // </h> 00285 // 00286 // </e> 00287 */ 00288 00289 00290 00291 /** @addtogroup LPC17xx_System_Defines LPC17xx System Defines 00292 @{ 00293 */ 00294 00295 #define CLOCK_SETUP 1 00296 #define SCS_Val 0x00000020 00297 #define CLKSRCSEL_Val 0x00000001 00298 #define PLL0_SETUP 1 00299 00300 #ifdef MCB1700 00301 # define PLL0CFG_Val 0x00050063 00302 # define PLL1_SETUP 1 00303 # define PLL1CFG_Val 0x00000023 00304 # define CCLKCFG_Val 0x00000003 00305 # define USBCLKCFG_Val 0x00000000 00306 #else 00307 # define PLL0CFG_Val 0x0000000B 00308 # define PLL1_SETUP 0 00309 # define PLL1CFG_Val 0x00000000 00310 # define CCLKCFG_Val 0x00000002 00311 # define USBCLKCFG_Val 0x00000005 00312 #endif 00313 00314 #define PCLKSEL0_Val 0x00000000 00315 #define PCLKSEL1_Val 0x00000000 00316 #define PCONP_Val 0x042887DE 00317 #define CLKOUTCFG_Val 0x00000000 00318 00319 00320 /*--------------------- Flash Accelerator Configuration ---------------------- 00321 // 00322 // <e> Flash Accelerator Configuration 00323 // <o1.12..15> FLASHTIM: Flash Access Time 00324 // <0=> 1 CPU clock (for CPU clock up to 20 MHz) 00325 // <1=> 2 CPU clocks (for CPU clock up to 40 MHz) 00326 // <2=> 3 CPU clocks (for CPU clock up to 60 MHz) 00327 // <3=> 4 CPU clocks (for CPU clock up to 80 MHz) 00328 // <4=> 5 CPU clocks (for CPU clock up to 100 MHz) 00329 // <5=> 6 CPU clocks (for any CPU clock) 00330 // </e> 00331 */ 00332 #define FLASH_SETUP 1 00333 #define FLASHCFG_Val 0x0000303A 00334 00335 /* 00336 //-------- <<< end of configuration section >>> ------------------------------ 00337 */ 00338 00339 /*---------------------------------------------------------------------------- 00340 Check the register settings 00341 *----------------------------------------------------------------------------*/ 00342 #define CHECK_RANGE(val, min, max) ((val < min) || (val > max)) 00343 #define CHECK_RSVD(val, mask) (val & mask) 00344 00345 /* Clock Configuration -------------------------------------------------------*/ 00346 #if (CHECK_RSVD((SCS_Val), ~0x00000030)) 00347 #error "SCS: Invalid values of reserved bits!" 00348 #endif 00349 00350 #if (CHECK_RANGE((CLKSRCSEL_Val), 0, 2)) 00351 #error "CLKSRCSEL: Value out of range!" 00352 #endif 00353 00354 #if (CHECK_RSVD((PLL0CFG_Val), ~0x00FF7FFF)) 00355 #error "PLL0CFG: Invalid values of reserved bits!" 00356 #endif 00357 00358 #if (CHECK_RSVD((PLL1CFG_Val), ~0x0000007F)) 00359 #error "PLL1CFG: Invalid values of reserved bits!" 00360 #endif 00361 00362 #if (PLL0_SETUP) /* if PLL0 is used */ 00363 #if (CCLKCFG_Val < 2) /* CCLKSEL must be greater then 1 */ 00364 #error "CCLKCFG: CCLKSEL must be greater then 1 if PLL0 is used!" 00365 #endif 00366 #endif 00367 00368 #if (CHECK_RANGE((CCLKCFG_Val), 2, 255)) 00369 #error "CCLKCFG: Value out of range!" 00370 #endif 00371 00372 #if (CHECK_RSVD((USBCLKCFG_Val), ~0x0000000F)) 00373 #error "USBCLKCFG: Invalid values of reserved bits!" 00374 #endif 00375 00376 #if (CHECK_RSVD((PCLKSEL0_Val), 0x000C0C00)) 00377 #error "PCLKSEL0: Invalid values of reserved bits!" 00378 #endif 00379 00380 #if (CHECK_RSVD((PCLKSEL1_Val), 0x03000300)) 00381 #error "PCLKSEL1: Invalid values of reserved bits!" 00382 #endif 00383 00384 #if (CHECK_RSVD((PCONP_Val), 0x10100821)) 00385 #error "PCONP: Invalid values of reserved bits!" 00386 #endif 00387 00388 #if (CHECK_RSVD((CLKOUTCFG_Val), ~0x000001FF)) 00389 #error "CLKOUTCFG: Invalid values of reserved bits!" 00390 #endif 00391 00392 /* Flash Accelerator Configuration -------------------------------------------*/ 00393 #if (CHECK_RSVD((FLASHCFG_Val), ~0x0000F07F)) 00394 #error "FLASHCFG: Invalid values of reserved bits!" 00395 #endif 00396 00397 00398 /*---------------------------------------------------------------------------- 00399 DEFINES 00400 *----------------------------------------------------------------------------*/ 00401 00402 /*---------------------------------------------------------------------------- 00403 Define clocks 00404 *----------------------------------------------------------------------------*/ 00405 #define XTAL (12000000UL) /* Oscillator frequency */ 00406 #define OSC_CLK ( XTAL) /* Main oscillator frequency */ 00407 #define RTC_CLK ( 32000UL) /* RTC oscillator frequency */ 00408 #define IRC_OSC ( 4000000UL) /* Internal RC oscillator frequency */ 00409 00410 00411 /* F_cco0 = (2 * M * F_in) / N */ 00412 #define __M (((PLL0CFG_Val ) & 0x7FFF) + 1) 00413 #define __N (((PLL0CFG_Val >> 16) & 0x00FF) + 1) 00414 #define __FCCO(__F_IN) ((2ULL * __M * __F_IN) / __N) 00415 #define __CCLK_DIV (((CCLKCFG_Val ) & 0x00FF) + 1) 00416 00417 /* Determine core clock frequency according to settings */ 00418 #if (PLL0_SETUP) 00419 #if ((CLKSRCSEL_Val & 0x03) == 1) 00420 #define __CORE_CLK (__FCCO(OSC_CLK) / __CCLK_DIV) 00421 #elif ((CLKSRCSEL_Val & 0x03) == 2) 00422 #define __CORE_CLK (__FCCO(RTC_CLK) / __CCLK_DIV) 00423 #else 00424 #define __CORE_CLK (__FCCO(IRC_OSC) / __CCLK_DIV) 00425 #endif 00426 #else 00427 #if ((CLKSRCSEL_Val & 0x03) == 1) 00428 #define __CORE_CLK (OSC_CLK / __CCLK_DIV) 00429 #elif ((CLKSRCSEL_Val & 0x03) == 2) 00430 #define __CORE_CLK (RTC_CLK / __CCLK_DIV) 00431 #else 00432 #define __CORE_CLK (IRC_OSC / __CCLK_DIV) 00433 #endif 00434 #endif 00435 00436 /** 00437 * @} 00438 */ 00439 00440 00441 /** @addtogroup LPC17xx_System_Public_Variables LPC17xx System Public Variables 00442 @{ 00443 */ 00444 /*---------------------------------------------------------------------------- 00445 Clock Variable definitions 00446 *----------------------------------------------------------------------------*/ 00447 uint32_t SystemCoreClock = __CORE_CLK;/*!< System Clock Frequency (Core Clock)*/ 00448 00449 /** 00450 * @} 00451 */ 00452 00453 00454 /** @addtogroup LPC17xx_System_Public_Functions LPC17xx System Public Functions 00455 @{ 00456 */ 00457 00458 /** 00459 * Update SystemCoreClock variable 00460 * 00461 * @param none 00462 * @return none 00463 * 00464 * @brief Updates the SystemCoreClock with current core Clock 00465 * retrieved from cpu registers. 00466 */void SystemCoreClockUpdate (void) /* Get Core Clock Frequency */ 00467 { 00468 /* Determine clock frequency according to clock register values */ 00469 if (((LPC_SC->PLL0STAT >> 24) & 3) == 3) { /* If PLL0 enabled and connected */ 00470 switch (LPC_SC->CLKSRCSEL & 0x03) { 00471 case 0: /* Int. RC oscillator => PLL0 */ 00472 case 3: /* Reserved, default to Int. RC */ 00473 SystemCoreClock = (IRC_OSC * 00474 ((2ULL * ((LPC_SC->PLL0STAT & 0x7FFF) + 1))) / 00475 (((LPC_SC->PLL0STAT >> 16) & 0xFF) + 1) / 00476 ((LPC_SC->CCLKCFG & 0xFF)+ 1)); 00477 break; 00478 case 1: /* Main oscillator => PLL0 */ 00479 SystemCoreClock = (OSC_CLK * 00480 ((2ULL * ((LPC_SC->PLL0STAT & 0x7FFF) + 1))) / 00481 (((LPC_SC->PLL0STAT >> 16) & 0xFF) + 1) / 00482 ((LPC_SC->CCLKCFG & 0xFF)+ 1)); 00483 break; 00484 case 2: /* RTC oscillator => PLL0 */ 00485 SystemCoreClock = (RTC_CLK * 00486 ((2ULL * ((LPC_SC->PLL0STAT & 0x7FFF) + 1))) / 00487 (((LPC_SC->PLL0STAT >> 16) & 0xFF) + 1) / 00488 ((LPC_SC->CCLKCFG & 0xFF)+ 1)); 00489 break; 00490 } 00491 } else { 00492 switch (LPC_SC->CLKSRCSEL & 0x03) { 00493 case 0: /* Int. RC oscillator => PLL0 */ 00494 case 3: /* Reserved, default to Int. RC */ 00495 SystemCoreClock = IRC_OSC / ((LPC_SC->CCLKCFG & 0xFF)+ 1); 00496 break; 00497 case 1: /* Main oscillator => PLL0 */ 00498 SystemCoreClock = OSC_CLK / ((LPC_SC->CCLKCFG & 0xFF)+ 1); 00499 break; 00500 case 2: /* RTC oscillator => PLL0 */ 00501 SystemCoreClock = RTC_CLK / ((LPC_SC->CCLKCFG & 0xFF)+ 1); 00502 break; 00503 } 00504 } 00505 00506 } 00507 00508 /** 00509 * Initialize the system 00510 * 00511 * @param none 00512 * @return none 00513 * 00514 * @brief Setup the microcontroller system. 00515 * Initialize the System. 00516 */ 00517 void SystemInit (void) 00518 { 00519 #if (CLOCK_SETUP) /* Clock Setup */ 00520 LPC_SC->SCS = SCS_Val; 00521 if (LPC_SC->SCS & (1 << 5)) { /* If Main Oscillator is enabled */ 00522 while ((LPC_SC->SCS & (1<<6)) == 0);/* Wait for Oscillator to be ready */ 00523 } 00524 00525 LPC_SC->CCLKCFG = CCLKCFG_Val; /* Setup Clock Divider */ 00526 /* Periphral clock must be selected before PLL0 enabling and connecting 00527 * - according errata.lpc1768-16.March.2010 - 00528 */ 00529 LPC_SC->PCLKSEL0 = PCLKSEL0_Val; /* Peripheral Clock Selection */ 00530 LPC_SC->PCLKSEL1 = PCLKSEL1_Val; 00531 00532 #if (PLL0_SETUP) 00533 LPC_SC->CLKSRCSEL = CLKSRCSEL_Val; /* Select Clock Source for PLL0 */ 00534 00535 LPC_SC->PLL0CFG = PLL0CFG_Val; /* configure PLL0 */ 00536 LPC_SC->PLL0FEED = 0xAA; 00537 LPC_SC->PLL0FEED = 0x55; 00538 00539 LPC_SC->PLL0CON = 0x01; /* PLL0 Enable */ 00540 LPC_SC->PLL0FEED = 0xAA; 00541 LPC_SC->PLL0FEED = 0x55; 00542 while (!(LPC_SC->PLL0STAT & (1<<26)));/* Wait for PLOCK0 */ 00543 00544 LPC_SC->PLL0CON = 0x03; /* PLL0 Enable & Connect */ 00545 LPC_SC->PLL0FEED = 0xAA; 00546 LPC_SC->PLL0FEED = 0x55; 00547 while (!(LPC_SC->PLL0STAT & ((1<<25) | (1<<24))));/* Wait for PLLC0_STAT & PLLE0_STAT */ 00548 #endif 00549 00550 #if (PLL1_SETUP) 00551 LPC_SC->PLL1CFG = PLL1CFG_Val; 00552 LPC_SC->PLL1FEED = 0xAA; 00553 LPC_SC->PLL1FEED = 0x55; 00554 00555 LPC_SC->PLL1CON = 0x01; /* PLL1 Enable */ 00556 LPC_SC->PLL1FEED = 0xAA; 00557 LPC_SC->PLL1FEED = 0x55; 00558 while (!(LPC_SC->PLL1STAT & (1<<10)));/* Wait for PLOCK1 */ 00559 00560 LPC_SC->PLL1CON = 0x03; /* PLL1 Enable & Connect */ 00561 LPC_SC->PLL1FEED = 0xAA; 00562 LPC_SC->PLL1FEED = 0x55; 00563 while (!(LPC_SC->PLL1STAT & ((1<< 9) | (1<< 8))));/* Wait for PLLC1_STAT & PLLE1_STAT */ 00564 #else 00565 LPC_SC->USBCLKCFG = USBCLKCFG_Val; /* Setup USB Clock Divider */ 00566 #endif 00567 00568 LPC_SC->PCONP = PCONP_Val; /* Power Control for Peripherals */ 00569 00570 LPC_SC->CLKOUTCFG = CLKOUTCFG_Val; /* Clock Output Configuration */ 00571 #endif 00572 00573 #if (FLASH_SETUP == 1) /* Flash Accelerator Setup */ 00574 LPC_SC->FLASHCFG = (LPC_SC->FLASHCFG & ~0x0000F000) | FLASHCFG_Val; 00575 #endif 00576 } 00577 00578 /** 00579 * @} 00580 */ 00581 00582 /** 00583 * @} 00584 */
Generated on Tue Jul 12 2022 13:47:02 by
1.7.2
