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

📄 lpc_syscontrol.c

📁 IAR EWARM嵌入式系统编程与实践光盘源码
💻 C
字号:
// 定义系统初始化API函数
#include "LPC_SysControl.h"

LPC_Syscontrol_Config_t SysConfig;

/******************************************************************************
 * 说明:SYS_Init函数。初始化整个系统,建立 MEMMAP、VPB, 是否允许 PLL 和 MAM
 * 参数:   unsigned long Fosc
 *          unsigned long Fcclk
 *          LPC_SysControl_VPBDiv_t VPBDivider
 *          LPC_SysControl_RemapMode_t RemapMode
 *          unsigned long PortDir0
 *          unsigned long Port0
 *          unsigned long PortDir1
 *          unsigned long Port1
 *
 * 返回值: int
 *          0: 成功
 *          非0:错误号
 *****************************************************************************/
int SYS_Init (unsigned long Fosc, unsigned long Fcclk,
                LPC_SysControl_VPBDiv_t VPBDivider,
                LPC_SysControl_RemapMode_t RemapMode,
                unsigned long PortDir0, unsigned long Port0,
                unsigned long PortDir1, unsigned long Port1) {
unsigned long M, P_min, P_max, P, i;
int Pflag = 0, PLLflag = 0;

  // 检测是否有效
  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) {
    // 需要时计算 PLL's 值 M 和 P
    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;
  }
  // 设置全局变量
  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;

  // 锁相环 PLL
  if (PLLflag) {
    PLLCFG_bit.MSEL = M-1;      // 设置 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;     // 允许 PLL

    // 禁止中断
    PLLFEED = PLLFEED_DATA1;
    PLLFEED = PLLFEED_DATA2;

    while (!PLLSTAT_bit.PLOCK); // 等待 PLL 锁定

    PLLCON_bit.PLLC = true;     // 连接 PLL
    PLLFEED = PLLFEED_DATA1;
    PLLFEED = PLLFEED_DATA2;
  }
  else {
    PLLCON_bit.PLLC = false;
    PLLCON_bit.PLLE = false;
    PLLFEED = PLLFEED_DATA1;
    PLLFEED = PLLFEED_DATA2;
  }
  // 高级外围总线 VPB
  VPBDIV_bit.VPBDIV = VPBDivider;

  // 存储器映射 MEMAMP
  MEMMAP_bit.MAP = SysConfig.RemapMode;

  // 通用输入输出 GPIO
  PINSEL0 = PINSEL1 = 0;
  IO0SET = Port0;
  IO0CLR = ~Port0;
  IO0DIR = PortDir0;
  IO1SET = Port1;
  IO1CLR = ~Port1;
  IO1DIR = PortDir1;
  return 0;
}

/*************************************************************************
 * 说明: SYS_GetFpclk函数,获得Fpclk值
 * 参数:无
 * 返回值: int
 *          0:成功
 *          非0:错误号
 *************************************************************************/
unsigned int SYS_GetFpclk (void) {
  return SysConfig.Fpclk;
}

/*************************************************************************
 * 说明:PM_SetMode函数,设置功率管理模式
 * 参数:LPC_SysControl_PMMode_t Mode -- PM_STANDARD ,PM_IDLE or PM_POWERDOWN
 * 返回值:int
 *         0:成功
 *         非0:错误号
 *************************************************************************/
int PM_SetMode (LPC_SysControl_PMMode_t Mode) {
  PCON = Mode & 0x3;
  return 0;
}

/*************************************************************************
 * 说明:PM_OpenPeripheral函数,打开指定外围
 * 参数:lpc_uint32 DevType
 * 返回值:int
 *         0:成功
 *         非0:错误号
 *************************************************************************/
int PM_OpenPeripheral (unsigned int DevType) {
  PCONP |= DevType;
  return 0;
}

/*************************************************************************
 * 说明:PM_ClosePeripheral函数,关闭指定外围
 * 参数:lpc_uint32 DevType
 * 返回值:int
 *         0:成功
 *         非0:错误号
 *************************************************************************/
int PM_ClosePeripheral (unsigned int DevType) {
  PCONP &= (~DevType);
  return 0;
}


/*************************************************************************
 * 说明:EXTINT_Init函数,设置外部中断
 * 参数: LPC_SysControl_ExtInt_Chanel_t ExtIntNum
 *        bool WakeupEnable
 * 返回值:int
 *         0:成功
 *         非0:错误号
 *************************************************************************/
int EXTINT_Init (LPC_SysControl_ExtInt_Chanel_t ExtIntNum,
                 bool WakeupEnable) {
  switch(ExtIntNum) {
  case EXTINT0:
    PINSEL1_bit.P0_16 = 1;  // 分配外部中断引脚
    EXTINT_bit.EINT0 = 1;   // 清除中断标志
    if (WakeupEnable)       // 设置唤醒
      EXTWAKE_bit.EXTWAKE0 = 1;
    else
      EXTWAKE_bit.EXTWAKE0 = 0;
    break;
  case EXTINT1:
    PINSEL0_bit.P0_14 = 1;   // 分配外部中断引脚
    EXTINT_bit.EINT1 = 1;    // 清除中断标志
    if (WakeupEnable)        // 设置唤醒
      EXTWAKE_bit.EXTWAKE1 = 1;
    else
      EXTWAKE_bit.EXTWAKE1 = 0;
    break;
  case EXTINT2:
    PINSEL0_bit.P0_15 = 1;   // 分配外部中断引脚
    EXTINT_bit.EINT2 = 1;    // 清除中断标志
    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 + -