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

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 $
  20.  **************************************************************************/
  21. #include "LPC_SysControl.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.                 unsigned long PortDir0, unsigned long Port0,
  48.                 unsigned long PortDir1, unsigned long Port1)
  49. {
  50. unsigned long M, P_min, P_max, P, i;
  51. int Pflag = 0, PLLflag = 0;
  52.   // Check vaild
  53.   if ( Fosc<Fosc_MIN || Fosc>Fosc_MAX)
  54.     return 1;
  55.   if ( Fcclk<Fcclk_MIN || Fcclk>Fcclk_MAX)
  56.     return 1;
  57.   if (Fcclk < Fosc)
  58.     return 1;
  59.   else if (Fcclk > Fosc)
  60.   {
  61.     // Calculate PLL's value M & P if need
  62.     M = Fcclk / Fosc;
  63.     P_min = Fcco_MIN / (2*Fcclk) + 1;
  64.     P_max = Fcco_MAX / (2*Fcclk);
  65.     for (i=P_min; i<=P_max; i++)
  66.     {
  67.       if ((i ==1) || (i==2) ||(i==4) || (i==8))
  68.       {
  69.         P=i;
  70.         Pflag = 1;
  71.         break;
  72.       }
  73.     }
  74.     if (!Pflag) return 1;
  75.     PLLflag = 1;
  76.   }
  77.   // Set globe variable
  78.   SysConfig.Fosc = Fosc;
  79.   SysConfig.Fcclk = Fcclk;
  80.   switch(VPBDivider)
  81.   {
  82.   case VPBDIV4:
  83.     SysConfig.Fpclk= Fcclk / 4;
  84.     break;
  85.   case VPBDIV1:
  86.     SysConfig.Fpclk= Fcclk;
  87.     break;
  88.   case VPBDIV2:
  89.     SysConfig.Fpclk= Fcclk / 2;
  90.     break;
  91.   default:
  92.     return 1;
  93.   }
  94.   SysConfig.VPBDivider = VPBDivider;
  95.   SysConfig.RemapMode = RemapMode;
  96.   // Do PLL
  97.   if (PLLflag)
  98.   {
  99.     PLLCFG_bit.MSEL = M-1;      // Set M & P
  100.     switch(P)
  101.     {
  102.     case 1:
  103.       break;
  104.     case 2:
  105.       PLLCFG_bit.PSEL = 0x1;
  106.       break;
  107.     case 4:
  108.       PLLCFG_bit.PSEL = 0x2;
  109.       break;
  110.     case 8:
  111.       PLLCFG_bit.PSEL = 0x3;
  112.       break;
  113.     default:
  114.       return 1;
  115.     }
  116.     PLLCON_bit.PLLE = true;     // Enable PLL
  117.     // Interrups must be disble
  118.     PLLFEED = PLLFEED_DATA1;
  119.     PLLFEED = PLLFEED_DATA2;
  120.     while (!PLLSTAT_bit.PLOCK); // Wait PLL lock
  121.     PLLCON_bit.PLLC = true; // Connect PLL
  122.     PLLFEED = PLLFEED_DATA1;
  123.     PLLFEED = PLLFEED_DATA2;
  124.   }
  125.   else
  126.   {
  127.     PLLCON_bit.PLLC = true;
  128.     PLLCON_bit.PLLE = false;
  129.     PLLFEED = PLLFEED_DATA1;
  130.     PLLFEED = PLLFEED_DATA2;
  131.   }
  132.   // Do VPB
  133.   VPBDIV_bit.VPBDIV = VPBDivider;
  134.   // Do MEMAMP
  135.   MEMMAP_bit.MAP = SysConfig.RemapMode;
  136.   // Set GIO
  137.   PINSEL0 = PINSEL1 = 0;
  138.   IO0SET = Port0;
  139.   IO0CLR = ~Port0;
  140.   IO0DIR = PortDir0;
  141.   IO1SET = Port1;
  142.   IO1CLR = ~Port1;
  143.   IO1DIR = PortDir1;
  144.   return 0;
  145. }
  146. /*************************************************************************
  147.  * Function Name: SYS_GetFpclk
  148.  * Parameters: void
  149.  * Return: int
  150.  *              0: success
  151.  *  non-zero: error number
  152.  * Description: Get Fpclk
  153.  *
  154.  *************************************************************************/
  155. unsigned int SYS_GetFpclk (void)
  156. {
  157.   return SysConfig.Fpclk;
  158. }
  159. /*************************************************************************
  160.  * Function Name: PM_SetMode
  161.  * Parameters: LPC_SysControl_PMMode_t Mode -- PM_STANDARD ,PM_IDLE or PM_POWERDOWN
  162.  * Return: int
  163.  *              0: success
  164.  *  non-zero: error number
  165.  * Description: Set power manage mode
  166.  *
  167.  *************************************************************************/
  168. int PM_SetMode (LPC_SysControl_PMMode_t Mode)
  169. {
  170.   PCON = Mode & 0x3;
  171.   return 0;
  172. }
  173. /*************************************************************************
  174.  * Function Name: PM_OpenPeripheral
  175.  * Parameters: lpc_uint32 DevType
  176.  * Return: int
  177.  *              0: success
  178.  *  non-zero: error number
  179.  * Description: Open specifical peripheral
  180.  *
  181.  *************************************************************************/
  182. int PM_OpenPeripheral (unsigned int DevType)
  183. {
  184.   PCONP |= DevType;
  185.   return 0;
  186. }
  187. /*************************************************************************
  188.  * Function Name: PM_ClosePeripheral
  189.  * Parameters: lpc_uint32 DevType
  190.  * Return: int
  191.  *              0: success
  192.  *  non-zero: error number
  193.  * Description: Close specifical peripheral
  194.  *
  195.  *************************************************************************/
  196. int PM_ClosePeripheral (unsigned int DevType)
  197. {
  198.   PCONP &= (~DevType);
  199.   return 0;
  200. }
  201. /*************************************************************************
  202.  * Function Name: EXTINT_Init
  203.  * Parameters: LPC_SysControl_ExtInt_Chanel_t ExtIntNum
  204.  *        bool WakeupEnable
  205.  *
  206.  * Return: int
  207.  *              0 : success
  208.  *  non-zero : error number
  209.  * Description: Set External Interrupt
  210.  *
  211.  *************************************************************************/
  212. int EXTINT_Init (LPC_SysControl_ExtInt_Chanel_t ExtIntNum,
  213.                           bool WakeupEnable)
  214. {
  215.   switch(ExtIntNum)
  216.   {
  217.   case EXTINT0:
  218.     // Assign pin to Ext Interrup logic
  219.     PINSEL1_bit.P0_16 = 1;
  220.     // Clear interrupt flag
  221.     EXTINT_bit.EINT0 = 1;
  222.     // Set Wakeup
  223.     if (WakeupEnable)
  224.       EXTWAKE_bit.EXTWAKE0 = 1;
  225.     else
  226.       EXTWAKE_bit.EXTWAKE0 = 0;
  227.     break;
  228.   case EXTINT1:
  229.     // Assign pin to Ext Interrup logic
  230.     PINSEL0_bit.P0_14 = 1;
  231.     // Clear interrupt flag
  232.     EXTINT_bit.EINT1 = 1;
  233.     // Set Wakeup
  234.     if (WakeupEnable)
  235.       EXTWAKE_bit.EXTWAKE1 = 1;
  236.     else
  237.       EXTWAKE_bit.EXTWAKE1 = 0;
  238.     break;
  239.   case EXTINT2:
  240.     // Assign pin to Ext Interrup logic
  241.     PINSEL0_bit.P0_15 = 1;
  242.     // Clear interrupt flag
  243.     EXTINT_bit.EINT2 = 1;
  244.     // Set Wakeup
  245.     if (WakeupEnable)
  246.       EXTWAKE_bit.EXTWAKE2 = 1;
  247.     else
  248.       EXTWAKE_bit.EXTWAKE2 = 0;
  249.     break;
  250.   default:
  251.     return 1;
  252.   }
  253.   return 0;
  254. }