锐单电子商城 , 一站式电子元器件采购平台!
  • 电话:400-990-0325

LPC1114_时钟系统解析

时间:2024-05-26 22:37:11

一般我们在main()的开始部分都需要进行时钟的初始化,根据需要可以选择时钟源、是否开启PLL倍频、以及PLL配置达到所需要的输出时钟,然后再选择倍频后的时钟作为主时钟源。

如下图:需要注意几个时钟的概念,



#define CLOCK_SETUP           1#define MAIN_PLL_SETUP        1#define MAIN_CLKSRCSEL_Val    0x00000001#define MAIN_PLL_M_Val        0x00000003#define MAIN_PLL_P_Val        0x00000001#define SYS_AHB_DIV_Val       1   /* 1 through 255, typical is 1 or 2 or 4 */#define XTAL        (12000000UL)        /* Oscillator frequency               */#define OSC_CLK     (      XTAL)        /* Main oscillator frequency          */#define IRC_OSC     (12000000UL)        /* Internal RC oscillator frequency   */#define WDT_OSC     (  250000UL)        /* WDT oscillator frequency           */uint32_t ClockSource = IRC_OSC;uint32_t SystemFrequency = IRC_OSC; /*!< System Clock Frequency (Core Clock)  */uint32_t SystemAHBFrequency = IRC_OSC;void Main_PLL_Setup ( void ){  uint32_t regVal;  ClockSource = OSC_CLK;  LPC_SYSCON->SYSPLLCLKSEL = MAIN_CLKSRCSEL_Val;   /* Select system OSC--系统振荡器 */  LPC_SYSCON->SYSPLLCLKUEN = 0x01;                 /* Update clock source */  LPC_SYSCON->SYSPLLCLKUEN = 0x00;                 /* toggle Update register once */  LPC_SYSCON->SYSPLLCLKUEN = 0x01;  while ( !(LPC_SYSCON->SYSPLLCLKUEN & 0x01) );    /* Wait until updated */  regVal = LPC_SYSCON->SYSPLLCTRL;  regVal &= ~0x1FF;  LPC_SYSCON->SYSPLLCTRL = (regVal | (MAIN_PLL_P_Val<<5) | MAIN_PLL_M_Val);/* P=1, M=4 FCLKOUT=12*4=48Mhz */   /* Enable main system PLL, main system PLL bit 7 in PDRUNCFG. */  LPC_SYSCON->PDRUNCFG &= ~(0x1<<7);              /* PDRUNCFG第七位写0,即系统PLL上电 */  while ( !(LPC_SYSCON->SYSPLLSTAT & 0x01) );     /* Wait until it's locked 确定PLL定以后向下执行 */  LPC_SYSCON->MAINCLKSEL = 0x03;                /* Select PLL clock output--选择PLL输出作为主时钟 */  LPC_SYSCON->MAINCLKUEN = 0x01;                /* Update MCLK clock source --允许更新主时钟*/  LPC_SYSCON->MAINCLKUEN = 0x00;                /* Toggle update register once */  LPC_SYSCON->MAINCLKUEN = 0x01;  while ( !(LPC_SYSCON->MAINCLKUEN & 0x01) );     /* Wait until updated 确定主时钟锁定以后向下执行 */  LPC_SYSCON->SYSAHBCLKDIV = SYS_AHB_DIV_Val;     /* SYS AHB clock, typical is 1 or 2 or 4 --SYSAHBCLKDIV的值为1,即不分频 使AHB时钟设置为48Mhz */#if MAIN_PLL_SETUP  SystemFrequency = ClockSource * (MAIN_PLL_M_Val+1);#else  SystemFrequency = ClockSource;#endif  SystemAHBFrequency = (uint32_t)(SystemFrequency/SYS_AHB_DIV_Val);  return;}/** * Initialize the system * * @param  none * @return none * * @brief  Setup the microcontroller system. *         Initialize the System and update the SystemFrequency variable. */void SystemInit (void){  uint32_t i;#ifdef __DEBUG_RAM     LPC_SYSCON->SYSMEMREMAP = 0x1;  /* remap to internal RAM */#else#ifdef __DEBUG_FLASH     LPC_SYSCON->SYSMEMREMAP = 0x2;  /* remap to internal flash */#endif#endif#if (CLOCK_SETUP)                       /* Clock Setup */  /* bit 0 default is crystal bypass,  bit1 0=0~20Mhz crystal input, 1=15~50Mhz crystal input. */  LPC_SYSCON->SYSOSCCTRL = 0x00;  /* main system OSC run is cleared, bit 5 in PDRUNCFG register */  LPC_SYSCON->PDRUNCFG &= ~(0x1<<5);    /* PDRUNCFG的第五位写0,即系统系统振荡器上电 */  /* Wait 200us for OSC to be stablized, no status  indication, dummy wait. */  for ( i = 0; i < 0x100; i++ );#if (MAIN_PLL_SETUP)  Main_PLL_Setup(); #endif#endif /* endif CLOCK_SETUP */  /* System clock to the IOCON needs to be enabled or  most of the I/O related peripherals won't work. */  LPC_SYSCON->SYSAHBCLKCTRL |= (1<<16);                  //使能IO模块的时钟  return;}

-电子元器件采购网(www.ruidan.com)是本土元器件目录分销商,采用“小批量、现货、样品”销售模式,致力于满足客户多型号、高质量、快速交付的采购需求。 自建高效智能仓储,拥有自营库存超过50,000种,提供一站式正品现货采购、个性化解决方案、选型替代等多元化服务。
锐单商城拥有海量元器件数据手册IC替代型号,打造电子元器件IC百科大全!

相关文章