⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 lpc_syscontrol.c

📁 IAR下编译LPC214X的模板及示例文件
💻 C
字号:
/*************************************************************************
 使用IAR EW4.4平台编译: LPC214X的PLL频率,系统频率及外部中断初始化模块文件
 **************************************************************************/

#include "LPC_SysControl.h"

LPC_Syscontrol_Config_t SysConfig;

/*************************************************************************
 * 函数功能: 初始化内核频率, VPB频率, 内存重映射(remap)
 * 函数名: SYS_Init
 * 输入参数: 
 *      Int32U Fosc(晶振频率)
 *      Int32U Fcclk(内核CPU频率)
 *      LPC_SysControl_VPBDiv_t VPBDivider(VPB分频系数)
 *      LPC_SysControl_RemapMode_t RemapMode(程序在内存中重映射: 映射到RAM或ROM或boot block)
 *      Int32U PortDir0(设置P0.0-P0.31的I/O方向)
 *      Int32U Port0(设置P0.0-P0.31的初始值)
 *      Int32U PortDir1(设置P1.16-P1.31的I/O方向)
 *      Int32U Port1(设置P1.0-P1.31的初始值)
 *
 * 返回: int
 *      0: 初始化成功
 *    非0: 初始化错误编号
 *
 *************************************************************************/
Int32S SYS_Init (Int32U Fosc, Int32U Fcclk,
                LPC_SysControl_VPBDiv_t VPBDivider,
                LPC_SysControl_RemapMode_t RemapMode,
                Int32U PortDir0, Int32U Port0,
                Int32U PortDir1, Int32U Port1)
{
  Int32U M, P_min, P_max, P, i;
  Int32S Pflag = 0, PLLflag = 0;
  register unsigned int temp;
  
  for (temp=0; temp < 1000; ++temp)
    temp++;
  
  // Check vaild
  if ( Fosc<Fosc_MIN || Fosc>Fosc_MAX)
    return 1;
  if ( Fcclk<Fcclk_MIN || Fcclk>Fcclk_MAX)
    return 1;
  if (Fcclk < Fosc)
    return 1;
  else if (Fcclk > Fosc)
  {
    // Calculate PLL's value M & P if need
    M = Fcclk / Fosc;
    P_min = Fcco_MIN / (2*Fcclk) + 1;
    P_max = Fcco_MAX / (2*Fcclk);
    for (i=P_min; i<=P_max; i++)
    {
      if ((i ==1) || (i==2) ||(i==4) || (i==8))
      {
        P=i;
        Pflag = 1;
        break;
      }
    }
    if (!Pflag) return 1;
    PLLflag = 1;
  }
  // Set globe variable
  SysConfig.Fosc = Fosc;
  SysConfig.Fcclk = Fcclk;
  switch(VPBDivider)
  {
  case VPBDIV4:
    SysConfig.Fpclk= Fcclk / 4;
    break;
  case VPBDIV1:
    SysConfig.Fpclk= Fcclk;
    break;
  case VPBDIV2:
    SysConfig.Fpclk= Fcclk / 2;
    break;
  default:
    return 1;
  }
  SysConfig.VPBDivider = VPBDivider;
  SysConfig.RemapMode = RemapMode;

  // Do PLL
  if (PLLflag)
  {
    
    PLLCFG_bit.MSEL = M-1;      // Set M & P
    switch(P)
    {
    case 1:
      PLLCFG_bit.PSEL = 0;
      break;
    case 2:
      PLLCFG_bit.PSEL = 0x1;
      break;
    case 4:
      PLLCFG_bit.PSEL = 0x2;
      break;
    case 8:
      PLLCFG_bit.PSEL = 0x3;
      break;
    default:
      return 1;
    }
    PLLCON_bit.PLLE = true;     // Enable PLL

    // Interrups must be disble
    PLLFEED = PLLFEED_DATA1;
    PLLFEED = PLLFEED_DATA2;

    while (!PLLSTAT_bit.PLOCK); // Wait PLL lock

    PLLCON_bit.PLLC = true; // Connect PLL
    PLLFEED = PLLFEED_DATA1;
    PLLFEED = PLLFEED_DATA2;
  }
  else
  {
    PLLCON_bit.PLLC = false;
    PLLCON_bit.PLLE = false;
    PLLFEED = PLLFEED_DATA1;
    PLLFEED = PLLFEED_DATA2;
  }
  // Do VPB
  VPBDIV_bit.VPBDIV = VPBDivider;

  // Do MEMAMP
  MEMMAP_bit.MAP = SysConfig.RemapMode;

  // Set GIO
  PINSEL0 = PINSEL1 = 0;
  IO0SET = Port0;
  IO0CLR = ~Port0;
  IO0DIR = PortDir0;
  IO1SET = Port1;
  IO1CLR = ~Port1;
  IO1DIR = PortDir1;
  return 0;
}

/*************************************************************************
 * 函数名: SYS_GetFpclk
 * 输入参数: 无
 * 返回: int
 *              0: success
 *   non-zero: error number
 * Description: Get Fpclk
 *
 *************************************************************************/
Int32U SYS_GetFpclk (void)
{
  return SysConfig.Fpclk;
}

/*************************************************************************
 * 函数名: PM_SetMode
 * 输入参数: LPC_SysControl_PMMode_t Mode -- PM_STANDARD ,PM_IDLE or PM_POWERDOWN
 * 返回: int
 *              0: success
 *   non-zero: error number
 * Description: Set power manage mode
 *
 *************************************************************************/
Int32S PM_SetMode (LPC_SysControl_PMMode_t Mode)
{
  PCON = Mode & 0x3;
  return 0;
}

/*************************************************************************
 * 函数名: PM_OpenPeripheral
 * 输入参数: lpc_uint32 DevType
 * 返回: int
 *              0: success
 *   non-zero: error number
 * Description: Open specifical peripheral
 *
 *************************************************************************/
Int32S PM_OpenPeripheral (Int32U DevType)
{
  PCONP |= DevType;
  return 0;
}

/*************************************************************************
 * 函数名: PM_ClosePeripheral
 * 输入参数: lpc_uint32 DevType
 * 返回: int
 *              0: success
 *   non-zero: error number
 * Description: Close specifical peripheral
 *
 *************************************************************************/
Int32S PM_ClosePeripheral (Int32U DevType)
{
  PCONP &= (~DevType);
  return 0;
}


/*************************************************************************
 * 函数名: EXTINT_Init
 * 输入参数:
 *    LPC_SysControl_ExtInt_Chanel_t ExtIntNum
 *    bool WakeupEnable
 * 返回: int
 *    0 : success
 *  非0 : error number
 * Description: Set External Interrupt
 *
 *************************************************************************/
Int32S EXTINT_Init(LPC_SysControl_ExtInt_Chanel_t ExtIntNum, bool WakeupEnable)
{
  switch(ExtIntNum)
  {
    case EXTINT0:
      // Assign pin to Ext Interrup logic
      PINSEL1_bit.P0_16 = 1;
    // Clear interrupt flag
      EXTINT_bit.EINT0 = 1;
    // Set Wakeup
      if (WakeupEnable)
        EXTWAKE_bit.EXTWAKE0 = 1;
      else
        EXTWAKE_bit.EXTWAKE0 = 0;
      break;
    case EXTINT1:
    // Assign pin to Ext Interrup logic
      PINSEL0_bit.P0_14 = 1;
    // Clear interrupt flag
      EXTINT_bit.EINT1 = 1;
    // Set Wakeup
      if (WakeupEnable)
        EXTWAKE_bit.EXTWAKE1 = 1;
      else
        EXTWAKE_bit.EXTWAKE1 = 0;
      break;
    case EXTINT2:
    // Assign pin to Ext Interrup logic
      PINSEL0_bit.P0_15 = 1;
    // Clear interrupt flag
      EXTINT_bit.EINT2 = 1;
    // Set Wakeup
      if (WakeupEnable)
        EXTWAKE_bit.EXTWAKE2 = 1;
      else
        EXTWAKE_bit.EXTWAKE2 = 0;
      break;
    default:
      return 1;
  }
  return 0;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -