mirror of
https://github.com/hathach/tinyusb.git
synced 2025-01-17 05:32:55 +08:00
703 lines
24 KiB
C
703 lines
24 KiB
C
/*
|
|
* @brief LPC13xx System Control registers and 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 __SYSCTL_13XX_H_
|
|
#define __SYSCTL_13XX_H_
|
|
|
|
#ifdef __cplusplus
|
|
extern "C" {
|
|
#endif
|
|
|
|
/** @defgroup SYSCTL_13XX CHIP: LPC13xx System Control block driver
|
|
* @ingroup CHIP_13XX_Drivers
|
|
* @{
|
|
*/
|
|
|
|
#if defined(CHIP_LPC1343)
|
|
/**
|
|
* @brief Start state control structure
|
|
*/
|
|
typedef struct {
|
|
__IO uint32_t STARTAPR; /*!< Start logic edge control register */
|
|
__IO uint32_t STARTER; /*!< Start logic signal enable register */
|
|
__IO uint32_t STARTRSRCLR; /*!< Start logic reset register */
|
|
__IO uint32_t STARTSR; /*!< Start logic status register */
|
|
} LPC_SYSCTL_STARTST_T;
|
|
#endif
|
|
|
|
/**
|
|
* @brief LPC13XX System Control block structure
|
|
*/
|
|
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, LPC134x only */
|
|
__I uint32_t USBPLLSTAT; /*!< USB PLL status register, LPC134x only */
|
|
__I uint32_t RESERVED1[2];
|
|
__IO uint32_t SYSOSCCTRL; /*!< System Oscillator control register */
|
|
__IO uint32_t WDTOSCCTRL; /*!< Watchdog Oscillator control register */
|
|
#if defined(CHIP_LPC1347)
|
|
__I uint32_t RESERVED2[2];
|
|
#else
|
|
__IO uint32_t IRCCTRL; /*!< IRC control register */
|
|
__I uint32_t RESERVED2[1];
|
|
#endif
|
|
|
|
__IO uint32_t SYSRSTSTAT; /*!< System Reset Status register */
|
|
__I uint32_t RESERVED3[3];
|
|
__IO uint32_t SYSPLLCLKSEL; /*!< System PLL clock source select register */
|
|
#if defined(CHIP_LPC1347)
|
|
__I uint32_t RESERVED4;
|
|
#else
|
|
__IO uint32_t SYSPLLCLKUEN; /*!< System PLL clock source update enable register*/
|
|
#endif
|
|
__IO uint32_t USBPLLCLKSEL; /*!< USB PLL clock source select register, LPC134x only */
|
|
#if defined(CHIP_LPC1347)
|
|
__I uint32_t RESERVED4A[1];
|
|
#else
|
|
__IO uint32_t USBPLLCLKUEN; /*!< USB PLL clock source update enable register, LPC1342/43 only */
|
|
#endif
|
|
__I uint32_t RESERVED5[8];
|
|
__IO uint32_t MAINCLKSEL; /*!< Main clock source select register */
|
|
#if defined(CHIP_LPC1347)
|
|
__IO uint32_t RESERVED6;
|
|
#else
|
|
__IO uint32_t MAINCLKUEN; /*!< Main clock source update enable register */
|
|
#endif
|
|
__IO uint32_t SYSAHBCLKDIV; /*!< System Clock divider register */
|
|
__I uint32_t RESERVED6A;
|
|
__IO uint32_t SYSAHBCLKCTRL; /*!< System Clock control register */
|
|
__I uint32_t RESERVED7[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 */
|
|
__I uint32_t RESERVED8[3];
|
|
__IO uint32_t TRACECLKDIV; /*!< ARM trace clock divider register */
|
|
__IO uint32_t SYSTICKCLKDIV; /*!< SYSTICK clock divider register */
|
|
__I uint32_t RESERVED9[3];
|
|
__IO uint32_t USBCLKSEL; /*!< USB clock source select register, LPC134x only */
|
|
#if defined(CHIP_LPC1347)
|
|
__I uint32_t RESERVED10;
|
|
#else
|
|
__IO uint32_t USBCLKUEN; /*!< USB clock source update enable register, LPC1342/43 only */
|
|
#endif
|
|
__IO uint32_t USBCLKDIV; /*!< USB clock source divider register, LPC134x only */
|
|
#if defined(CHIP_LPC1347)
|
|
__I uint32_t RESERVED11[4];
|
|
#else
|
|
__I uint32_t RESERVED11;
|
|
__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 */
|
|
#endif
|
|
__I uint32_t RESERVED13;
|
|
__IO uint32_t CLKOUTSEL; /*!< Clock out source select register */
|
|
#if defined(CHIP_LPC1347)
|
|
__I uint32_t RESERVED12;
|
|
#else
|
|
__IO uint32_t CLKOUTUEN; /*!< Clock out source update enable register, not on LPC1311/13/42/43 only */
|
|
#endif
|
|
__IO uint32_t CLKOUTDIV; /*!< Clock out divider register */
|
|
__I uint32_t RESERVED14[5];
|
|
__I uint32_t PIOPORCAP[2]; /*!< POR captured PIO status registers */
|
|
__I uint32_t RESERVED15[18];
|
|
__IO uint32_t BODCTRL; /*!< Brown Out Detect register */
|
|
__IO uint32_t SYSTCKCAL; /*!< System tick counter calibration register */
|
|
#if defined(CHIP_LPC1347)
|
|
__I uint32_t RESERVED16[6];
|
|
__IO uint32_t IRQLATENCY; /*!< IRQ delay register */
|
|
__IO uint32_t NMISRC; /*!< NMI source control register,some parts only */
|
|
__IO uint32_t PINTSEL[8]; /*!< GPIO pin interrupt select register 0-7 */
|
|
__IO uint32_t USBCLKCTRL; /*!< USB clock control register, LPC134x only */
|
|
__I uint32_t USBCLKST; /*!< USB clock status register, LPC134x only */
|
|
__I uint32_t RESERVED17[25];
|
|
__IO uint32_t STARTERP0; /*!< Start logic 0 interrupt wake-up enable register */
|
|
__I uint32_t RESERVED18[3];
|
|
__IO uint32_t STARTERP1; /*!< Start logic 1 interrupt wake-up enable register */
|
|
__I uint32_t RESERVED19[6];
|
|
#else
|
|
__I uint32_t RESERVED16[42];
|
|
LPC_SYSCTL_STARTST_T STARTLOGIC[2];
|
|
__I uint32_t RESERVED17[4];
|
|
#endif
|
|
__IO uint32_t PDSLEEPCFG; /*!< Power down states in deep sleep mode register */
|
|
__IO uint32_t PDWAKECFG; /*!< Power down states in wake up from deep sleep register */
|
|
__IO uint32_t PDRUNCFG; /*!< Power configuration register*/
|
|
__I uint32_t RESERVED20[110];
|
|
__I uint32_t DEVICEID; /*!< Device ID register */
|
|
} LPC_SYSCTL_T;
|
|
|
|
/**
|
|
* System memory remap modes used to remap interrupt vectors
|
|
*/
|
|
typedef enum CHIP_SYSCTL_BOOT_MODE_REMAP {
|
|
REMAP_BOOT_LOADER_MODE, /*!< Interrupt vectors are re-mapped to Boot ROM */
|
|
REMAP_USER_RAM_MODE, /*!< Interrupt vectors are re-mapped to Static RAM */
|
|
REMAP_USER_FLASH_MODE /*!< Interrupt vectors are not re-mapped and reside in Flash */
|
|
} CHIP_SYSCTL_BOOT_MODE_REMAP_T;
|
|
|
|
/**
|
|
* @brief Re-map interrupt vectors
|
|
* @param remap : system memory map value
|
|
* @return Nothing
|
|
*/
|
|
STATIC INLINE void Chip_SYSCTL_Map(CHIP_SYSCTL_BOOT_MODE_REMAP_T remap)
|
|
{
|
|
LPC_SYSCTL->SYSMEMREMAP = (uint32_t) remap;
|
|
}
|
|
|
|
/**
|
|
* Peripheral reset identifiers, not available on all devices
|
|
*/
|
|
typedef enum CHIP_SYSCTL_PERIPH_RESET {
|
|
RESET_SSP0, /*!< SSP0 reset control */
|
|
RESET_I2C0, /*!< I2C0 reset control */
|
|
RESET_SSP1 /*!< SSP1 reset control */
|
|
} CHIP_SYSCTL_PERIPH_RESET_T;
|
|
|
|
/**
|
|
* @brief Assert reset for a peripheral
|
|
* @param periph : Peripheral to assert reset for
|
|
* @return Nothing
|
|
* @note The peripheral will stay in reset until reset is de-asserted. Call
|
|
* Chip_SYSCTL_DeassertPeriphReset() to de-assert the reset.
|
|
*/
|
|
STATIC INLINE void Chip_SYSCTL_AssertPeriphReset(CHIP_SYSCTL_PERIPH_RESET_T periph)
|
|
{
|
|
LPC_SYSCTL->PRESETCTRL &= ~(1 << (uint32_t) periph);
|
|
}
|
|
|
|
/**
|
|
* @brief De-assert reset for a peripheral
|
|
* @param periph : Peripheral to de-assert reset for
|
|
* @return Nothing
|
|
*/
|
|
STATIC INLINE void Chip_SYSCTL_DeassertPeriphReset(CHIP_SYSCTL_PERIPH_RESET_T periph)
|
|
{
|
|
LPC_SYSCTL->PRESETCTRL |= (1 << (uint32_t) periph);
|
|
}
|
|
|
|
/**
|
|
* @brief Resets a peripheral
|
|
* @param periph : Peripheral to reset
|
|
* @return Nothing
|
|
*/
|
|
STATIC INLINE void Chip_SYSCTL_PeriphReset(CHIP_SYSCTL_PERIPH_RESET_T periph)
|
|
{
|
|
Chip_SYSCTL_AssertPeriphReset(periph);
|
|
Chip_SYSCTL_DeassertPeriphReset(periph);
|
|
}
|
|
|
|
/**
|
|
* System reset status
|
|
*/
|
|
#define SYSCTL_RST_POR (1 << 0) /*!< POR reset status */
|
|
#define SYSCTL_RST_EXTRST (1 << 1) /*!< External reset status */
|
|
#define SYSCTL_RST_WDT (1 << 2) /*!< Watchdog reset status */
|
|
#define SYSCTL_RST_BOD (1 << 3) /*!< Brown-out detect reset status */
|
|
#define SYSCTL_RST_SYSRST (1 << 4) /*!< software system reset status */
|
|
|
|
/**
|
|
* @brief Get system reset status
|
|
* @return An Or'ed value of SYSCTL_RST_*
|
|
* @note This function returns the detected reset source(s).
|
|
*/
|
|
STATIC INLINE uint32_t Chip_SYSCTL_GetSystemRSTStatus(void)
|
|
{
|
|
return LPC_SYSCTL->SYSRSTSTAT;
|
|
}
|
|
|
|
/**
|
|
* @brief Clear system reset status
|
|
* @param reset : An Or'ed value of SYSCTL_RST_* status to clear
|
|
* @return Nothing
|
|
*/
|
|
STATIC INLINE void Chip_SYSCTL_ClearSystemRSTStatus(uint32_t reset)
|
|
{
|
|
LPC_SYSCTL->SYSRSTSTAT = reset;
|
|
}
|
|
|
|
/**
|
|
* @brief Read POR captured PIO status
|
|
* @param index : POR register index, 0 or 1
|
|
* @return captured POR PIO status
|
|
* @note See the user manual for decoing of these bits.
|
|
*/
|
|
STATIC INLINE uint32_t Chip_SYSCTL_GetPORPIOStatus(int index)
|
|
{
|
|
return LPC_SYSCTL->PIOPORCAP[index];
|
|
}
|
|
|
|
/**
|
|
* Brown-out detector reset level
|
|
*/
|
|
typedef enum CHIP_SYSCTL_BODRSTLVL {
|
|
SYSCTL_BODRSTLVL_1_46V, /*!< Brown-out reset at 1.46v */
|
|
SYSCTL_BODRSTLVL_2_06V, /*!< Brown-out reset at 2.06v */
|
|
SYSCTL_BODRSTLVL_2_35V, /*!< Brown-out reset at 2.35v */
|
|
SYSCTL_BODRSTLVL_2_63V, /*!< Brown-out reset at 2.63v */
|
|
} CHIP_SYSCTL_BODRSTLVL_T;
|
|
|
|
/**
|
|
* Brown-out detector interrupt level
|
|
*/
|
|
typedef enum CHIP_SYSCTL_BODRINTVAL {
|
|
#if defined(CHIP_LPC1343)
|
|
SYSCTL_BODINTVAL_1_69V, /*!< Brown-out interrupt at 1.65v */
|
|
#else
|
|
SYSCTL_BODINTVAL_RESERVED1,
|
|
#endif
|
|
SYSCTL_BODINTVAL_2_22V, /*!< Brown-out interrupt at 2.22v */
|
|
SYSCTL_BODINTVAL_2_52V, /*!< Brown-out interrupt at 2.52v */
|
|
SYSCTL_BODINTVAL_2_80V, /*!< Brown-out interrupt at 2.8v */
|
|
} CHIP_SYSCTL_BODRINTVAL_T;
|
|
|
|
/**
|
|
* @brief Set brown-out detection interrupt and reset levels
|
|
* @param rstlvl : Brown-out detector reset level
|
|
* @param intlvl : Brown-out interrupt level
|
|
* @return Nothing
|
|
* @note Brown-out detection reset will be disabled upon exiting this function.
|
|
* Use Chip_SYSCTL_EnableBODReset() to re-enable.
|
|
*/
|
|
STATIC INLINE void Chip_SYSCTL_SetBODLevels(CHIP_SYSCTL_BODRSTLVL_T rstlvl,
|
|
CHIP_SYSCTL_BODRINTVAL_T intlvl)
|
|
{
|
|
LPC_SYSCTL->BODCTRL = ((uint32_t) rstlvl) | (((uint32_t) intlvl) << 2);
|
|
}
|
|
|
|
/**
|
|
* @brief Enable brown-out detection reset
|
|
* @return Nothing
|
|
*/
|
|
STATIC INLINE void Chip_SYSCTL_EnableBODReset(void)
|
|
{
|
|
LPC_SYSCTL->BODCTRL |= (1 << 4);
|
|
}
|
|
|
|
/**
|
|
* @brief Disable brown-out detection reset
|
|
* @return Nothing
|
|
*/
|
|
STATIC INLINE void Chip_SYSCTL_DisableBODReset(void)
|
|
{
|
|
LPC_SYSCTL->BODCTRL &= ~(1 << 4);
|
|
}
|
|
|
|
/**
|
|
* @brief Set System tick timer calibration value
|
|
* @param sysCalVal : System tick timer calibration value
|
|
* @return Nothing
|
|
*/
|
|
STATIC INLINE void Chip_SYSCTL_SetSYSTCKCAL(uint32_t sysCalVal)
|
|
{
|
|
LPC_SYSCTL->SYSTCKCAL = sysCalVal;
|
|
}
|
|
|
|
#if defined(CHIP_LPC1347)
|
|
/**
|
|
* @brief Set System IRQ latency
|
|
* @param latency : Latency in clock ticks
|
|
* @return Nothing
|
|
* @note Sets the IRQ latency, a value between 0 and 255 clocks. Lower
|
|
* values allow better latency.
|
|
*/
|
|
STATIC INLINE void Chip_SYSCTL_SetIRQLatency(uint32_t latency)
|
|
{
|
|
LPC_SYSCTL->IRQLATENCY = latency;
|
|
}
|
|
|
|
/**
|
|
* @brief Get System IRQ latency
|
|
* @return Latency in clock ticks
|
|
*/
|
|
STATIC INLINE uint32_t Chip_SYSCTL_GetIRQLatency(void)
|
|
{
|
|
return LPC_SYSCTL->IRQLATENCY;
|
|
}
|
|
|
|
/**
|
|
* Non-Maskable Interrupt Enable/Disable value
|
|
*/
|
|
#define SYSCTL_NMISRC_ENABLE ((uint32_t) 1 << 31) /*!< Enable the Non-Maskable Interrupt (NMI) source */
|
|
|
|
/**
|
|
* @brief Set source for non-maskable interrupt (NMI)
|
|
* @param intsrc : IRQ number to assign to the NMI
|
|
* @return Nothing
|
|
* @note The NMI source will be disabled upon exiting this function. use the
|
|
* Chip_SYSCTL_EnableNMISource() function to enable the NMI source.
|
|
*/
|
|
STATIC INLINE void Chip_SYSCTL_SetNMISource(uint32_t intsrc)
|
|
{
|
|
LPC_SYSCTL->NMISRC = intsrc;
|
|
}
|
|
|
|
/**
|
|
* @brief Enable interrupt used for NMI source
|
|
* @return Nothing
|
|
*/
|
|
STATIC INLINE void Chip_SYSCTL_EnableNMISource(void)
|
|
{
|
|
LPC_SYSCTL->NMISRC |= SYSCTL_NMISRC_ENABLE;
|
|
}
|
|
|
|
/**
|
|
* @brief Disable interrupt used for NMI source
|
|
* @return Nothing
|
|
*/
|
|
STATIC INLINE void Chip_SYSCTL_DisableNMISource(void)
|
|
{
|
|
LPC_SYSCTL->NMISRC &= ~(SYSCTL_NMISRC_ENABLE);
|
|
}
|
|
|
|
/**
|
|
* @brief Setup a pin source for the pin interrupts (0-7)
|
|
* @param intno : IRQ number
|
|
* @param port : port number 0/1)
|
|
* @param pin : pin number (0->23 for GPIO Port 0 and 0->31 for GPIO Port 1)
|
|
* @return Nothing
|
|
*/
|
|
STATIC INLINE void Chip_SYSCTL_SetPinInterrupt(uint32_t intno, uint8_t port, uint8_t pin)
|
|
|
|
{
|
|
LPC_SYSCTL->PINTSEL[intno] = (uint32_t) (port * 24 + pin);
|
|
}
|
|
|
|
/**
|
|
* @brief Setup USB clock control
|
|
* @param ap_clk : USB need_clock signal control (0 or 1)
|
|
* @param pol_clk : USB need_clock polarity for triggering the USB wake-up interrupt (0 or 1)
|
|
* @return Nothing
|
|
* @note See the USBCLKCTRL register in the user manual for these settings.
|
|
*/
|
|
STATIC INLINE void Chip_SYSCTL_SetUSBCLKCTRL(uint32_t ap_clk, uint32_t pol_clk)
|
|
{
|
|
LPC_SYSCTL->USBCLKCTRL = ap_clk | (pol_clk << 1);
|
|
}
|
|
|
|
/**
|
|
* @brief Returns the status of the USB need_clock signal
|
|
* @return true if USB need_clock statis is high, otherwise false
|
|
*/
|
|
STATIC INLINE bool Chip_SYSCTL_GetUSBCLKStatus(void)
|
|
{
|
|
return (bool) ((LPC_SYSCTL->USBCLKST & 0x1) != 0);
|
|
}
|
|
|
|
#endif
|
|
|
|
#if defined(CHIP_LPC1347)
|
|
/**
|
|
* @brief Enable PIO start logic for a pin (ERP0)
|
|
* @param pin : PIO pin number (0 - 7)
|
|
* @return Nothing
|
|
*/
|
|
STATIC INLINE void Chip_SYSCTL_EnableStartPin(uint32_t pin)
|
|
{
|
|
LPC_SYSCTL->STARTERP0 |= (1 << pin);
|
|
}
|
|
|
|
/**
|
|
* @brief Disable PIO start logic for a pin
|
|
* @param pin : PIO pin number (0 - 7)
|
|
* @return Nothing
|
|
*/
|
|
STATIC INLINE void Chip_SYSCTL_DisableStartPin(uint32_t pin)
|
|
{
|
|
LPC_SYSCTL->STARTERP0 &= ~(1 << pin);
|
|
}
|
|
|
|
/**
|
|
* Peripheral interrupt wakeup events
|
|
*/
|
|
#define SYSCTL_WAKEUP_WWDTINT (1 << 12) /*!< WWDT interrupt wake-up */
|
|
#define SYSCTL_WAKEUP_BODINT (1 << 13) /*!< Brown Out Detect (BOD) interrupt wake-up */
|
|
#define SYSCTL_WAKEUP_USB_WAKEUP (1 << 19) /*!< USB need_clock signal wake-up, LPC1134x only */
|
|
#define SYSCTL_WAKEUP_GPIOINT0 (1 << 20) /*!< GPIO GROUP0 interrupt wake-up */
|
|
#define SYSCTL_WAKEUP_GPIOINT1 (1 << 21) /*!< GPIO GROUP1 interrupt wake-up */
|
|
|
|
/**
|
|
* @brief Enables a peripheral's wakeup logic
|
|
* @param periphmask : OR'ed values of SYSCTL_WAKEUP_* for wakeup
|
|
* @return Nothing
|
|
*/
|
|
STATIC INLINE void Chip_SYSCTL_EnablePeriphWakeup(uint32_t periphmask)
|
|
{
|
|
LPC_SYSCTL->STARTERP1 |= periphmask;
|
|
}
|
|
|
|
/**
|
|
* @brief Disables a peripheral's wakeup logic
|
|
* @param periphmask : OR'ed values of SYSCTL_WAKEUP_* for wakeup
|
|
* @return Nothing
|
|
*/
|
|
STATIC INLINE void Chip_SYSCTL_DisablePeriphWakeup(uint32_t periphmask)
|
|
{
|
|
LPC_SYSCTL->STARTERP1 &= ~periphmask;
|
|
}
|
|
|
|
#else /* defined(CHIP_LPC1343) */
|
|
|
|
/* Macro for Chip_SYSCTL_SetStartPinRising and Chip_SYSCTL_SetStartPinFalling
|
|
functions */
|
|
#define SYSCTL_STARTST_PIN_BIT(port, pin) (((port) * 12) + pin)
|
|
#define SYSCTL_STARTST_PIN_INDEX(port, pin) (SYSCTL_STARTST_PIN_BIT(port, pin) / 32)
|
|
#define SYSCTL_STARTST_PIN(port, pin) (1 << (SYSCTL_STARTST_PIN_BIT(port, pin) % 32))
|
|
|
|
/**
|
|
* @brief Set rising edge for PIO start logic (APRP0)
|
|
* @param index : register index (0/1)
|
|
* @param pins : PIO pin(s) mask for setting rising edge start (see note)
|
|
* @return Nothing
|
|
* @note Use index 0 for pin PIO0_0->PIO0_11,PIO1_0->PIO1_11 and PIO2_0->PIO2_7. Index 1
|
|
* is used for PIO2_8->PIO2_11 and PIO3_0->PIO3_3. <br>
|
|
* Use SYSCTL_STARTST_PIN_INDEX macro to calculate the index value.<br>
|
|
* Multiple pins can be setup for rising edge start with this function
|
|
* by Or'ing together the pin values in the call. For example, the
|
|
* following call would enable PIO0_5 and PIO_1_10 as rising edge start
|
|
* conditions.<br>
|
|
* Chip_SYSCTL_SetStartPinRising(0, SYSCTL_STARTST_PIN(0, 5) | SYSCTL_STARTST_PIN(1, 10));
|
|
*
|
|
*/
|
|
STATIC INLINE void Chip_SYSCTL_SetStartPinRising(uint8_t index, uint32_t pins)
|
|
{
|
|
LPC_SYSCTL->STARTLOGIC[index].STARTAPR |= pins;
|
|
}
|
|
|
|
/**
|
|
* @brief Set falling edge for PIO start logic (APRP0)
|
|
* @param index : register index (0/1)
|
|
* @param pins : PIO pin(s) mask for setting falling edge start (see note)
|
|
* @return Nothing
|
|
* @note Use index 0 for pin PIO0_0->PIO0_11,PIO1_0->PIO1_11 and PIO2_0->PIO2_7. Index 1
|
|
* is used for PIO2_8->PIO2_11 and PIO3_0->PIO3_3. <br>
|
|
* Use SYSCTL_STARTST_PIN_INDEX macro to calculate the index value.<br>
|
|
* Multiple pins can be setup for falling edge start with this function
|
|
* by Or'ing together the pin values in the call. For example, the
|
|
* following call would enable PIO0_5 and PIO_1_10 as falling edge start
|
|
* conditions.<br>
|
|
* Chip_SYSCTL_SetStartPinFalling(0, SYSCTL_STARTST_PIN(0, 5) | SYSCTL_STARTST_PIN(1, 10));
|
|
*/
|
|
STATIC INLINE void Chip_SYSCTL_SetStartPinFalling(uint8_t index, uint32_t pins)
|
|
{
|
|
LPC_SYSCTL->STARTLOGIC[index].STARTAPR &= ~pins;
|
|
}
|
|
|
|
/**
|
|
* @brief Enables start signal for PIO start logic
|
|
* @param index : register index (0/1)
|
|
* @param pins : PIO pin(s) mask for enabling start (see note)
|
|
* @return Nothing
|
|
* @note Use index 0 for pin PIO0_0->PIO0_11,PIO1_0->PIO1_11 and PIO2_0->PIO2_7. Index 1
|
|
* is used for PIO2_8->PIO2_11 and PIO3_0->PIO3_3. <br>
|
|
* Use SYSCTL_STARTST_PIN_INDEX macro to calculate the index value.<br>
|
|
* Multiple pins can be enabled with this function by Or'ing together the pin values
|
|
* in the call. For example, the following call would enable PIO0_5 and PIO_1_10 <br>
|
|
* Chip_SYSCTL_EnableStartPin(0, SYSCTL_STARTST_PIN(0, 5) | SYSCTL_STARTST_PIN(1, 10));
|
|
*/
|
|
STATIC INLINE void Chip_SYSCTL_EnableStartPin(uint8_t index, uint32_t pins)
|
|
{
|
|
LPC_SYSCTL->STARTLOGIC[index].STARTER |= pins;
|
|
}
|
|
|
|
/**
|
|
* @brief Disables start signal for PIO start logic
|
|
* @param index : register index (0/1)
|
|
* @param pins : PIO pin(s) mask for disabling start (see note)
|
|
* @return Nothing
|
|
* @note Use index 0 for pin PIO0_0->PIO0_11,PIO1_0->PIO1_11 and PIO2_0->PIO2_7. Index 1
|
|
* is used for PIO2_8->PIO2_11 and PIO3_0->PIO3_3. <br>
|
|
* Use SYSCTL_STARTST_PIN_INDEX macro to calculate the index value.<br>
|
|
* Multiple pins can be disabled with this function by Or'ing together the pin values
|
|
* in the call. For example, the following call would disable PIO0_5 and PIO_1_10 <br>
|
|
* Chip_SYSCTL_DisableStartPin(0, SYSCTL_STARTST_PIN(0, 5) | SYSCTL_STARTST_PIN(1, 10));
|
|
*/
|
|
STATIC INLINE void Chip_SYSCTL_DisableStartPin(uint8_t index, uint32_t pins)
|
|
{
|
|
LPC_SYSCTL->STARTLOGIC[index].STARTER &= ~pins;
|
|
}
|
|
|
|
/**
|
|
* @brief Resets start logic state for PIO start logic
|
|
* @param index : register index (0/1)
|
|
* @param pins : PIO pin(s) mask for resetting state (see note)
|
|
* @return Nothing
|
|
* @note Use index 0 for pin PIO0_0->PIO0_11,PIO1_0->PIO1_11 and PIO2_0->PIO2_7. Index 1
|
|
* is used for PIO2_8->PIO2_11 and PIO3_0->PIO3_3. <br>
|
|
* Use SYSCTL_STARTST_PIN_INDEX macro to calculate the index value.<br>
|
|
* Multiple pins can be reset with this function by Or'ing together the pin values
|
|
* in the call. For example, the following call would reset start logic signal for PIO0_5 and PIO_1_10 <br>
|
|
* Chip_SYSCTL_ResetStartPin(0, SYSCTL_STARTST_PIN(0, 5) | SYSCTL_STARTST_PIN(1, 10));
|
|
*/
|
|
STATIC INLINE void Chip_SYSCTL_ResetStartPin(uint8_t index, uint32_t pins)
|
|
{
|
|
LPC_SYSCTL->STARTLOGIC[index].STARTRSRCLR |= pins;
|
|
}
|
|
|
|
/**
|
|
* @brief Returns start logic state for PIO pins
|
|
* @return The start status of all PIO pins (STARTSRP0 register)
|
|
* @note Use index 0 for pin PIO0_0->PIO0_11,PIO1_0->PIO1_11 and PIO2_0->PIO2_7. Index 1
|
|
* is used for PIO2_8->PIO2_11 and PIO3_0->PIO3_3. <br>
|
|
* Use SYSCTL_STARTST_PIN_INDEX macro to calculate the index value.<br>
|
|
* Use the SYSCTL_STARTST_PIN(port, pin) to mask out status conditions.
|
|
*/
|
|
STATIC INLINE uint32_t Chip_SYSCTL_GetStartPinStatus(uint8_t index)
|
|
{
|
|
return LPC_SYSCTL->STARTLOGIC[index].STARTSR;
|
|
}
|
|
|
|
#endif
|
|
|
|
/**
|
|
* Deep sleep setup values
|
|
*/
|
|
#define SYSCTL_DEEPSLP_BOD_PD (1 << 3) /*!< BOD power-down control in Deep-sleep mode, powered down */
|
|
#define SYSCTL_DEEPSLP_WDTOSC_PD (1 << 6) /*!< Watchdog oscillator power control in Deep-sleep, powered down */
|
|
|
|
/**
|
|
* @brief Setup deep sleep behaviour for power down
|
|
* @param sleepmask : OR'ed values of SYSCTL_DEEPSLP_* values (high to powerdown on deepsleep)
|
|
* @return Nothing
|
|
* @note This must be setup prior to using deep sleep. See the user manual
|
|
* *(PDSLEEPCFG register) for more info on setting this up. This function selects
|
|
* which peripherals are powered down on deep sleep.
|
|
* This function should only be called once with all options for power-down
|
|
* in that call.
|
|
*/
|
|
void Chip_SYSCTL_SetDeepSleepPD(uint32_t sleepmask);
|
|
|
|
/**
|
|
* @brief Returns current deep sleep mask
|
|
* @return OR'ed values of SYSCTL_DEEPSLP_* values
|
|
* @note A high bit indicates the peripheral will power down on deep sleep.
|
|
*/
|
|
STATIC INLINE uint32_t Chip_SYSCTL_GetDeepSleepPD(void)
|
|
{
|
|
return LPC_SYSCTL->PDSLEEPCFG;
|
|
}
|
|
|
|
/**
|
|
* Deep sleep to wakeup setup values
|
|
*/
|
|
#define SYSCTL_SLPWAKE_IRCOUT_PD (1 << 0) /*!< IRC oscillator output wake-up configuration */
|
|
#define SYSCTL_SLPWAKE_IRC_PD (1 << 1) /*!< IRC oscillator power-down wake-up configuration */
|
|
#define SYSCTL_SLPWAKE_FLASH_PD (1 << 2) /*!< Flash wake-up configuration */
|
|
#define SYSCTL_SLPWAKE_BOD_PD (1 << 3) /*!< BOD wake-up configuration */
|
|
#define SYSCTL_SLPWAKE_ADC_PD (1 << 4) /*!< ADC wake-up configuration */
|
|
#define SYSCTL_SLPWAKE_SYSOSC_PD (1 << 5) /*!< System oscillator wake-up configuration */
|
|
#define SYSCTL_SLPWAKE_WDTOSC_PD (1 << 6) /*!< Watchdog oscillator wake-up configuration */
|
|
#define SYSCTL_SLPWAKE_SYSPLL_PD (1 << 7) /*!< System PLL wake-up configuration */
|
|
#define SYSCTL_SLPWAKE_USBPLL_PD (1 << 8) /*!< USB PLL wake-up configuration */
|
|
#define SYSCTL_SLPWAKE_USBPAD_PD (1 << 10) /*!< USB transceiver wake-up configuration */
|
|
|
|
/**
|
|
* @brief Setup wakeup behaviour from deep sleep
|
|
* @param wakeupmask : OR'ed values of SYSCTL_SLPWAKE_* values (high is powered down)
|
|
* @return Nothing
|
|
* @note This must be setup prior to using deep sleep. See the user manual
|
|
* *(PDWAKECFG register) for more info on setting this up. This function selects
|
|
* which peripherals are powered up on exit from deep sleep.
|
|
* This function should only be called once with all options for wakeup
|
|
* in that call.
|
|
*/
|
|
void Chip_SYSCTL_SetWakeup(uint32_t wakeupmask);
|
|
|
|
/**
|
|
* @brief Return current wakeup mask
|
|
* @return OR'ed values of SYSCTL_SLPWAKE_* values
|
|
* @note A high state indicates the peripehral will powerup on wakeup.
|
|
*/
|
|
STATIC INLINE uint32_t Chip_SYSCTL_GetWakeup(void)
|
|
{
|
|
return LPC_SYSCTL->PDWAKECFG;
|
|
}
|
|
|
|
/**
|
|
* Power down configuration values
|
|
*/
|
|
#define SYSCTL_POWERDOWN_IRCOUT_PD (1 << 0) /*!< IRC oscillator output power down */
|
|
#define SYSCTL_POWERDOWN_IRC_PD (1 << 1) /*!< IRC oscillator power-down */
|
|
#define SYSCTL_POWERDOWN_FLASH_PD (1 << 2) /*!< Flash power down */
|
|
#define SYSCTL_POWERDOWN_BOD_PD (1 << 3) /*!< BOD power down */
|
|
#define SYSCTL_POWERDOWN_ADC_PD (1 << 4) /*!< ADC power down */
|
|
#define SYSCTL_POWERDOWN_SYSOSC_PD (1 << 5) /*!< System oscillator power down */
|
|
#define SYSCTL_POWERDOWN_WDTOSC_PD (1 << 6) /*!< Watchdog oscillator power down */
|
|
#define SYSCTL_POWERDOWN_SYSPLL_PD (1 << 7) /*!< System PLL power down */
|
|
#define SYSCTL_POWERDOWN_USBPLL_PD (1 << 8) /*!< USB PLL power-down */
|
|
#define SYSCTL_POWERDOWN_USBPAD_PD (1 << 10)/*!< USB transceiver power-down */
|
|
|
|
/**
|
|
* @brief Power down one or more blocks or peripherals
|
|
* @param powerdownmask : OR'ed values of SYSCTL_POWERDOWN_* values
|
|
* @return Nothing
|
|
*/
|
|
void Chip_SYSCTL_PowerDown(uint32_t powerdownmask);
|
|
|
|
/**
|
|
* @brief Power up one or more blocks or peripherals
|
|
* @param powerupmask : OR'ed values of SYSCTL_POWERDOWN_* values
|
|
* @return Nothing
|
|
*/
|
|
void Chip_SYSCTL_PowerUp(uint32_t powerupmask);
|
|
|
|
/**
|
|
* @brief Get power status
|
|
* @return OR'ed values of SYSCTL_POWERDOWN_* values
|
|
* @note A high state indicates the peripheral is powered down.
|
|
*/
|
|
STATIC INLINE uint32_t Chip_SYSCTL_GetPowerStates(void)
|
|
{
|
|
return LPC_SYSCTL->PDRUNCFG;
|
|
}
|
|
|
|
/**
|
|
* @brief Return the device ID
|
|
* @return the device ID
|
|
*/
|
|
STATIC INLINE uint32_t Chip_SYSCTL_GetDeviceID(void)
|
|
{
|
|
return LPC_SYSCTL->DEVICEID;
|
|
}
|
|
|
|
/**
|
|
* @}
|
|
*/
|
|
|
|
#ifdef __cplusplus
|
|
}
|
|
#endif
|
|
|
|
#endif /* __SYSCTL_13XX_H_ */
|