#include "LPC11xx.h"
typedef struct {/*!< SYSCTL Structure */
__IO uint32_t SYSMEMREMAP;/*!< System Memory remap register */
__IO uint32_t PRESETCTRL;/*!< Peripheral reset Control register */
__IO uint32_t SYSPLLCTRL;/*!< System PLL control register */
__I uint32_t SYSPLLSTAT;/*!< System PLL status register */
__IO uint32_t USBPLLCTRL;/*!< USB PLL control register, LPC11UXX only*/
__I uint32_t USBPLLSTAT;/*!< USB PLL status register, LPC11UXX only */
__I uint32_t RESERVED1[2];
__IO uint32_t SYSOSCCTRL;/*!< System Oscillator control register */
__IO uint32_t WDTOSCCTRL;/*!< Watchdog Oscillator control register */
__IO uint32_t IRCCTRL;/*!< IRC control register, not on LPC11UXX and LPC11EXX */
__IO uint32_t LFOSCCTRL;/*!< LF oscillator control, LPC11AXX only */
__IO uint32_t SYSRSTSTAT;/*!< System Reset Status register */
__I uint32_t RESERVED2[3];
__IO uint32_t SYSPLLCLKSEL;/*!< System PLL clock source select register */
__IO uint32_t SYSPLLCLKUEN;/*!< System PLL clock source update enable register*/
__IO uint32_t USBPLLCLKSEL;/*!< USB PLL clock source select register, LPC11UXX only */
__IO uint32_t USBPLLCLKUEN;/*!< USB PLL clock source update enable register, LPC11UXX only */
__I uint32_t RESERVED3[8];
__IO uint32_t MAINCLKSEL;/*!< Main clock source select register*/
__IO uint32_t MAINCLKUEN;/*!< Main clock source update enable register*/
__IO uint32_t SYSAHBCLKDIV;/*!< System Clock divider register */
__I uint32_t RESERVED4;
__IO uint32_t SYSAHBCLKCTRL;/*!< System clock control register */
__I uint32_t RESERVED5[4];
__IO uint32_t SSP0CLKDIV;/*!< SSP0 clock divider register */
__IO uint32_t USARTCLKDIV;/*!< UART clock divider register */
__IO uint32_t SSP1CLKDIV;/*!< SSP1 clock divider register, not on CHIP_LPC110X, CHIP_LPC11XXLV */
__I uint32_t RESERVED6[8];
__IO uint32_t USBCLKSEL;/*!< USB clock source select register, LPC11UXX only */
__IO uint32_t USBCLKUEN;/*!< USB clock source update enable register, LPC11UXX only */
__IO uint32_t USBCLKDIV;/*!< USB clock source divider register, LPC11UXX only */
__I uint32_t RESERVED7;
__IO uint32_t WDTCLKSEL;/*!< WDT clock source select register, some parts only */
__IO uint32_t WDTCLKUEN;/*!< WDT clock source update enable register, some parts only */
__IO uint32_t WDTCLKDIV;/*!< WDT clock divider register, some parts only */
__I uint32_t RESERVED8;
__IO uint32_t CLKOUTSEL;/*!< Clock out source select register, not on LPC1102/04 */
__IO uint32_t CLKOUTUEN;/*!< Clock out source update enable register, not on LPC1102/04 */
__IO uint32_t CLKOUTDIV;/*!< Clock out divider register, not on LPC1102/04 */
__I uint32_t RESERVED9[5];
__I uint32_t PIOPORCAP[2];/*!< POR captured PIO status registers, index 1 on LPC1102/04 */
__I uint32_t RESERVED10[18];
__IO uint32_t BODCTRL;/*!< Brown Out Detect register */
__IO uint32_t SYSTCKCAL;/*!< System tick counter calibration register */
__I uint32_t RESERVED11[6];
__IO uint32_t IRQLATENCY;/*!< IRQ delay register, on LPC11UXX and LPC11EXX only */
__IO uint32_t NMISRC;/*!< NMI source control register,some parts only */
__IO uint32_t PINTSEL[8];/*!< GPIO pin interrupt select register 0-7, not on CHIP_LPC110X, CHIP_LPC11XXLV, CHIP_LPC11CXX */
__IO uint32_t USBCLKCTRL;/*!< USB clock control register, LPC11UXX only */
__I uint32_t USBCLKST;/*!< USB clock status register, LPC11UXX only */
__I uint32_t RESERVED12[24];
__IO uint32_t STARTAPRP0;/*!< Start loigc 0 interrupt wake up enable register 0, on CHIP_LPC110X, CHIP_LPC11XXLV, CHIP_LPC11CXX */
__IO uint32_t STARTERP0;/*!< Start loigc signal enable register 0, not on LPC11AXX */
__IO uint32_t STARTRSRP0CLR;/*!< Start loigc reset register 0, on CHIP_LPC110X, CHIP_LPC11XXLV, CHIP_LPC11CXX */
__IO uint32_t STARTSRP0;/*!< Start loigc status register 0, on CHIP_LPC110X, CHIP_LPC11XXLV, CHIP_LPC11CXX */
__I uint32_t RESERVED13;
__IO uint32_t STARTERP1;/*!< Start logic 1 interrupt wake up enable register 1, on LPC11UXX and LPC11EXX only */
__I uint32_t RESERVED14[6];
__IO uint32_t PDSLEEPCFG;/*!< Power down states in deep sleep mode register, not on LPC11AXX */
__IO uint32_t PDWAKECFG;/*!< Power down states in wake up from deep sleep register, not on LPC11AXX */
__IO uint32_t PDRUNCFG;/*!< Power configuration register*/
} LPC_SYSCTL_T;
typedef struct {/*!< FMC Structure */
__I uint32_t RESERVED1[4];
__IO uint32_t FLASHTIM;
__I uint32_t RESERVED2[3];
__IO uint32_t FMSSTART;
__IO uint32_t FMSSTOP;
__I uint32_t RESERVED3;
__I uint32_t FMSW[4];
__I uint32_t RESERVED4[25];
#if defined(CHIP_LPC1125)
__I uint32_t RESERVED5[977];
#else
__IO uint32_t EEMSSTART;
__IO uint32_t EEMSSTOP;
__I uint32_t EEMSSIG;
__I uint32_t RESERVED5[974];
#endif
__I uint32_t FMSTAT;
__I uint32_t RESERVED6;
__O uint32_t FMSTATCLR;
} LPC_FMC_T;
#define LPC_SYSCTL ((LPC_SYSCTL_T *) 0x40048000)
#define LPC_FMC ((LPC_FMC_T *) LPC_FLASH_BASE)
typedef enum CHIP_SYSCTL_PLLCLKSRC {
SYSCTL_PLLCLKSRC_IRC = 0,/*!< Internal oscillator in */
SYSCTL_PLLCLKSRC_MAINOSC,/*!< Crystal (main) oscillator in */
#if defined(CHIP_LPC11AXX)
SYSCTL_PLLCLKSRC_EXT_CLKIN,/*!< External clock in (11Axx only) */
#else
SYSCTL_PLLCLKSRC_RESERVED1,/*!< Reserved */
#endif
SYSCTL_PLLCLKSRC_RESERVED2,/*!< Reserved */
} CHIP_SYSCTL_PLLCLKSRC_T;
typedef enum CHIP_SYSCTL_MAINCLKSRC {
SYSCTL_MAINCLKSRC_IRC = 0,/*!< Internal oscillator */
SYSCTL_MAINCLKSRC_PLLIN,/*!< System PLL input */
SYSCTL_MAINCLKSRC_LFOSC,/*!< LF oscillator rate (11Axx only) */
SYSCTL_MAINCLKSRC_WDTOSC = SYSCTL_MAINCLKSRC_LFOSC,/*!< Watchdog oscillator rate */
SYSCTL_MAINCLKSRC_PLLOUT,/*!< System PLL output */
} CHIP_SYSCTL_MAINCLKSRC_T;
void SystemSetupClocking(void)
{
volatile int i;
/* Powerup main oscillator */
uint32_t pdrun;
pdrun = LPC_SYSCTL->PDRUNCFG & 0x000000FF;
pdrun &= ~((1 << 5) & 0x000000FF);
LPC_SYSCTL->PDRUNCFG = (pdrun | 0x0000ED00);
/* Wait 200us for OSC to be stablized, no status
indication, dummy wait. */
for (i = 0; i < 0x100; i++) {}
/* Set system PLL input to main oscillator */
LPC_SYSCTL->SYSPLLCLKSEL = (uint32_t) SYSCTL_PLLCLKSRC_MAINOSC;
LPC_SYSCTL->SYSPLLCLKUEN = 0;
LPC_SYSCTL->SYSPLLCLKUEN = 1;
/* Power down PLL to change the PLL divider ratio */
uint32_t pdrun2;
pdrun2 = LPC_SYSCTL->PDRUNCFG & 0x000000FF;
pdrun2 |= ((1 << 7) & 0x000000FF);
LPC_SYSCTL->PDRUNCFG = (pdrun2 | 0x0000ED00);
/* Setup PLL for main oscillator rate (FCLKIN = 12MHz) * 4 = 48MHz
MSEL = 3 (this is pre-decremented), PSEL = 1 (for P = 2)
FCLKOUT = FCLKIN * (MSEL + 1) = 12MHz * 4 = 48MHz
FCCO = FCLKOUT * 2 * P = 48MHz * 2 * 2 = 192MHz (within FCCO range) */
LPC_SYSCTL->SYSPLLCTRL = (3 & 0x1F) | ((1 & 0x3) << 5);
/* Powerup system PLL */
uint32_t pdrun3;
pdrun3 = LPC_SYSCTL->PDRUNCFG & 0x000000FF;
pdrun3 &= ~((1 << 7) & 0x000000FF);
LPC_SYSCTL->PDRUNCFG = (pdrun3 | 0x0000ED00);
/* Wait for PLL to lock */
while (!((LPC_SYSCTL->SYSPLLSTAT & 1) != 0)) {}
/* Set system clock divider to 1 */
LPC_SYSCTL->SYSAHBCLKDIV = 1;
/* Setup FLASH access to 3 clocks */
uint32_t tmp = LPC_FMC->FLASHTIM & (~(0x3));
/* Don't alter upper bits */
LPC_FMC->FLASHTIM = tmp | 2;
/* Set main clock source to the system PLL. This will drive 48MHz
for the main clock and 48MHz for the system clock */
LPC_SYSCTL->MAINCLKSEL = (uint32_t) SYSCTL_MAINCLKSRC_PLLOUT;
LPC_SYSCTL->MAINCLKUEN = 0;
LPC_SYSCTL->MAINCLKUEN = 1;
}
int main(void) {
LPC_SYSCON->SYSAHBCLKCTRL |= (1 << 6);
SystemSetupClocking();
//Toggle a GPIO (FBD48 pin 23, PIO0_7, controls the LED on the LPC Expresso PCB)
//CONNECT SYSTEM OSCILLATOR TO CLKOUT PIN: This allows measurement with o-scope.
LPC_IOCON->PIO0_1 &= 0xFFFFFFF8; //clear FUNC bits (sec. 7.4.4)
LPC_IOCON->PIO0_1 |= 0x01; //set FUNC bits to CLKOUT function (sec. 7.4.4)
LPC_GPIO0->DIR |= 0x01; //set CLKOUT pin to output (sec. 12.3.2)
LPC_SYSCON->CLKOUTCLKSEL = 0x3; //sec. 3.5.21
LPC_SYSCON->CLKOUTUEN = 0; //"CLKOUTUEN" has to be toggled for "CLKOTUCLKSEL" to accept the value written to it
LPC_SYSCON->CLKOUTUEN = 1; //"CLKOUTUEN" has to be toggled for "CLKOTUCLKSEL" to accept the value written to it
LPC_SYSCON->CLKOUTDIV = 1; //set divider to 1 (sec. 3.5.23)
LPC_IOCON->PIO0_7 &= ~(0x10); //NOT REQUIRED, turn off pull up (sec 7.4.19)
LPC_GPIO0->DIR |= (1<<7); //set pin direction to output (sec 12.3.2)
unsigned int i = 0;
while(1){ //infinite loop
LPC_GPIO0->DATA |= (1<<7); //set pin high (sec 12.3.1)
for(i=0; i<0xFFFFF; ++i); //arbitrary delay
LPC_GPIO0->DATA &= ~(1<<7); //set pin low (sec 12.3.1)
for(i=0; i<0xFFFFF; ++i); //arbitrary delay
}
return 0 ;
}
|