mbed library sources. Supersedes mbed-src.

Fork of mbed-dev by mbed official

Committer:
fwndz
Date:
Thu Dec 22 05:12:40 2016 +0000
Revision:
153:9398a535854b
Parent:
149:156823d33999
device target maximize

Who changed what in which revision?

UserRevisionLine numberNew contents of line
<> 144:ef7eb2e8f9f7 1 /**************************************************************************//**
<> 144:ef7eb2e8f9f7 2 * @file system_LPC15xx.c
<> 144:ef7eb2e8f9f7 3 * @brief CMSIS Cortex-M3 Device System Source File for
<> 144:ef7eb2e8f9f7 4 * NXP LPC15xx Device Series
<> 144:ef7eb2e8f9f7 5 * @version V1.00
<> 144:ef7eb2e8f9f7 6 * @date 19. July 2013
<> 144:ef7eb2e8f9f7 7 *
<> 144:ef7eb2e8f9f7 8 * @note
<> 144:ef7eb2e8f9f7 9 * Copyright (C) 2013 ARM Limited. All rights reserved.
<> 144:ef7eb2e8f9f7 10 *
<> 144:ef7eb2e8f9f7 11 * @par
<> 144:ef7eb2e8f9f7 12 * ARM Limited (ARM) is supplying this software for use with Cortex-M
<> 144:ef7eb2e8f9f7 13 * processor based microcontrollers. This file can be freely distributed
<> 144:ef7eb2e8f9f7 14 * within development tools that are supporting such ARM based processors.
<> 144:ef7eb2e8f9f7 15 *
<> 144:ef7eb2e8f9f7 16 * @par
<> 144:ef7eb2e8f9f7 17 * THIS SOFTWARE IS PROVIDED "AS IS". NO WARRANTIES, WHETHER EXPRESS, IMPLIED
<> 144:ef7eb2e8f9f7 18 * OR STATUTORY, INCLUDING, BUT NOT LIMITED TO, IMPLIED WARRANTIES OF
<> 144:ef7eb2e8f9f7 19 * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE.
<> 144:ef7eb2e8f9f7 20 * ARM SHALL NOT, IN ANY CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR
<> 144:ef7eb2e8f9f7 21 * CONSEQUENTIAL DAMAGES, FOR ANY REASON WHATSOEVER.
<> 144:ef7eb2e8f9f7 22 *
<> 144:ef7eb2e8f9f7 23 ******************************************************************************/
<> 144:ef7eb2e8f9f7 24
<> 144:ef7eb2e8f9f7 25
<> 144:ef7eb2e8f9f7 26 #include <stdint.h>
<> 144:ef7eb2e8f9f7 27 #include "LPC15xx.h"
<> 144:ef7eb2e8f9f7 28
<> 144:ef7eb2e8f9f7 29 /*
<> 144:ef7eb2e8f9f7 30 //-------- <<< Use Configuration Wizard in Context Menu >>> ------------------
<> 144:ef7eb2e8f9f7 31 */
<> 144:ef7eb2e8f9f7 32
<> 144:ef7eb2e8f9f7 33 /*- SystemCoreClock Configuration -------------------------------------------*/
<> 144:ef7eb2e8f9f7 34 // <e0> SystemCoreClock Configuration
<> 144:ef7eb2e8f9f7 35 #define CLOCK_SETUP 1
<> 144:ef7eb2e8f9f7 36 //
<> 144:ef7eb2e8f9f7 37 // <h> System Oscillator Control (SYSOSCCTRL)
<> 144:ef7eb2e8f9f7 38 // <o.0> BYPASS: System Oscillator Bypass Enable
<> 144:ef7eb2e8f9f7 39 // <i> If enabled then PLL input (sys_osc_clk) is fed
<> 144:ef7eb2e8f9f7 40 // <i> directly from XTALIN and XTALOUT pins.
<> 144:ef7eb2e8f9f7 41 // <o.1> FREQRANGE: System Oscillator Frequency Range
<> 144:ef7eb2e8f9f7 42 // <i> Determines frequency range for Low-power oscillator.
<> 144:ef7eb2e8f9f7 43 // <0=> 1 - 20 MHz
<> 144:ef7eb2e8f9f7 44 // <1=> 15 - 25 MHz
<> 144:ef7eb2e8f9f7 45 // </h>
<> 144:ef7eb2e8f9f7 46 #define SYSOSCCTRL_Val 0x00000000 // Reset value: 0x000
<> 144:ef7eb2e8f9f7 47 //
<> 144:ef7eb2e8f9f7 48 // <o.0..1> System PLL Clock Source Select (SYSPLLCLKSEL)
<> 144:ef7eb2e8f9f7 49 // <0=> IRC Oscillator
<> 144:ef7eb2e8f9f7 50 // <1=> Crystal Oscillator (SYSOSC)
<> 144:ef7eb2e8f9f7 51 #define SYSPLLCLKSEL_Val 0x00000001 // Reset value: 0x000
<> 144:ef7eb2e8f9f7 52 //
<> 144:ef7eb2e8f9f7 53 // <e> Clock Configuration (Manual)
<> 144:ef7eb2e8f9f7 54 #define CLOCK_SETUP_REG 1
<> 144:ef7eb2e8f9f7 55 //
<> 144:ef7eb2e8f9f7 56 // <o.0..1> Main Clock Source Select A (MAINCLKSELA)
<> 144:ef7eb2e8f9f7 57 // <0=> IRC Oscillator
<> 144:ef7eb2e8f9f7 58 // <1=> System Oscillator
<> 144:ef7eb2e8f9f7 59 // <2=> WD Oscillator
<> 144:ef7eb2e8f9f7 60 #define MAINCLKSELA_Val 0x00000001 // Reset value: 0x000
<> 144:ef7eb2e8f9f7 61 //
<> 144:ef7eb2e8f9f7 62 // <o.0..1> Main Clock Source Select B (MAINCLKSELB)
<> 144:ef7eb2e8f9f7 63 // <0=> MAINCLKSELA
<> 144:ef7eb2e8f9f7 64 // <1=> System PLL Input
<> 144:ef7eb2e8f9f7 65 // <2=> System PLL Output
<> 144:ef7eb2e8f9f7 66 // <3=> RTC Oscillator
<> 144:ef7eb2e8f9f7 67 #define MAINCLKSELB_Val 0x00000002 // Reset value: 0x000
<> 144:ef7eb2e8f9f7 68 //
<> 144:ef7eb2e8f9f7 69 // <h> System PLL Setting (SYSPLLCTRL)
<> 144:ef7eb2e8f9f7 70 // <i> F_clkout = M * F_clkin = F_CCO / (2 * P)
<> 144:ef7eb2e8f9f7 71 // <i> F_clkin must be in the range of 10 MHz to 25 MHz
<> 144:ef7eb2e8f9f7 72 // <i> F_CCO must be in the range of 156 MHz to 320 MHz
<> 144:ef7eb2e8f9f7 73 // <o.0..5> MSEL: Feedback Divider Selection
<> 144:ef7eb2e8f9f7 74 // <i> M = MSEL + 1
<> 144:ef7eb2e8f9f7 75 // <0-31>
<> 144:ef7eb2e8f9f7 76 // <o.6..7> PSEL: Post Divider Selection
<> 144:ef7eb2e8f9f7 77 // <i> Post divider ratio P. Division ratio is 2 * P
<> 144:ef7eb2e8f9f7 78 // <0=> P = 1
<> 144:ef7eb2e8f9f7 79 // <1=> P = 2
<> 144:ef7eb2e8f9f7 80 // <2=> P = 4
<> 144:ef7eb2e8f9f7 81 // <3=> P = 8
<> 144:ef7eb2e8f9f7 82 // </h>
<> 144:ef7eb2e8f9f7 83 #define SYSPLLCTRL_Val 0x00000045 // Reset value: 0x000
<> 144:ef7eb2e8f9f7 84 //
<> 144:ef7eb2e8f9f7 85 // <o.0..7> System AHB Clock Divider (SYSAHBCLKDIV.DIV)
<> 144:ef7eb2e8f9f7 86 // <i> Divides main clock to provide system clock to core, memories, and peripherals.
<> 144:ef7eb2e8f9f7 87 // <i> 0 = is disabled
<> 144:ef7eb2e8f9f7 88 // <0-255>
<> 144:ef7eb2e8f9f7 89 #define SYSAHBCLKDIV_Val 0x00000001 // Reset value: 0x001
<> 144:ef7eb2e8f9f7 90 // </e>
<> 144:ef7eb2e8f9f7 91 //
<> 144:ef7eb2e8f9f7 92 // <e> Clock Configuration (via ROM PLL API)
<> 144:ef7eb2e8f9f7 93 #define CLOCK_SETUP_API 0
<> 144:ef7eb2e8f9f7 94 //
<> 144:ef7eb2e8f9f7 95 // <o> PLL API Mode Select
<> 144:ef7eb2e8f9f7 96 // <0=> Exact
<> 144:ef7eb2e8f9f7 97 // <1=> Less than or equal
<> 144:ef7eb2e8f9f7 98 // <2=> Greater than or equal
<> 144:ef7eb2e8f9f7 99 // <3=> As close as possible
<> 144:ef7eb2e8f9f7 100 #define PLL_API_MODE_Val 0
<> 144:ef7eb2e8f9f7 101 //
<> 144:ef7eb2e8f9f7 102 // <o> CPU Frequency [Hz] <1000000-72000000:1000>
<> 144:ef7eb2e8f9f7 103 #define PLL_API_FREQ_Val 72000000
<> 144:ef7eb2e8f9f7 104 // </e>
<> 144:ef7eb2e8f9f7 105 //
<> 144:ef7eb2e8f9f7 106 // <e> USB Clock Configuration
<> 144:ef7eb2e8f9f7 107 #define USB_CLOCK_SETUP 0
<> 144:ef7eb2e8f9f7 108 // <h> USB PLL Control (USBPLLCTRL)
<> 144:ef7eb2e8f9f7 109 // <i> F_clkout = M * F_clkin = F_CCO / (2 * P)
<> 144:ef7eb2e8f9f7 110 // <i> F_clkin must be in the range of 10 MHz to 25 MHz
<> 144:ef7eb2e8f9f7 111 // <i> F_CCO must be in the range of 156 MHz to 320 MHz
<> 144:ef7eb2e8f9f7 112 // <o.0..5> MSEL: Feedback Divider Selection
<> 144:ef7eb2e8f9f7 113 // <i> M = MSEL + 1
<> 144:ef7eb2e8f9f7 114 // <0-31>
<> 144:ef7eb2e8f9f7 115 // <o.7..6> PSEL: Post Divider Selection
<> 144:ef7eb2e8f9f7 116 // <i> Post divider ratio P. Division ratio is 2 * P
<> 144:ef7eb2e8f9f7 117 // <0=> P = 1
<> 144:ef7eb2e8f9f7 118 // <1=> P = 2
<> 144:ef7eb2e8f9f7 119 // <2=> P = 4
<> 144:ef7eb2e8f9f7 120 // <3=> P = 8
<> 144:ef7eb2e8f9f7 121 // </h>
<> 144:ef7eb2e8f9f7 122 #define USBPLLCTRL_Val 0x00000023 // Reset value: 0x000
<> 144:ef7eb2e8f9f7 123 //
<> 144:ef7eb2e8f9f7 124 // <o.0..1> USB PLL Clock Source Select (USBPLLCLKSEL.SEL)
<> 144:ef7eb2e8f9f7 125 // <0=> IRC Oscillator
<> 144:ef7eb2e8f9f7 126 // <1=> System Oscillator
<> 144:ef7eb2e8f9f7 127 #define USBPLLCLKSEL_Val 0x00000001 // Reset value: 0x000
<> 144:ef7eb2e8f9f7 128 //
<> 144:ef7eb2e8f9f7 129 // <o.0..1> USB Clock Source Select (USBCLKSEL.SEL)
<> 144:ef7eb2e8f9f7 130 // <0=> IRC Oscillator
<> 144:ef7eb2e8f9f7 131 // <1=> System Oscillator
<> 144:ef7eb2e8f9f7 132 // <2=> USB PLL out
<> 144:ef7eb2e8f9f7 133 // <3=> Main clock
<> 144:ef7eb2e8f9f7 134 #define USBCLKSEL_Val 0x00000002 // Reset value: 0x000
<> 144:ef7eb2e8f9f7 135 //
<> 144:ef7eb2e8f9f7 136 // <o.0..7> USB Clock Divider (USBCLKDIV.DIV)
<> 144:ef7eb2e8f9f7 137 // <i> Divides USB clock to 48 MHz.
<> 144:ef7eb2e8f9f7 138 // <i> 0 = is disabled
<> 144:ef7eb2e8f9f7 139 // <0-255>
<> 144:ef7eb2e8f9f7 140 #define USBCLKDIV_Val 0x00000001 // Reset Value: 0x001
<> 144:ef7eb2e8f9f7 141 // </e>
<> 144:ef7eb2e8f9f7 142 //
<> 144:ef7eb2e8f9f7 143 // <e> SCT Clock Configuration
<> 144:ef7eb2e8f9f7 144 #define SCT_CLOCK_SETUP 1
<> 144:ef7eb2e8f9f7 145 // <h> SCT PLL Control (SCTPLLCTRL)
<> 144:ef7eb2e8f9f7 146 // <i> F_clkout = M * F_clkin = F_CCO / (2 * P)
<> 144:ef7eb2e8f9f7 147 // <i> F_clkin must be in the range of 10 MHz to 25 MHz
<> 144:ef7eb2e8f9f7 148 // <i> F_CCO must be in the range of 156 MHz to 320 MHz
<> 144:ef7eb2e8f9f7 149 // <o.0..5> MSEL: Feedback Divider Selection
<> 144:ef7eb2e8f9f7 150 // <i> M = MSEL + 1
<> 144:ef7eb2e8f9f7 151 // <0-31>
<> 144:ef7eb2e8f9f7 152 // <o.7..6> PSEL: Post Divider Selection
<> 144:ef7eb2e8f9f7 153 // <i> Post divider ratio P. Division ratio is 2 * P
<> 144:ef7eb2e8f9f7 154 // <0=> P = 1
<> 144:ef7eb2e8f9f7 155 // <1=> P = 2
<> 144:ef7eb2e8f9f7 156 // <2=> P = 4
<> 144:ef7eb2e8f9f7 157 // <3=> P = 8
<> 144:ef7eb2e8f9f7 158 // </h>
<> 144:ef7eb2e8f9f7 159 #define SCTPLLCTRL_Val 0x00000045 // Reset value: 0x000
<> 144:ef7eb2e8f9f7 160 //
<> 144:ef7eb2e8f9f7 161 // <o.0..1> SCT PLL Clock Source Select (SCTPLLCLKSEL.SEL)
<> 144:ef7eb2e8f9f7 162 // <0=> IRC Oscillator
<> 144:ef7eb2e8f9f7 163 // <1=> System Oscillator
<> 144:ef7eb2e8f9f7 164 #define SCTPLLCLKSEL_Val 0x00000001 // Reset value: 0x000
<> 144:ef7eb2e8f9f7 165 // </e>
<> 144:ef7eb2e8f9f7 166 //
<> 144:ef7eb2e8f9f7 167 // </e>
<> 144:ef7eb2e8f9f7 168 //
<> 144:ef7eb2e8f9f7 169 // <o0>System Oscillator (XTAL) Frequency [Hz] <1000000-25000000>
<> 144:ef7eb2e8f9f7 170 // <i> XTAL frequency must be in the range of 1 MHz to 25 MHz
<> 144:ef7eb2e8f9f7 171 //
<> 144:ef7eb2e8f9f7 172 #define XTAL_CLK_Val 12000000
<> 144:ef7eb2e8f9f7 173
<> 144:ef7eb2e8f9f7 174 /*
<> 144:ef7eb2e8f9f7 175 //-------- <<< end of configuration section >>> ------------------------------
<> 144:ef7eb2e8f9f7 176 */
<> 144:ef7eb2e8f9f7 177
<> 144:ef7eb2e8f9f7 178 /*----------------------------------------------------------------------------
<> 144:ef7eb2e8f9f7 179 Define clocks
<> 144:ef7eb2e8f9f7 180 *----------------------------------------------------------------------------*/
<> 144:ef7eb2e8f9f7 181 #define __XTAL_CLK ( XTAL_CLK_Val) /* Oscillator freq */
<> 144:ef7eb2e8f9f7 182 #define __SYS_OSC_CLK ( __XTAL_CLK) /* System oscillator freq */
<> 144:ef7eb2e8f9f7 183 #define __IRC_OSC_CLK ( 12000000UL) /* Internal RC oscillator freq */
<> 144:ef7eb2e8f9f7 184 #define __RTC_OSC_CLK ( 32768UL) /* RTC oscillator freq */
<> 144:ef7eb2e8f9f7 185 #define __WDT_OSC_CLK ( 503000UL) /* WDT oscillator freq */
<> 144:ef7eb2e8f9f7 186
<> 144:ef7eb2e8f9f7 187 /*----------------------------------------------------------------------------
<> 144:ef7eb2e8f9f7 188 Check the register settings
<> 144:ef7eb2e8f9f7 189 *----------------------------------------------------------------------------*/
<> 144:ef7eb2e8f9f7 190 #define CHECK_RANGE(val, min, max) ((val < min) || (val > max))
<> 144:ef7eb2e8f9f7 191 #define CHECK_RSVD(val, mask) (val & mask)
<> 144:ef7eb2e8f9f7 192
<> 144:ef7eb2e8f9f7 193 #if (CHECK_RANGE((SYSOSCCTRL_Val), 0, 1))
<> 144:ef7eb2e8f9f7 194 #error "SYSOSCCTRL: Invalid values of reserved bits!"
<> 144:ef7eb2e8f9f7 195 #endif
<> 144:ef7eb2e8f9f7 196
<> 144:ef7eb2e8f9f7 197 #if (CHECK_RANGE((SYSPLLCLKSEL_Val), 0, 3))
<> 144:ef7eb2e8f9f7 198 #error "SYSPLLCLKSEL: Value out of range!"
<> 144:ef7eb2e8f9f7 199 #endif
<> 144:ef7eb2e8f9f7 200
<> 144:ef7eb2e8f9f7 201 #if (CHECK_RSVD((SYSPLLCTRL_Val), ~0x000000FF))
<> 144:ef7eb2e8f9f7 202 #error "SYSPLLCTRL: Invalid values of reserved bits!"
<> 144:ef7eb2e8f9f7 203 #endif
<> 144:ef7eb2e8f9f7 204
<> 144:ef7eb2e8f9f7 205 #if (CHECK_RANGE((MAINCLKSELA_Val), 0, 2))
<> 144:ef7eb2e8f9f7 206 #error "MAINCLKSELA: Invalid values of reserved bits!"
<> 144:ef7eb2e8f9f7 207 #endif
<> 144:ef7eb2e8f9f7 208
<> 144:ef7eb2e8f9f7 209 #if (CHECK_RSVD((MAINCLKSELB_Val), ~0x00000003))
<> 144:ef7eb2e8f9f7 210 #error "MAINCLKSELB: Invalid values of reserved bits!"
<> 144:ef7eb2e8f9f7 211 #endif
<> 144:ef7eb2e8f9f7 212
<> 144:ef7eb2e8f9f7 213 #if (CHECK_RANGE((SYSAHBCLKDIV_Val), 0, 255))
<> 144:ef7eb2e8f9f7 214 #error "SYSAHBCLKDIV: Value out of range!"
<> 144:ef7eb2e8f9f7 215 #endif
<> 144:ef7eb2e8f9f7 216
<> 144:ef7eb2e8f9f7 217 #if ( CLOCK_SETUP_REG == CLOCK_SETUP_API )
<> 144:ef7eb2e8f9f7 218 #error "You must select either manual or API based Clock Configuration!"
<> 144:ef7eb2e8f9f7 219 #endif
<> 144:ef7eb2e8f9f7 220
<> 144:ef7eb2e8f9f7 221 #if (CHECK_RANGE((USBPLLCLKSEL_Val), 0, 1))
<> 144:ef7eb2e8f9f7 222 #error "USBPLLCLKSEL: Value out of range!"
<> 144:ef7eb2e8f9f7 223 #endif
<> 144:ef7eb2e8f9f7 224
<> 144:ef7eb2e8f9f7 225 #if (CHECK_RSVD((USBPLLCTRL_Val), ~0x00000FF))
<> 144:ef7eb2e8f9f7 226 #error "USBPLLCTRL: Invalid values of reserved bits!"
<> 144:ef7eb2e8f9f7 227 #endif
<> 144:ef7eb2e8f9f7 228
<> 144:ef7eb2e8f9f7 229 #if (CHECK_RANGE((USBCLKSEL_Val), 0, 3))
<> 144:ef7eb2e8f9f7 230 #error "USBCLKSEL: Value out of range!"
<> 144:ef7eb2e8f9f7 231 #endif
<> 144:ef7eb2e8f9f7 232
<> 144:ef7eb2e8f9f7 233 #if (CHECK_RANGE((USBCLKDIV_Val), 0, 255))
<> 144:ef7eb2e8f9f7 234 #error "USBCLKDIV: Value out of range!"
<> 144:ef7eb2e8f9f7 235 #endif
<> 144:ef7eb2e8f9f7 236
<> 144:ef7eb2e8f9f7 237 #if (CHECK_RANGE((SCTPLLCLKSEL_Val), 0, 1))
<> 144:ef7eb2e8f9f7 238 #error "SCTPLLCLKSEL: Value out of range!"
<> 144:ef7eb2e8f9f7 239 #endif
<> 144:ef7eb2e8f9f7 240
<> 144:ef7eb2e8f9f7 241 #if (CHECK_RSVD((SCTPLLCTRL_Val), ~0x00000FF))
<> 144:ef7eb2e8f9f7 242 #error "SCTPLLCTRL: Invalid values of reserved bits!"
<> 144:ef7eb2e8f9f7 243 #endif
<> 144:ef7eb2e8f9f7 244
<> 144:ef7eb2e8f9f7 245 #if (CHECK_RANGE(XTAL_CLK_Val, 1000000, 25000000))
<> 144:ef7eb2e8f9f7 246 #error "XTAL frequency is out of bounds"
<> 144:ef7eb2e8f9f7 247 #endif
<> 144:ef7eb2e8f9f7 248
<> 144:ef7eb2e8f9f7 249 #if (CHECK_RANGE(PLL_API_MODE_Val, 0, 3))
<> 144:ef7eb2e8f9f7 250 #error "PLL API Mode Select not valid"
<> 144:ef7eb2e8f9f7 251 #endif
<> 144:ef7eb2e8f9f7 252
<> 144:ef7eb2e8f9f7 253 #if (CHECK_RANGE(PLL_API_FREQ_Val, 1000000, 72000000))
<> 144:ef7eb2e8f9f7 254 #error "CPU Frequency (API mode) not valid"
<> 144:ef7eb2e8f9f7 255 #endif
<> 144:ef7eb2e8f9f7 256
<> 144:ef7eb2e8f9f7 257
<> 144:ef7eb2e8f9f7 258
<> 144:ef7eb2e8f9f7 259 /*----------------------------------------------------------------------------
<> 144:ef7eb2e8f9f7 260 Calculate system core clock
<> 144:ef7eb2e8f9f7 261 *----------------------------------------------------------------------------*/
<> 144:ef7eb2e8f9f7 262 #if (CLOCK_SETUP) /* Clock Setup */
<> 144:ef7eb2e8f9f7 263
<> 144:ef7eb2e8f9f7 264 /* sys_pllclkin calculation */
<> 144:ef7eb2e8f9f7 265 #if ((SYSPLLCLKSEL_Val & 0x03) == 0)
<> 144:ef7eb2e8f9f7 266 #define __SYS_PLLCLKIN (__IRC_OSC_CLK)
<> 144:ef7eb2e8f9f7 267 #elif ((SYSPLLCLKSEL_Val & 0x03) == 1)
<> 144:ef7eb2e8f9f7 268 #define __SYS_PLLCLKIN (__SYS_OSC_CLK)
<> 144:ef7eb2e8f9f7 269 #else
<> 144:ef7eb2e8f9f7 270 #error "Oops"
<> 144:ef7eb2e8f9f7 271 #endif
<> 144:ef7eb2e8f9f7 272
<> 144:ef7eb2e8f9f7 273 #if (CLOCK_SETUP_REG == 1) /* Clock Setup via Register */
<> 144:ef7eb2e8f9f7 274
<> 144:ef7eb2e8f9f7 275 #if ((MAINCLKSELA_Val & 0x03) == 0)
<> 144:ef7eb2e8f9f7 276 #define __MAINA_CLOCK (__IRC_OSC_CLK)
<> 144:ef7eb2e8f9f7 277 #elif ((MAINCLKSELA_Val & 0x03) == 1)
<> 144:ef7eb2e8f9f7 278 #define __MAINA_CLOCK (__SYS_OSC_CLK)
<> 144:ef7eb2e8f9f7 279 #elif ((MAINCLKSELA_Val & 0x03) == 2)
<> 144:ef7eb2e8f9f7 280 #define __MAINA_CLOCK (__WDT_OSC_CLK)
<> 144:ef7eb2e8f9f7 281 #else
<> 144:ef7eb2e8f9f7 282 #error "Oops"
<> 144:ef7eb2e8f9f7 283 #endif
<> 144:ef7eb2e8f9f7 284
<> 144:ef7eb2e8f9f7 285 #define __SYS_PLLCLKOUT (__SYS_PLLCLKIN * ((SYSPLLCTRL_Val & 0x01F) + 1))
<> 144:ef7eb2e8f9f7 286
<> 144:ef7eb2e8f9f7 287 /* main clock calculation */
<> 144:ef7eb2e8f9f7 288 #if ((MAINCLKSELB_Val & 0x03) == 0)
<> 144:ef7eb2e8f9f7 289 #define __MAINB_CLOCK (__MAINA_CLOCK)
<> 144:ef7eb2e8f9f7 290 #elif ((MAINCLKSELB_Val & 0x03) == 1)
<> 144:ef7eb2e8f9f7 291 #define __MAINB_CLOCK (__SYS_PLLCLKIN)
<> 144:ef7eb2e8f9f7 292 #elif ((MAINCLKSELB_Val & 0x03) == 2)
<> 144:ef7eb2e8f9f7 293 #define __MAINB_CLOCK (__SYS_PLLCLKOUT)
<> 144:ef7eb2e8f9f7 294 #elif ((MAINCLKSELB_Val & 0x03) == 3)
<> 144:ef7eb2e8f9f7 295 #define __MAINB_CLOCK (__RTC_OSC_CLK)
<> 144:ef7eb2e8f9f7 296 #else
<> 144:ef7eb2e8f9f7 297 #error "Oops"
<> 144:ef7eb2e8f9f7 298 #endif
<> 144:ef7eb2e8f9f7 299
<> 144:ef7eb2e8f9f7 300 #define __SYSTEM_CLOCK (__MAINB_CLOCK / SYSAHBCLKDIV_Val)
<> 144:ef7eb2e8f9f7 301 #endif /* Clock Setup via Register */
<> 144:ef7eb2e8f9f7 302
<> 144:ef7eb2e8f9f7 303 #if (CLOCK_SETUP_API == 1) /* Clock Setup via ROM API */
<> 144:ef7eb2e8f9f7 304 #define __SYSTEM_CLOCK (PLL_API_FREQ_Val)
<> 144:ef7eb2e8f9f7 305 #endif /* Clock Setup via PLL API */
<> 144:ef7eb2e8f9f7 306
<> 144:ef7eb2e8f9f7 307 #else
<> 144:ef7eb2e8f9f7 308 #define __SYSTEM_CLOCK (__IRC_OSC_CLK)
<> 144:ef7eb2e8f9f7 309 #endif /* CLOCK_SETUP */
<> 144:ef7eb2e8f9f7 310
<> 144:ef7eb2e8f9f7 311
<> 144:ef7eb2e8f9f7 312
<> 144:ef7eb2e8f9f7 313 #if ((CLOCK_SETUP == 1) && (CLOCK_SETUP_API == 1)) /* PLL Setup via PLL API */
<> 144:ef7eb2e8f9f7 314 #include "power_api.h"
<> 144:ef7eb2e8f9f7 315
<> 144:ef7eb2e8f9f7 316 typedef struct _ROM {
<> 144:ef7eb2e8f9f7 317 const unsigned p_dev0;
<> 144:ef7eb2e8f9f7 318 const unsigned p_dev1;
<> 144:ef7eb2e8f9f7 319 const unsigned p_dev2;
<> 144:ef7eb2e8f9f7 320 const PWRD * pPWRD; /* ROM Power Management API */
<> 144:ef7eb2e8f9f7 321 const unsigned p_dev4;
<> 144:ef7eb2e8f9f7 322 const unsigned p_dev5;
<> 144:ef7eb2e8f9f7 323 const unsigned p_dev6;
<> 144:ef7eb2e8f9f7 324 const unsigned p_dev7;
<> 144:ef7eb2e8f9f7 325 } ROM;
<> 144:ef7eb2e8f9f7 326
<> 144:ef7eb2e8f9f7 327 /*----------------------------------------------------------------------------
<> 144:ef7eb2e8f9f7 328 PLL API Function
<> 144:ef7eb2e8f9f7 329 *----------------------------------------------------------------------------*/
<> 144:ef7eb2e8f9f7 330 static void setPLL(const uint32_t pllMode, const uint32_t pllInFreq, const uint32_t reqCpuFreq)
<> 144:ef7eb2e8f9f7 331 {
<> 144:ef7eb2e8f9f7 332 uint32_t cmd[5], res[5];
<> 144:ef7eb2e8f9f7 333 ROM ** rom = (ROM **) 0x03000200; /* pointer to power API calls */
<> 144:ef7eb2e8f9f7 334
<> 144:ef7eb2e8f9f7 335 cmd[0] = pllInFreq; /* PLL's input freq in KHz */
<> 144:ef7eb2e8f9f7 336 cmd[1] = reqCpuFreq; /* requested CPU freq in KHz */
<> 144:ef7eb2e8f9f7 337 cmd[2] = pllMode;
<> 144:ef7eb2e8f9f7 338 cmd[3] = 0; /* no timeout for PLL to lock */
<> 144:ef7eb2e8f9f7 339
<> 144:ef7eb2e8f9f7 340 /* Execute API call */
<> 144:ef7eb2e8f9f7 341 (*rom)->pPWRD->set_pll(cmd, res); /* call API function */
<> 144:ef7eb2e8f9f7 342 if ((res[0] != PLL_CMD_SUCCESS)){ /* in case of an error ... */
<> 144:ef7eb2e8f9f7 343 while(1); /* ... stay here */
<> 144:ef7eb2e8f9f7 344 }
<> 144:ef7eb2e8f9f7 345 }
<> 144:ef7eb2e8f9f7 346 #endif
<> 144:ef7eb2e8f9f7 347
<> 144:ef7eb2e8f9f7 348
<> 144:ef7eb2e8f9f7 349
<> 144:ef7eb2e8f9f7 350
<> 144:ef7eb2e8f9f7 351 /*----------------------------------------------------------------------------
<> 144:ef7eb2e8f9f7 352 Clock Variable definitions
<> 144:ef7eb2e8f9f7 353 *----------------------------------------------------------------------------*/
<> 144:ef7eb2e8f9f7 354 uint32_t SystemCoreClock = __SYSTEM_CLOCK; /* System Clock Frequency */
<> 144:ef7eb2e8f9f7 355
<> 144:ef7eb2e8f9f7 356
<> 144:ef7eb2e8f9f7 357 /*----------------------------------------------------------------------------
<> 144:ef7eb2e8f9f7 358 Clock functions
<> 144:ef7eb2e8f9f7 359 *----------------------------------------------------------------------------*/
<> 144:ef7eb2e8f9f7 360 void SystemCoreClockUpdate (void) /* Get Core Clock Frequency */
<> 144:ef7eb2e8f9f7 361 {
<> 144:ef7eb2e8f9f7 362 /* Determine clock frequency according to clock register values */
<> 144:ef7eb2e8f9f7 363 switch (LPC_SYSCON->MAINCLKSELB & 0x03) {
<> 144:ef7eb2e8f9f7 364 case 0: /* MAINCLKSELA clock sel */
<> 144:ef7eb2e8f9f7 365 switch (LPC_SYSCON->MAINCLKSELA & 0x03) {
<> 144:ef7eb2e8f9f7 366 case 0: /* Internal RC oscillator */
<> 144:ef7eb2e8f9f7 367 SystemCoreClock = __IRC_OSC_CLK;
<> 144:ef7eb2e8f9f7 368 break;
<> 144:ef7eb2e8f9f7 369 case 1: /* System oscillator */
<> 144:ef7eb2e8f9f7 370 SystemCoreClock = __SYS_OSC_CLK;
<> 144:ef7eb2e8f9f7 371 break;
<> 144:ef7eb2e8f9f7 372 case 2: /* Watchdog oscillator */
<> 144:ef7eb2e8f9f7 373 SystemCoreClock = __WDT_OSC_CLK;
<> 144:ef7eb2e8f9f7 374 break;
<> 144:ef7eb2e8f9f7 375 case 3: /* Reserved */
<> 144:ef7eb2e8f9f7 376 SystemCoreClock = 0;
<> 144:ef7eb2e8f9f7 377 break;
<> 144:ef7eb2e8f9f7 378 }
<> 144:ef7eb2e8f9f7 379 break;
<> 144:ef7eb2e8f9f7 380 case 1: /* Input Clock to System PLL */
<> 144:ef7eb2e8f9f7 381 switch (LPC_SYSCON->SYSPLLCLKSEL & 0x03) {
<> 144:ef7eb2e8f9f7 382 case 0: /* Internal RC oscillator */
<> 144:ef7eb2e8f9f7 383 SystemCoreClock = __IRC_OSC_CLK;
<> 144:ef7eb2e8f9f7 384 break;
<> 144:ef7eb2e8f9f7 385 case 1: /* System oscillator */
<> 144:ef7eb2e8f9f7 386 SystemCoreClock = __SYS_OSC_CLK;
<> 144:ef7eb2e8f9f7 387 break;
<> 144:ef7eb2e8f9f7 388 case 2: /* Reserved */
<> 144:ef7eb2e8f9f7 389 case 3: /* Reserved */
<> 144:ef7eb2e8f9f7 390 SystemCoreClock = 0;
<> 144:ef7eb2e8f9f7 391 break;
<> 144:ef7eb2e8f9f7 392 }
<> 144:ef7eb2e8f9f7 393 break;
<> 144:ef7eb2e8f9f7 394 case 2: /* System PLL Clock Out */
<> 144:ef7eb2e8f9f7 395 switch (LPC_SYSCON->SYSPLLCLKSEL & 0x03) {
<> 144:ef7eb2e8f9f7 396 case 0: /* Internal RC oscillator */
<> 144:ef7eb2e8f9f7 397 SystemCoreClock = __IRC_OSC_CLK * ((LPC_SYSCON->SYSPLLCTRL & 0x01F) + 1);
<> 144:ef7eb2e8f9f7 398 break;
<> 144:ef7eb2e8f9f7 399 case 1: /* System oscillator */
<> 144:ef7eb2e8f9f7 400 SystemCoreClock = __SYS_OSC_CLK * ((LPC_SYSCON->SYSPLLCTRL & 0x01F) + 1);
<> 144:ef7eb2e8f9f7 401 break;
<> 144:ef7eb2e8f9f7 402 case 2: /* Reserved */
<> 144:ef7eb2e8f9f7 403 case 3: /* Reserved */
<> 144:ef7eb2e8f9f7 404 SystemCoreClock = 0;
<> 144:ef7eb2e8f9f7 405 break;
<> 144:ef7eb2e8f9f7 406 }
<> 144:ef7eb2e8f9f7 407 break;
<> 144:ef7eb2e8f9f7 408 case 3: /* WDT Oscillator */
<> 144:ef7eb2e8f9f7 409 SystemCoreClock = __WDT_OSC_CLK;
<> 144:ef7eb2e8f9f7 410 break;
<> 144:ef7eb2e8f9f7 411 }
<> 144:ef7eb2e8f9f7 412
<> 144:ef7eb2e8f9f7 413 SystemCoreClock /= LPC_SYSCON->SYSAHBCLKDIV;
<> 144:ef7eb2e8f9f7 414
<> 144:ef7eb2e8f9f7 415 }
<> 144:ef7eb2e8f9f7 416
<> 144:ef7eb2e8f9f7 417 /**
<> 144:ef7eb2e8f9f7 418 * Initialize the system
<> 144:ef7eb2e8f9f7 419 *
<> 144:ef7eb2e8f9f7 420 * @param none
<> 144:ef7eb2e8f9f7 421 * @return none
<> 144:ef7eb2e8f9f7 422 *
<> 144:ef7eb2e8f9f7 423 * @brief Setup the microcontroller system.
<> 144:ef7eb2e8f9f7 424 */
<> 144:ef7eb2e8f9f7 425 void SystemInit (void) {
<> 144:ef7eb2e8f9f7 426 #if (CLOCK_SETUP)
<> 144:ef7eb2e8f9f7 427 volatile uint32_t i;
<> 144:ef7eb2e8f9f7 428 #endif
<> 144:ef7eb2e8f9f7 429
<> 144:ef7eb2e8f9f7 430 #if (CLOCK_SETUP) /* Clock Setup */
<> 144:ef7eb2e8f9f7 431
<> 144:ef7eb2e8f9f7 432 #if ((SYSPLLCLKSEL_Val & 0x03) == 1)
<> 144:ef7eb2e8f9f7 433 LPC_SYSCON->SYSOSCCTRL = SYSOSCCTRL_Val;
<> 144:ef7eb2e8f9f7 434 LPC_SYSCON->PDRUNCFG &= ~(1 << 21); /* Power-up sysosc */
<> 144:ef7eb2e8f9f7 435 for (i = 0; i < 200; i++) __NOP(); /* Wait for osc to stabilize */
<> 144:ef7eb2e8f9f7 436 #endif
<> 144:ef7eb2e8f9f7 437
<> 144:ef7eb2e8f9f7 438 LPC_SYSCON->SYSPLLCLKSEL = SYSPLLCLKSEL_Val; /* Select PLL Input */
<> 144:ef7eb2e8f9f7 439
<> 144:ef7eb2e8f9f7 440 #if (CLOCK_SETUP_REG == 1) /* Clock Setup via Register */
<> 144:ef7eb2e8f9f7 441
<> 144:ef7eb2e8f9f7 442 #if (((MAINCLKSELA_Val & 0x03) == 1) )
<> 144:ef7eb2e8f9f7 443 LPC_SYSCON->SYSOSCCTRL = SYSOSCCTRL_Val;
<> 144:ef7eb2e8f9f7 444 LPC_SYSCON->PDRUNCFG &= ~(1 << 21); /* Power-up sysosc */
<> 144:ef7eb2e8f9f7 445 for (i = 0; i < 200; i++) __NOP(); /* Wait for osc to stabilize */
<> 144:ef7eb2e8f9f7 446 #endif
<> 144:ef7eb2e8f9f7 447
<> 144:ef7eb2e8f9f7 448 #if (((MAINCLKSELA_Val & 0x03) == 2) )
<> 144:ef7eb2e8f9f7 449 LPC_SYSCON->PDRUNCFG &= ~(1 << 20); /* Power-up WDT Clock */
<> 144:ef7eb2e8f9f7 450 for (i = 0; i < 200; i++) __NOP(); /* Wait for osc to stabilize */
<> 144:ef7eb2e8f9f7 451 #endif
<> 144:ef7eb2e8f9f7 452
<> 144:ef7eb2e8f9f7 453 #if ((MAINCLKSELB_Val & 0x03) == 3)
<> 144:ef7eb2e8f9f7 454 LPC_SYSCON->RTCOSCCTRL = (1 << 0); /* Enable 32 kHz output */
<> 144:ef7eb2e8f9f7 455 for (i = 0; i < 200; i++) __NOP(); /* Wait for osc to stabilize */
<> 144:ef7eb2e8f9f7 456 #endif
<> 144:ef7eb2e8f9f7 457
<> 144:ef7eb2e8f9f7 458 LPC_SYSCON->MAINCLKSELA = MAINCLKSELA_Val; /* select MAINCLKA clock */
<> 144:ef7eb2e8f9f7 459
<> 144:ef7eb2e8f9f7 460 #if ((MAINCLKSELB_Val & 0x03) == 2) /* Main Clock is PLL Out */
<> 144:ef7eb2e8f9f7 461 LPC_SYSCON->SYSPLLCTRL = SYSPLLCTRL_Val;
<> 144:ef7eb2e8f9f7 462 LPC_SYSCON->PDRUNCFG &= ~(1 << 22); /* Power-up SYSPLL */
<> 144:ef7eb2e8f9f7 463 while (!(LPC_SYSCON->SYSPLLSTAT & 0x01)); /* Wait Until PLL Locked */
<> 144:ef7eb2e8f9f7 464 #endif
<> 144:ef7eb2e8f9f7 465
<> 144:ef7eb2e8f9f7 466 LPC_SYSCON->MAINCLKSELB = MAINCLKSELB_Val; /* select Main clock */
<> 144:ef7eb2e8f9f7 467
<> 144:ef7eb2e8f9f7 468 LPC_SYSCON->SYSAHBCLKDIV = SYSAHBCLKDIV_Val;
<> 144:ef7eb2e8f9f7 469 #endif /* Clock Setup via Register */
<> 144:ef7eb2e8f9f7 470
<> 144:ef7eb2e8f9f7 471 #if (CLOCK_SETUP_API == 1) /* Clock Setup via PLL API */
<> 144:ef7eb2e8f9f7 472 // LPC_SYSCON->SYSPLLCLKSEL = 0x00; /* Use IRC */
<> 144:ef7eb2e8f9f7 473
<> 144:ef7eb2e8f9f7 474 LPC_SYSCON->MAINCLKSELB = (1 << 2); /* Select System PLL output */
<> 144:ef7eb2e8f9f7 475
<> 144:ef7eb2e8f9f7 476 LPC_SYSCON->SYSAHBCLKDIV = 1;
<> 144:ef7eb2e8f9f7 477
<> 144:ef7eb2e8f9f7 478 setPLL(PLL_API_MODE_Val, __SYS_PLLCLKIN / 1000, PLL_API_FREQ_Val / 1000);
<> 144:ef7eb2e8f9f7 479 #endif /* Clock Setup via PLL API */
<> 144:ef7eb2e8f9f7 480
<> 144:ef7eb2e8f9f7 481 #if (USB_CLOCK_SETUP == 1) /* USB clock is used */
<> 144:ef7eb2e8f9f7 482 LPC_SYSCON->PDRUNCFG &= ~(1 << 9); /* Power-up USB PHY */
<> 144:ef7eb2e8f9f7 483
<> 144:ef7eb2e8f9f7 484 #if ((USBCLKSEL_Val & 0x003) == 2) /* USB clock is USB PLL out */
<> 144:ef7eb2e8f9f7 485 LPC_SYSCON->PDRUNCFG &= ~(1 << 23); /* Power-up USB PLL */
<> 144:ef7eb2e8f9f7 486 LPC_SYSCON->USBPLLCLKSEL = USBPLLCLKSEL_Val; /* Select PLL Input */
<> 144:ef7eb2e8f9f7 487
<> 144:ef7eb2e8f9f7 488 LPC_SYSCON->USBPLLCTRL = USBPLLCTRL_Val;
<> 144:ef7eb2e8f9f7 489 while (!(LPC_SYSCON->USBPLLSTAT & 0x01)); /* Wait Until PLL Locked */
<> 144:ef7eb2e8f9f7 490
<> 144:ef7eb2e8f9f7 491 LPC_SYSCON->USBCLKSEL = 0x02; /* Select USB PLL */
<> 144:ef7eb2e8f9f7 492 #endif
<> 144:ef7eb2e8f9f7 493
<> 144:ef7eb2e8f9f7 494 LPC_SYSCON->USBCLKSEL = USBCLKSEL_Val; /* Select USB Clock */
<> 144:ef7eb2e8f9f7 495 LPC_SYSCON->USBCLKDIV = USBCLKDIV_Val; /* Set USB clock divider */
<> 144:ef7eb2e8f9f7 496
<> 144:ef7eb2e8f9f7 497 #else /* USB clock is not used */
<> 144:ef7eb2e8f9f7 498 LPC_SYSCON->PDRUNCFG |= (1 << 9); /* Power-down USB PHY */
<> 144:ef7eb2e8f9f7 499 LPC_SYSCON->PDRUNCFG |= (1 << 23); /* Power-down USB PLL */
<> 144:ef7eb2e8f9f7 500 #endif
<> 144:ef7eb2e8f9f7 501
<> 144:ef7eb2e8f9f7 502 #if (SCT_CLOCK_SETUP == 1) /* SCT clock is used */
<> 144:ef7eb2e8f9f7 503 LPC_SYSCON->PDRUNCFG &= ~(1 << 24); /* Power-up SCT PLL */
<> 144:ef7eb2e8f9f7 504 LPC_SYSCON->SCTPLLCLKSEL = SCTPLLCLKSEL_Val; /* Select PLL Input */
<> 144:ef7eb2e8f9f7 505
<> 144:ef7eb2e8f9f7 506 LPC_SYSCON->SCTPLLCTRL = SCTPLLCTRL_Val;
<> 144:ef7eb2e8f9f7 507 while (!(LPC_SYSCON->SCTPLLSTAT & 0x01)); /* Wait Until PLL Locked */
<> 144:ef7eb2e8f9f7 508 #else /* SCT clock is not used */
<> 144:ef7eb2e8f9f7 509 LPC_SYSCON->PDRUNCFG |= (1 << 24); /* Power-down SCT PLL */
<> 144:ef7eb2e8f9f7 510 #endif
<> 144:ef7eb2e8f9f7 511
<> 144:ef7eb2e8f9f7 512 #endif /* Clock Setup */
<> 144:ef7eb2e8f9f7 513
<> 144:ef7eb2e8f9f7 514
<> 144:ef7eb2e8f9f7 515 LPC_SYSCON->SYSAHBCLKCTRL0 |= (1UL << 12); /* enable clock for SWM */
<> 144:ef7eb2e8f9f7 516
<> 144:ef7eb2e8f9f7 517 }