/* * @brief LPC13XX Clock control functions * * @note * Copyright(C) NXP Semiconductors, 2012 * 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. */ #ifndef __CLOCK_13XX_H_ #define __CLOCK_13XX_H_ #ifdef __cplusplus extern "C" { #endif /** @defgroup CLOCK_13XX CHIP: LPC13xx Clock Control block driver * @ingroup CHIP_13XX_Drivers * @{ */ /** @defgroup CLOCK_13XX_OPTIONS CHIP: LPC13xx Clock Control driver options * @ingroup CHIP_13XX_DRIVER_OPTIONS CLOCK_13XX * The clock driver has options that configure it's operation at build-time.
* * CRYSTAL_MAIN_FREQ_IN
* This define is the external crystal frequency used for the main oscillator.
* @{ */ /** * @} */ /** Internal oscillator frequency */ #define SYSCTL_IRC_FREQ (12000000) /** * @brief Set System PLL divider values * @param msel : PLL feedback divider value. M = msel + 1. * @param psel : PLL post divider value. P = (1<SYSPLLCTRL = (msel & 0x1F) | ((psel & 0x3) << 5); } /** * @brief Read System PLL lock status * @return true of the PLL is locked. false if not locked */ STATIC INLINE bool Chip_Clock_IsSystemPLLLocked(void) { return (bool) ((LPC_SYSCTL->SYSPLLSTAT & 1) != 0); } /** * Clock sources for system and USB PLLs */ typedef enum CHIP_SYSCTL_PLLCLKSRC { SYSCTL_PLLCLKSRC_IRC = 0, /*!< Internal oscillator in */ SYSCTL_PLLCLKSRC_SYSOSC, /*!< Crystal (main) oscillator in */ SYSCTL_PLLCLKSRC_RESERVED1, /*!< Reserved */ SYSCTL_PLLCLKSRC_RESERVED2, /*!< Reserved */ } CHIP_SYSCTL_PLLCLKSRC_T; /** * @brief Set System PLL clock source * @param src : Clock source for system PLL * @return Nothing * @note This function will also toggle the clock source update register * to update the clock source. */ void Chip_Clock_SetSystemPLLSource(CHIP_SYSCTL_PLLCLKSRC_T src); /** * @brief Set USB PLL divider values * @param msel : PLL feedback divider value. M = msel + 1. * @param psel : PLL post divider value. P = (1<USBPLLCTRL = (msel & 0x1F) | ((psel & 0x3) << 5); } /** * @brief Read USB PLL lock status * @return true of the PLL is locked. false if not locked */ STATIC INLINE bool Chip_Clock_IsUSBPLLLocked(void) { return (bool) ((LPC_SYSCTL->USBPLLSTAT & 1) != 0); } /** * @brief Set USB PLL clock source * @param src : Clock source for USB PLL * @return Nothing * @note This function will also toggle the clock source update register * to update the clock source. */ void Chip_Clock_SetUSBPLLSource(CHIP_SYSCTL_PLLCLKSRC_T src); /** * @brief Bypass System Oscillator and set oscillator frequency range * @param bypass : Flag to bypass oscillator * @param highfr : Flag to set oscillator range from 15-25 MHz * @return Nothing * @note Sets the PLL input to bypass the oscillator. This would be * used if an external clock that is not an oscillator is attached * to the XTALIN pin. */ void Chip_Clock_SetPLLBypass(bool bypass, bool highfr); /** * Watchdog and low frequency oscillator frequencies plus or minus 40% */ typedef enum CHIP_WDTLFO_OSC { WDTLFO_OSC_ILLEGAL, WDTLFO_OSC_0_60, /*!< 0.6 MHz watchdog/LFO rate */ WDTLFO_OSC_1_05, /*!< 1.05 MHz watchdog/LFO rate */ WDTLFO_OSC_1_40, /*!< 1.4 MHz watchdog/LFO rate */ WDTLFO_OSC_1_75, /*!< 1.75 MHz watchdog/LFO rate */ WDTLFO_OSC_2_10, /*!< 2.1 MHz watchdog/LFO rate */ WDTLFO_OSC_2_40, /*!< 2.4 MHz watchdog/LFO rate */ WDTLFO_OSC_2_70, /*!< 2.7 MHz watchdog/LFO rate */ WDTLFO_OSC_3_00, /*!< 3.0 MHz watchdog/LFO rate */ WDTLFO_OSC_3_25, /*!< 3.25 MHz watchdog/LFO rate */ WDTLFO_OSC_3_50, /*!< 3.5 MHz watchdog/LFO rate */ WDTLFO_OSC_3_75, /*!< 3.75 MHz watchdog/LFO rate */ WDTLFO_OSC_4_00, /*!< 4.0 MHz watchdog/LFO rate */ WDTLFO_OSC_4_20, /*!< 4.2 MHz watchdog/LFO rate */ WDTLFO_OSC_4_40, /*!< 4.4 MHz watchdog/LFO rate */ WDTLFO_OSC_4_60 /*!< 4.6 MHz watchdog/LFO rate */ } CHIP_WDTLFO_OSC_T; /** * @brief Setup Watchdog oscillator rate and divider * @param wdtclk : Selected watchdog clock rate * @param div : Watchdog divider value, even value between 2 and 64 * @return Nothing * @note Watchdog rate = selected rate divided by divider rate */ STATIC INLINE void Chip_Clock_SetWDTOSC(CHIP_WDTLFO_OSC_T wdtclk, uint8_t div) { LPC_SYSCTL->WDTOSCCTRL = (((uint32_t) wdtclk) << 5) | ((div >> 1) - 1); } /** * Clock sources for main system clock */ typedef enum CHIP_SYSCTL_MAINCLKSRC { SYSCTL_MAINCLKSRC_IRC = 0, /*!< Internal oscillator */ SYSCTL_MAINCLKSRC_PLLIN, /*!< System PLL input */ SYSCTL_MAINCLKSRC_WDTOSC, /*!< Watchdog oscillator rate */ SYSCTL_MAINCLKSRC_PLLOUT, /*!< System PLL output */ } CHIP_SYSCTL_MAINCLKSRC_T; /** * @brief Set main system clock source * @param src : Clock source for main system * @return Nothing * @note This function will also toggle the clock source update register * to update the clock source. */ void Chip_Clock_SetMainClockSource(CHIP_SYSCTL_MAINCLKSRC_T src); /** * @brief Returns the main clock source * @return Which clock is used for the core clock source? */ STATIC INLINE CHIP_SYSCTL_MAINCLKSRC_T Chip_Clock_GetMainClockSource(void) { return (CHIP_SYSCTL_MAINCLKSRC_T) (LPC_SYSCTL->MAINCLKSEL); } /** * @brief Set system clock divider * @param div : divider for system clock * @return Nothing * @note Use 0 to disable, or a divider value of 1 to 255. The system clock * rate is the main system clock divided by this value. */ STATIC INLINE void Chip_Clock_SetSysClockDiv(uint32_t div) { LPC_SYSCTL->SYSAHBCLKDIV = div; } /** * System and peripheral clocks */ typedef enum CHIP_SYSCTL_CLOCK { SYSCTL_CLOCK_SYS = 0, /*!< 0: System clock */ SYSCTL_CLOCK_ROM, /*!<1: ROM clock */ SYSCTL_CLOCK_RAM, /*!< 2: RAM clock */ SYSCTL_CLOCK_FLASHREG, /*!< 3: FLASH register interface clock */ SYSCTL_CLOCK_FLASHARRAY, /*!< 4: FLASH array access clock */ SYSCTL_CLOCK_I2C, /*!< 5: I2C clock */ SYSCTL_CLOCK_GPIO, /*!< 6: GPIO clock */ SYSCTL_CLOCK_CT16B0, /*!< 7: 16-bit Counter/timer 0 clock */ SYSCTL_CLOCK_CT16B1, /*!< 8: 16-bit Counter/timer 1 clock */ SYSCTL_CLOCK_CT32B0, /*!< 9: 32-bit Counter/timer 0 clock */ SYSCTL_CLOCK_CT32B1, /*!< 10: 32-bit Counter/timer 1 clock */ SYSCTL_CLOCK_SSP0, /*!< 11: SSP0 clock */ SYSCTL_CLOCK_UART0, /*!< 12: UART0 clock */ SYSCTL_CLOCK_ADC, /*!< 13: ADC clock */ SYSCTL_CLOCK_USB, /*!< 14: USBREG clock */ SYSCTL_CLOCK_WDT, /*!< 15: Watchdog timer clock */ SYSCTL_CLOCK_IOCON, /*!< 16: IOCON block clock */ SYSCTL_CLOCK_RESERVED17, /*!< 17: Reserved */ SYSCTL_CLOCK_SSP1, /*!< 18: SSP1 clock */ #if defined(CHIP_LPC1347) SYSCTL_CLOCK_PINT, /*!< 19: GPIO Pin interrupts register clock */ SYSCTL_CLOCK_RESERVED20, /*!< 20: Reserved */ SYSCTL_CLOCK_RESERVED21, /*!< 21: Reserved */ SYSCTL_CLOCK_RESERVED22, /*!< 22: Reserved */ SYSCTL_CLOCK_GROUP0INT, /*!< 23: GPIO GROUP0 interrupt register interface clock, LPC11E/Uxx only */ SYSCTL_CLOCK_GROUP1INT, /*!< 24: GPIO GROUP1 interrupt register interface clock, LPC11E/Uxx only */ SYSCTL_CLOCK_RESERVED25, /*!< 25: Reserved */ SYSCTL_CLOCK_RAM1, /*!< 26: SRAM block (0x20000000) clock, LPC11E/Uxx only */ SYSCTL_CLOCK_USBRAM, /*!< 27: USB SRAM block clock, LPC11Uxx only */ #endif } CHIP_SYSCTL_CLOCK_T; /** * @brief Enable a system or peripheral clock * @param clk : Clock to enable * @return Nothing */ STATIC INLINE void Chip_Clock_EnablePeriphClock(CHIP_SYSCTL_CLOCK_T clk) { LPC_SYSCTL->SYSAHBCLKCTRL |= (1 << clk); } /** * @brief Disable a system or peripheral clock * @param clk : Clock to disable * @return Nothing */ STATIC INLINE void Chip_Clock_DisablePeriphClock(CHIP_SYSCTL_CLOCK_T clk) { LPC_SYSCTL->SYSAHBCLKCTRL &= ~(1 << clk); } /** * @brief Set SSP0 divider * @param div : divider for SSP0 clock * @return Nothing * @note Use 0 to disable, or a divider value of 1 to 255. The SSP0 clock * rate is the main system clock divided by this value. */ STATIC INLINE void Chip_Clock_SetSSP0ClockDiv(uint32_t div) { LPC_SYSCTL->SSP0CLKDIV = div; } /** * @brief Return SSP0 divider * @return divider for SSP0 clock * @note A value of 0 means the clock is disabled. */ STATIC INLINE uint32_t Chip_Clock_GetSSP0ClockDiv(void) { return LPC_SYSCTL->SSP0CLKDIV; } /** * @brief Set UART divider clock * @param div : divider for UART clock * @return Nothing * @note Use 0 to disable, or a divider value of 1 to 255. The UART clock * rate is the main system clock divided by this value.
* For the LPC1311/13/42/43, the UART pins must be configured in the * IOCON block before the UART clock can be enabled */ STATIC INLINE void Chip_Clock_SetUARTClockDiv(uint32_t div) { LPC_SYSCTL->USARTCLKDIV = div; } /** * @brief Return UART divider * @return divider for UART clock * @note A value of 0 means the clock is disabled. */ STATIC INLINE uint32_t Chip_Clock_GetUARTClockDiv(void) { return LPC_SYSCTL->USARTCLKDIV; } /** * @brief Set SSP1 divider clock * @param div : divider for SSP1 clock * @return Nothing * @note Use 0 to disable, or a divider value of 1 to 255. The SSP1 clock * rate is the main system clock divided by this value. */ STATIC INLINE void Chip_Clock_SetSSP1ClockDiv(uint32_t div) { LPC_SYSCTL->SSP1CLKDIV = div; } /** * @brief Return SSP1 divider * @return divider for SSP1 clock * @note A value of 0 means the clock is disabled. */ STATIC INLINE uint32_t Chip_Clock_GetSSP1ClockDiv(void) { return LPC_SYSCTL->SSP1CLKDIV; } /** * @brief Set ARM trace clock divider * @param div : divider for ARM trace clock * @return Nothing * @note Use 0 to disable, or a divider value of 1 to 255. The ARM trace clock * rate is the main system clock divided by this value. */ STATIC INLINE void Chip_Clock_SetTraceClockDiv(uint32_t div) { LPC_SYSCTL->TRACECLKDIV = div; } /** * @brief Return ARM trace clock divider * @return divider for ARM trace clock * @note A value of 0 means the clock is disabled. */ STATIC INLINE uint32_t Chip_Clock_GetTraceClockDiv(void) { return LPC_SYSCTL->TRACECLKDIV; } /** * @brief Set SYSTICK clock divider * @param div : divider for SYSTICK clock * @return Nothing * @note Use 0 to disable, or a divider value of 1 to 255. The SYSTICK clock * rate is the main system clock divided by this value. */ STATIC INLINE void Chip_Clock_SetSystickClockDiv(uint32_t div) { LPC_SYSCTL->SYSTICKCLKDIV = div; } /** * @brief Return SYSTICK clock divider * @return divider for SYSTICK clock * @note A value of 0 means the clock is disabled. */ STATIC INLINE uint32_t Chip_Clock_GetSystickClockDiv(void) { return LPC_SYSCTL->SYSTICKCLKDIV; } /** * Clock sources for USB */ typedef enum CHIP_SYSCTL_USBCLKSRC { SYSCTL_USBCLKSRC_PLLOUT = 0, /*!< USB PLL out */ SYSCTL_USBCLKSRC_MAINSYSCLK, /*!< Main system clock */ } CHIP_SYSCTL_USBCLKSRC_T; /** * @brief Set USB clock source and divider * @param src : Clock source for USB * @param div : divider for USB clock * @return Nothing * @note Use 0 to disable, or a divider value of 1 to 255. The USB clock * rate is either the main system clock or USB PLL output clock divided * by this value. This function will also toggle the clock source * update register to update the clock source. */ void Chip_Clock_SetUSBClockSource(CHIP_SYSCTL_USBCLKSRC_T src, uint32_t div); #if defined(CHIP_LPC1343) /** * Clock sources for WDT */ typedef enum CHIP_SYSCTL_WDTCLKSRC { SYSCTL_WDTCLKSRC_IRC = 0, /*!< Internal oscillator for watchdog clock */ SYSCTL_WDTCLKSRC_MAINSYSCLK, /*!< Main system clock for watchdog clock */ SYSCTL_WDTCLKSRC_WDTOSC, /*!< Watchdog oscillator for watchdog clock */ } CHIP_SYSCTL_WDTCLKSRC_T; /** * @brief Set WDT clock source and divider * @param src : Clock source for WDT * @param div : divider for WDT clock * @return Nothing * @note Use 0 to disable, or a divider value of 1 to 255. The WDT clock * rate is the clock source divided by the divider. This function will * also toggle the clock source update register to update the clock * source. */ void Chip_Clock_SetWDTClockSource(CHIP_SYSCTL_WDTCLKSRC_T src, uint32_t div); #endif /** * Clock sources for CLKOUT */ typedef enum CHIP_SYSCTL_CLKOUTSRC { SYSCTL_CLKOUTSRC_IRC = 0, /*!< Internal oscillator for CLKOUT */ SYSCTL_CLKOUTSRC_SYSOSC, /*!< Main oscillator for CLKOUT */ SYSCTL_CLKOUTSRC_WDTOSC, /*!< Watchdog oscillator for CLKOUT */ SYSCTL_CLKOUTSRC_MAINSYSCLK, /*!< Main system clock for CLKOUT */ } CHIP_SYSCTL_CLKOUTSRC_T; /** * @brief Set CLKOUT clock source and divider * @param src : Clock source for CLKOUT * @param div : divider for CLKOUT clock * @return Nothing * @note Use 0 to disable, or a divider value of 1 to 255. The CLKOUT clock * rate is the clock source divided by the divider. This function will * also toggle the clock source update register to update the clock * source. */ void Chip_Clock_SetCLKOUTSource(CHIP_SYSCTL_CLKOUTSRC_T src, uint32_t div); /** * @brief Returns the main oscillator clock rate * @return main oscillator clock rate */ STATIC INLINE uint32_t Chip_Clock_GetMainOscRate(void) { return OscRateIn; } /** * @brief Returns the internal oscillator (IRC) clock rate * @return internal oscillator (IRC) clock rate */ STATIC INLINE uint32_t Chip_Clock_GetIntOscRate(void) { return SYSCTL_IRC_FREQ; } /** * @brief Return estimated watchdog oscillator rate * @return Estimated watchdog oscillator rate * @note This rate is accurate to plus or minus 40%. */ uint32_t Chip_Clock_GetWDTOSCRate(void); /** * @brief Return System PLL input clock rate * @return System PLL input clock rate */ uint32_t Chip_Clock_GetSystemPLLInClockRate(void); /** * @brief Return System PLL output clock rate * @return System PLL output clock rate */ uint32_t Chip_Clock_GetSystemPLLOutClockRate(void); /** * @brief Return USB PLL input clock rate * @return USB PLL input clock rate */ uint32_t Chip_Clock_GetUSBPLLInClockRate(void); /** * @brief Return USB PLL output clock rate * @return USB PLL output clock rate */ uint32_t Chip_Clock_GetUSBPLLOutClockRate(void); /** * @brief Return main clock rate * @return main clock rate */ uint32_t Chip_Clock_GetMainClockRate(void); /** * @brief Return system clock rate * @return system clock rate */ uint32_t Chip_Clock_GetSystemClockRate(void); /** * @} */ #ifdef __cplusplus } #endif #endif /* __CLOCK_13XX_H_ */