NXP's driver library for LPC17xx, ported to mbed's online compiler. Not tested! I had to fix a lot of warings and found a couple of pretty obvious bugs, so the chances are there are more. Original: http://ics.nxp.com/support/documents/microcontrollers/zip/lpc17xx.cmsis.driver.library.zip

Dependencies:   mbed

Embed: (wiki syntax)

« Back to documentation index

Show/hide line numbers lpc17xx_clkpwr.c Source File

lpc17xx_clkpwr.c

Go to the documentation of this file.
00001 /**
00002  * @file    : lpc17xx_clkpwr.c
00003  * @brief   : Contains all functions support for Clock and Power Control
00004  *              firmware library on LPC17xx
00005  * @version : 1.0
00006  * @date    : 18. Mar. 2009
00007  * @author  : HieuNguyen
00008  **************************************************************************
00009  * Software that is described herein is for illustrative purposes only
00010  * which provides customers with programming information regarding the
00011  * products. This software is supplied "AS IS" without any warranties.
00012  * NXP Semiconductors assumes no responsibility or liability for the
00013  * use of the software, conveys no license or title under any patent,
00014  * copyright, or mask work right to the product. NXP Semiconductors
00015  * reserves the right to make changes in the software without
00016  * notification. NXP Semiconductors also make no representation or
00017  * warranty that such application will be suitable for the specified
00018  * use without further testing or modification.
00019  **********************************************************************/
00020 
00021 /* Peripheral group ----------------------------------------------------------- */
00022 /** @addtogroup CLKPWR
00023  * @{
00024  */
00025 
00026 /* Includes ------------------------------------------------------------------- */
00027 #include "lpc17xx_clkpwr.h"
00028 
00029 
00030 /* Public Functions ----------------------------------------------------------- */
00031 /** @addtogroup CLKPWR_Public_Functions
00032  * @{
00033  */
00034 
00035 /*********************************************************************//**
00036  * @brief       Set value of each Peripheral Clock Selection
00037  * @param[in]   ClkType Peripheral Clock Selection of each type,
00038  *              should be one of the following:
00039  *              - CLKPWR_PCLKSEL_WDT        : WDT
00040                 - CLKPWR_PCLKSEL_TIMER0     : Timer 0
00041                 - CLKPWR_PCLKSEL_TIMER1     : Timer 1
00042                 - CLKPWR_PCLKSEL_UART0      : UART 0
00043                 - CLKPWR_PCLKSEL_UART1      : UART 1
00044                 - CLKPWR_PCLKSEL_PWM1       : PWM 1
00045                 - CLKPWR_PCLKSEL_I2C0       : I2C 0
00046                 - CLKPWR_PCLKSEL_SPI        : SPI
00047                 - CLKPWR_PCLKSEL_SSP1       : SSP 1
00048                 - CLKPWR_PCLKSEL_DAC        : DAC
00049                 - CLKPWR_PCLKSEL_ADC        : ADC
00050                 - CLKPWR_PCLKSEL_CAN1       : CAN 1
00051                 - CLKPWR_PCLKSEL_CAN2       : CAN 2
00052                 - CLKPWR_PCLKSEL_ACF        : ACF
00053                 - CLKPWR_PCLKSEL_QEI        : QEI
00054                 - CLKPWR_PCLKSEL_PCB        : PCB
00055                 - CLKPWR_PCLKSEL_I2C1       : I2C 1
00056                 - CLKPWR_PCLKSEL_SSP0       : SSP 0
00057                 - CLKPWR_PCLKSEL_TIMER2     : Timer 2
00058                 - CLKPWR_PCLKSEL_TIMER3     : Timer 3
00059                 - CLKPWR_PCLKSEL_UART2      : UART 2
00060                 - CLKPWR_PCLKSEL_UART3      : UART 3
00061                 - CLKPWR_PCLKSEL_I2C2       : I2C 2
00062                 - CLKPWR_PCLKSEL_I2S        : I2S
00063                 - CLKPWR_PCLKSEL_RIT        : RIT
00064                 - CLKPWR_PCLKSEL_SYSCON     : SYSCON
00065                 - CLKPWR_PCLKSEL_MC         : MC
00066 
00067  * @param[in]   DivVal  Value of divider, should be:
00068  *              - CLKPWR_PCLKSEL_CCLK_DIV_4 : PCLK_peripheral = CCLK/4
00069  *              - CLKPWR_PCLKSEL_CCLK_DIV_1 : PCLK_peripheral = CCLK/1
00070  *              - CLKPWR_PCLKSEL_CCLK_DIV_2 : PCLK_peripheral = CCLK/2
00071  *
00072  * @return none
00073  **********************************************************************/
00074 void CLKPWR_SetPCLKDiv (uint32_t ClkType, uint32_t DivVal)
00075 {
00076     uint32_t bitpos;
00077 
00078     bitpos = (ClkType < 32) ? (ClkType) : (ClkType - 32);
00079 
00080     /* PCLKSEL0 selected */
00081     if (ClkType < 32)
00082     {
00083         /* Clear two bit at bit position */
00084         LPC_SC->PCLKSEL0 &= (~(CLKPWR_PCLKSEL_BITMASK(bitpos)));
00085 
00086         /* Set two selected bit */
00087         LPC_SC->PCLKSEL0 |= (CLKPWR_PCLKSEL_SET(bitpos, DivVal));
00088     }
00089     /* PCLKSEL1 selected */
00090     else
00091     {
00092         /* Clear two bit at bit position */
00093         LPC_SC->PCLKSEL1 &= ~(CLKPWR_PCLKSEL_BITMASK(bitpos));
00094 
00095         /* Set two selected bit */
00096         LPC_SC->PCLKSEL1 |= (CLKPWR_PCLKSEL_SET(bitpos, DivVal));
00097     }
00098 }
00099 
00100 
00101 /*********************************************************************//**
00102  * @brief       Get current value of each Peripheral Clock Selection
00103  * @param[in]   ClkType Peripheral Clock Selection of each type,
00104  *              should be one of the following:
00105  *              - CLKPWR_PCLKSEL_WDT        : WDT
00106                 - CLKPWR_PCLKSEL_TIMER0     : Timer 0
00107                 - CLKPWR_PCLKSEL_TIMER1     : Timer 1
00108                 - CLKPWR_PCLKSEL_UART0      : UART 0
00109                 - CLKPWR_PCLKSEL_UART1      : UART 1
00110                 - CLKPWR_PCLKSEL_PWM1       : PWM 1
00111                 - CLKPWR_PCLKSEL_I2C0       : I2C 0
00112                 - CLKPWR_PCLKSEL_SPI        : SPI
00113                 - CLKPWR_PCLKSEL_SSP1       : SSP 1
00114                 - CLKPWR_PCLKSEL_DAC        : DAC
00115                 - CLKPWR_PCLKSEL_ADC        : ADC
00116                 - CLKPWR_PCLKSEL_CAN1       : CAN 1
00117                 - CLKPWR_PCLKSEL_CAN2       : CAN 2
00118                 - CLKPWR_PCLKSEL_ACF        : ACF
00119                 - CLKPWR_PCLKSEL_QEI        : QEI
00120                 - CLKPWR_PCLKSEL_PCB        : PCB
00121                 - CLKPWR_PCLKSEL_I2C1       : I2C 1
00122                 - CLKPWR_PCLKSEL_SSP0       : SSP 0
00123                 - CLKPWR_PCLKSEL_TIMER2     : Timer 2
00124                 - CLKPWR_PCLKSEL_TIMER3     : Timer 3
00125                 - CLKPWR_PCLKSEL_UART2      : UART 2
00126                 - CLKPWR_PCLKSEL_UART3      : UART 3
00127                 - CLKPWR_PCLKSEL_I2C2       : I2C 2
00128                 - CLKPWR_PCLKSEL_I2S        : I2S
00129                 - CLKPWR_PCLKSEL_RIT        : RIT
00130                 - CLKPWR_PCLKSEL_SYSCON     : SYSCON
00131                 - CLKPWR_PCLKSEL_MC         : MC
00132 
00133  * @return      Value of Selected Peripheral Clock Selection
00134  **********************************************************************/
00135 uint32_t CLKPWR_GetPCLKSEL (uint32_t ClkType)
00136 {
00137     uint32_t bitpos, retval;
00138 
00139     if (ClkType < 32)
00140     {
00141         bitpos = ClkType;
00142         retval = LPC_SC->PCLKSEL0;
00143     }
00144     else
00145     {
00146         bitpos = ClkType - 32;
00147         retval = LPC_SC->PCLKSEL1;
00148     }
00149 
00150     retval = CLKPWR_PCLKSEL_GET(bitpos, retval);
00151     return retval;
00152 }
00153 
00154 
00155 
00156 /*********************************************************************//**
00157  * @brief       Get current value of each Peripheral Clock
00158  * @param[in]   ClkType Peripheral Clock Selection of each type,
00159  *              should be one of the following:
00160  *              - CLKPWR_PCLKSEL_WDT        : WDT
00161                 - CLKPWR_PCLKSEL_TIMER0     : Timer 0
00162                 - CLKPWR_PCLKSEL_TIMER1     : Timer 1
00163                 - CLKPWR_PCLKSEL_UART0      : UART 0
00164                 - CLKPWR_PCLKSEL_UART1      : UART 1
00165                 - CLKPWR_PCLKSEL_PWM1       : PWM 1
00166                 - CLKPWR_PCLKSEL_I2C0       : I2C 0
00167                 - CLKPWR_PCLKSEL_SPI        : SPI
00168                 - CLKPWR_PCLKSEL_SSP1       : SSP 1
00169                 - CLKPWR_PCLKSEL_DAC        : DAC
00170                 - CLKPWR_PCLKSEL_ADC        : ADC
00171                 - CLKPWR_PCLKSEL_CAN1       : CAN 1
00172                 - CLKPWR_PCLKSEL_CAN2       : CAN 2
00173                 - CLKPWR_PCLKSEL_ACF        : ACF
00174                 - CLKPWR_PCLKSEL_QEI        : QEI
00175                 - CLKPWR_PCLKSEL_PCB        : PCB
00176                 - CLKPWR_PCLKSEL_I2C1       : I2C 1
00177                 - CLKPWR_PCLKSEL_SSP0       : SSP 0
00178                 - CLKPWR_PCLKSEL_TIMER2     : Timer 2
00179                 - CLKPWR_PCLKSEL_TIMER3     : Timer 3
00180                 - CLKPWR_PCLKSEL_UART2      : UART 2
00181                 - CLKPWR_PCLKSEL_UART3      : UART 3
00182                 - CLKPWR_PCLKSEL_I2C2       : I2C 2
00183                 - CLKPWR_PCLKSEL_I2S        : I2S
00184                 - CLKPWR_PCLKSEL_RIT        : RIT
00185                 - CLKPWR_PCLKSEL_SYSCON     : SYSCON
00186                 - CLKPWR_PCLKSEL_MC         : MC
00187 
00188  * @return      Value of Selected Peripheral Clock
00189  **********************************************************************/
00190 uint32_t CLKPWR_GetPCLK (uint32_t ClkType)
00191 {
00192     uint32_t retval, div;
00193 
00194     retval = SystemCoreClock;
00195     div = CLKPWR_GetPCLKSEL(ClkType);
00196 
00197     switch (div)
00198     {
00199     case 0:
00200         div = 4;
00201         break;
00202 
00203     case 1:
00204         div = 1;
00205         break;
00206 
00207     case 2:
00208         div = 2;
00209         break;
00210 
00211     case 3:
00212         div = 8;
00213         break;
00214     }
00215     retval /= div;
00216 
00217     return retval;
00218 }
00219 
00220 
00221 
00222 /*********************************************************************//**
00223  * @brief       Configure power supply for each peripheral according to NewState
00224  * @param[in]   PPType  Type of peripheral used to enable power,
00225  *                      should be one of the following:
00226  *              -  CLKPWR_PCONP_PCTIM0      : Timer 0
00227                 -  CLKPWR_PCONP_PCTIM1      : Timer 1
00228                 -  CLKPWR_PCONP_PCUART0     : UART 0
00229                 -  CLKPWR_PCONP_PCUART1     : UART 1
00230                 -  CLKPWR_PCONP_PCPWM1      : PWM 1
00231                 -  CLKPWR_PCONP_PCI2C0      : I2C 0
00232                 -  CLKPWR_PCONP_PCSPI       : SPI
00233                 -  CLKPWR_PCONP_PCRTC       : RTC
00234                 -  CLKPWR_PCONP_PCSSP1      : SSP 1
00235                 -  CLKPWR_PCONP_PCAD        : ADC
00236                 -  CLKPWR_PCONP_PCAN1       : CAN 1
00237                 -  CLKPWR_PCONP_PCAN2       : CAN 2
00238                 -  CLKPWR_PCONP_PCGPIO      : GPIO
00239                 -  CLKPWR_PCONP_PCRIT       : RIT
00240                 -  CLKPWR_PCONP_PCMC        : MC
00241                 -  CLKPWR_PCONP_PCQEI       : QEI
00242                 -  CLKPWR_PCONP_PCI2C1      : I2C 1
00243                 -  CLKPWR_PCONP_PCSSP0      : SSP 0
00244                 -  CLKPWR_PCONP_PCTIM2      : Timer 2
00245                 -  CLKPWR_PCONP_PCTIM3      : Timer 3
00246                 -  CLKPWR_PCONP_PCUART2     : UART 2
00247                 -  CLKPWR_PCONP_PCUART3     : UART 3
00248                 -  CLKPWR_PCONP_PCI2C2      : I2C 2
00249                 -  CLKPWR_PCONP_PCI2S       : I2S
00250                 -  CLKPWR_PCONP_PCGPDMA     : GPDMA
00251                 -  CLKPWR_PCONP_PCENET      : Ethernet
00252                 -  CLKPWR_PCONP_PCUSB       : USB
00253  *
00254  * @param[in]   NewState    New state of Peripheral Power, should be:
00255  *              - ENABLE    : Enable power for this peripheral
00256  *              - DISABLE   : Disable power for this peripheral
00257  *
00258  * @return none
00259  **********************************************************************/
00260 void CLKPWR_ConfigPPWR (uint32_t PPType, FunctionalState NewState)
00261 {
00262     if (NewState == ENABLE)
00263     {
00264         LPC_SC->PCONP |= PPType & CLKPWR_PCONP_BITMASK;
00265     }
00266     else if (NewState == DISABLE)
00267     {
00268         LPC_SC->PCONP &= (~PPType) & CLKPWR_PCONP_BITMASK;
00269     }
00270 }
00271 
00272 
00273 /**
00274  * @brief       Enter Sleep mode with co-operated instruction by the Cortex-M3.
00275  * @param[in]   None
00276  * @return      None
00277  */
00278 void CLKPWR_Sleep(void)
00279 {
00280     LPC_SC->PCON = 0x00;
00281     /* Sleep Mode*/
00282     __WFI();
00283 }
00284 
00285 
00286 /**
00287  * @brief       Enter Deep Sleep mode with co-operated instruction by the Cortex-M3.
00288  * @param[in]   None
00289  * @return      None
00290  */
00291 void CLKPWR_DeepSleep(void)
00292 {
00293     /* Deep-Sleep Mode, set SLEEPDEEP bit */
00294     SCB->SCR = 0x4;
00295     LPC_SC->PCON = 0x00;
00296     /* Sleep Mode*/
00297     __WFI();
00298 }
00299 
00300 
00301 /**
00302  * @brief       Enter Power Down mode with co-operated instruction by the Cortex-M3.
00303  * @param[in]   None
00304  * @return      None
00305  */
00306 void CLKPWR_PowerDown(void)
00307 {
00308     /* Deep-Sleep Mode, set SLEEPDEEP bit */
00309     SCB->SCR = 0x4;
00310     LPC_SC->PCON = 0x01;
00311     /* Sleep Mode*/
00312     __WFI();
00313 }
00314 
00315 
00316 /**
00317  * @brief       Enter Deep Power Down mode with co-operated instruction by the Cortex-M3.
00318  * @param[in]   None
00319  * @return      None
00320  */
00321 void CLKPWR_DeepPowerDown(void)
00322 {
00323     /* Deep-Sleep Mode, set SLEEPDEEP bit */
00324     SCB->SCR = 0x4;
00325     LPC_SC->PCON = 0x03;
00326     /* Sleep Mode*/
00327     __WFI();
00328 }
00329 
00330 
00331 /**
00332  * @brief       Configure Brown-Out function in
00333  */
00334 
00335 
00336 /**
00337  * @}
00338  */
00339 
00340 /**
00341  * @}
00342  */
00343 
00344 /* --------------------------------- End Of File ------------------------------ */