lpc_syscontrol.c
上传用户:sourcesun
上传日期:2013-09-23
资源大小:362k
文件大小:8k
源码类别:

DNA

开发平台:

Asm

  1. /*************************************************************************
  2.  *
  3.  *    Used with ICCARM and AARM.
  4.  *
  5.  *    (c) Copyright IAR Systems 2003
  6.  *
  7.  *    File name   : LPC_SysControl.c
  8.  *    Description : Define API for system init
  9.  *
  10.  *    History :
  11.  *    1. Data:  August 17, 2004
  12.  *       Author: Shawn Zhang
  13.  *       Description: Create the basic function
  14.  *
  15.  *    2. Data        : Oct 7, 2004
  16.  *       Author      : Stanimir Bonev
  17.  *       Description : Modify some function and interface
  18.  *
  19.  *    $Revision: 1.2.2.1 $
  20.  **************************************************************************/
  21. #include "lpc_sysctrl.h"
  22. LPC_Syscontrol_Config_t SysConfig;
  23. /*************************************************************************
  24.  * Function Name: SYS_Init
  25.  * Parameters:  unsigned long Fosc
  26.  *          unsigned long Fcclk
  27.  *    LPC_SysControl_VPBDiv_t VPBDivider
  28.  *    LPC_SysControl_RemapMode_t RemapMode
  29.  *    bool MAMEnable
  30.  *    LPC_SysControl_MAMConfig_t *pMAMConfig
  31.  *              unsigned long PortDir0
  32.  *              unsigned long Port0
  33.  *              unsigned long PortDir1
  34.  *              unsigned long Port1
  35.  *
  36.  * Return: int
  37.  *              0: success
  38.  *   non-zero: error number
  39.  *
  40.  * Description: Initialize the whole system, setting MEMMAP, VPB, whether enable PLL,
  41.  *       whether enable MAM
  42.  *
  43.  *************************************************************************/
  44. int SYS_Init (unsigned long Fosc, unsigned long Fcclk,
  45.                 LPC_SysControl_VPBDiv_t VPBDivider,
  46.                 LPC_SysControl_RemapMode_t RemapMode,
  47.                 bool MAMEnable, LPC_SysControl_MAMConfig_t *pMAMConfig,
  48.                 unsigned long PortDir0, unsigned long Port0,
  49.                 unsigned long PortDir1, unsigned long Port1)
  50. {
  51. unsigned long M, P_min, P_max, P, i;
  52. int Pflag = 0, PLLflag = 0;
  53.   // Check vaild
  54.   if ( Fosc<Fosc_MIN || Fosc>Fosc_MAX)
  55.     return 1;
  56.   if ( Fcclk<Fcclk_MIN || Fcclk>Fcclk_MAX)
  57.     return 1;
  58.   if (Fcclk < Fosc)
  59.     return 1;
  60.   else if (Fcclk > Fosc)
  61.   {
  62.     // Calculate PLL's value M & P if need
  63.     M = Fcclk / Fosc;
  64.     P_min = Fcco_MIN / (2*Fcclk) + 1;
  65.     P_max = Fcco_MAX / (2*Fcclk);
  66.     for (i=P_min; i<=P_max; i++)
  67.     {
  68.       if ((i ==1) || (i==2) ||(i==4) || (i==8))
  69.       {
  70.         P=i;
  71.         Pflag = 1;
  72.         break;
  73.       }
  74.     }
  75.     if (!Pflag) return 1;
  76.     PLLflag = 1;
  77.   }
  78.   // Set globe variable
  79.   SysConfig.Fosc = Fosc;
  80.   SysConfig.Fcclk = Fcclk;
  81.   switch(VPBDivider)
  82.   {
  83.   case VPBDIV4:
  84.     SysConfig.Fpclk= Fcclk / 4;
  85.     break;
  86.   case VPBDIV1:
  87.     SysConfig.Fpclk= Fcclk;
  88.     break;
  89.   case VPBDIV2:
  90.     SysConfig.Fpclk= Fcclk / 2;
  91.     break;
  92.   default:
  93.     return 1;
  94.   }
  95.   SysConfig.VPBDivider = VPBDivider;
  96.   SysConfig.RemapMode = RemapMode;
  97.   SysConfig.MAMEnable = MAMEnable;
  98.   if (MAMEnable)
  99.   {
  100.     SysConfig.MAMConfig.Mode = pMAMConfig->Mode;
  101.     SysConfig.MAMConfig.Cycle= pMAMConfig->Cycle;
  102.   }
  103. #ifndef LPC2148
  104.   // Do MAM
  105.   if(MAMEnable)
  106.   {
  107.     MAMCR_bit.MODECTRL = 0;
  108.     MAMCR_bit.MODECTRL = pMAMConfig->Mode;
  109.     MAMTIM_bit.CYCLES = pMAMConfig->Cycle;
  110.   }
  111.   else MAMCR_bit.MODECTRL = 0;
  112. #endif
  113.   // Do PLL
  114.   if (PLLflag)
  115.   {
  116.     PLLCFG_bit.MSEL = M-1;      // Set M & P
  117.     switch(P)
  118.     {
  119.     case 1:
  120.       PLLCFG_bit.PSEL = 0;
  121.       break;
  122.     case 2:
  123.       PLLCFG_bit.PSEL = 0x1;
  124.       break;
  125.     case 4:
  126.       PLLCFG_bit.PSEL = 0x2;
  127.       break;
  128.     case 8:
  129.       PLLCFG_bit.PSEL = 0x3;
  130.       break;
  131.     default:
  132.       return 1;
  133.     }
  134.     PLLCON_bit.PLLE = true;     // Enable PLL
  135.     // Interrups must be disble
  136.     PLLFEED = PLLFEED_DATA1;
  137.     PLLFEED = PLLFEED_DATA2;
  138.     while (!PLLSTAT_bit.PLOCK); // Wait PLL lock
  139.     PLLCON_bit.PLLC = true; // Connect PLL
  140.     PLLFEED = PLLFEED_DATA1;
  141.     PLLFEED = PLLFEED_DATA2;
  142.   }
  143.   else
  144.   {
  145.     PLLCON_bit.PLLC = false;
  146.     PLLCON_bit.PLLE = false;
  147.     PLLFEED = PLLFEED_DATA1;
  148.     PLLFEED = PLLFEED_DATA2;
  149.   }
  150.   // Do VPB
  151.   VPBDIV_bit.VPBDIV = VPBDivider;
  152.   // Do MEMAMP
  153.   MEMMAP_bit.MAP = SysConfig.RemapMode;
  154.   // Set GIO
  155.   PINSEL0 = PINSEL1 = 0;
  156.   IO0SET = Port0;
  157.   IO0CLR = ~Port0;
  158.   IO0DIR = PortDir0;
  159.   IO1SET = Port1;
  160.   IO1CLR = ~Port1;
  161.   IO1DIR = PortDir1;
  162.   return 0;
  163. }
  164. /*************************************************************************
  165.  * Function Name: SYS_GetFpclk
  166.  * Parameters: void
  167.  * Return: int
  168.  *              0: success
  169.  *   non-zero: error number
  170.  * Description: Get Fpclk
  171.  *
  172.  *************************************************************************/
  173. unsigned int SYS_GetFpclk (void)
  174. {
  175.   return SysConfig.Fpclk;
  176. }
  177. /*************************************************************************
  178.  * Function Name: PM_SetMode
  179.  * Parameters: LPC_SysControl_PMMode_t Mode -- PM_STANDARD ,PM_IDLE or PM_POWERDOWN
  180.  * Return: int
  181.  *              0: success
  182.  *   non-zero: error number
  183.  * Description: Set power manage mode
  184.  *
  185.  *************************************************************************/
  186. int PM_SetMode (LPC_SysControl_PMMode_t Mode)
  187. {
  188.   PCON = Mode & 0x3;
  189.   return 0;
  190. }
  191. /*************************************************************************
  192.  * Function Name: PM_OpenPeripheral
  193.  * Parameters: lpc_uint32 DevType
  194.  * Return: int
  195.  *              0: success
  196.  *   non-zero: error number
  197.  * Description: Open specifical peripheral
  198.  *
  199.  *************************************************************************/
  200. int PM_OpenPeripheral (unsigned int DevType)
  201. {
  202.   PCONP |= DevType;
  203.   return 0;
  204. }
  205. /*************************************************************************
  206.  * Function Name: PM_ClosePeripheral
  207.  * Parameters: lpc_uint32 DevType
  208.  * Return: int
  209.  *              0: success
  210.  *   non-zero: error number
  211.  * Description: Close specifical peripheral
  212.  *
  213.  *************************************************************************/
  214. int PM_ClosePeripheral (unsigned int DevType)
  215. {
  216.   PCONP &= (~DevType);
  217.   return 0;
  218. }
  219. /*************************************************************************
  220.  * Function Name: EXTINT_Init
  221.  * Parameters: LPC_SysControl_ExtInt_Chanel_t ExtIntNum
  222.  *         bool WakeupEnable
  223.  *
  224.  * Return: int
  225.  *              0 : success
  226.  *   non-zero : error number
  227.  * Description: Set External Interrupt
  228.  *
  229.  *************************************************************************/
  230. int EXTINT_Init (LPC_SysControl_ExtInt_Chanel_t ExtIntNum,
  231.                           bool WakeupEnable)
  232. {
  233.   switch(ExtIntNum)
  234.   {
  235.   case EXTINT0:
  236.     // Assign pin to Ext Interrup logic
  237.     PINSEL1_bit.P0_16 = 1;
  238.     // Clear interrupt flag
  239.     EXTINT_bit.EINT0 = 1;
  240.     // Set Wakeup
  241.     if (WakeupEnable)
  242.       EXTWAKE_bit.EXTWAKE0 = 1;
  243.     else
  244.       EXTWAKE_bit.EXTWAKE0 = 0;
  245.     break;
  246.   case EXTINT1:
  247.     // Assign pin to Ext Interrup logic
  248.     PINSEL0_bit.P0_14 = 1;
  249.     // Clear interrupt flag
  250.     EXTINT_bit.EINT1 = 1;
  251.     // Set Wakeup
  252.     if (WakeupEnable)
  253.       EXTWAKE_bit.EXTWAKE1 = 1;
  254.     else
  255.       EXTWAKE_bit.EXTWAKE1 = 0;
  256.     break;
  257.   case EXTINT2:
  258.     // Assign pin to Ext Interrup logic
  259.     PINSEL0_bit.P0_15 = 1;
  260.     // Clear interrupt flag
  261.     EXTINT_bit.EINT2 = 1;
  262.     // Set Wakeup
  263.     if (WakeupEnable)
  264.       EXTWAKE_bit.EXTWAKE2 = 1;
  265.     else
  266.       EXTWAKE_bit.EXTWAKE2 = 0;
  267.     break;
  268.   case USBWAKE:
  269.     /*
  270.     // Set Wakeup
  271.     if (WakeupEnable)
  272.       EXTWAKE_bit.USBWAKE = 1;
  273.     else
  274.       EXTWAKE_bit.USBWAKE = 0;
  275.     break;
  276.     */
  277.   case BODWAKE:
  278.     // Set Wakeup
  279.     if (WakeupEnable)
  280.       EXTWAKE_bit.BODWAKE = 1;
  281.     else
  282.       EXTWAKE_bit.BODWAKE = 0;
  283.     break;
  284.   case RTCWAKE:
  285.     // Set Wakeup
  286.     if (WakeupEnable)
  287.       EXTWAKE_bit.RTCWAKE = 1;
  288.     else
  289.       EXTWAKE_bit.RTCWAKE = 0;
  290.     break;
  291.   default:
  292.     return 1;
  293.   }
  294.   return 0;
  295. }