热度 18
2012-8-4 17:27
3206 次阅读|
0 个评论
调试LPC1768, NXP的库好像不如Luminary的好用(大家都这么说,也就跟着人云亦云了)。对照LPC1768的手册看了看Keil例程的PLL0配置过程,记录如下: #if (CLOCK_SETUP) /* Clock Setup */ LPC_SC-SCS = SCS_Val; // 启用外部主时钟 if (SCS_Val (1 5)) { /* If Main Oscillator is enabled */ while ((LPC_SC-SCS (16)) == 0);/* Wait for Oscillator to be ready */ } //PLL倍频出来的时钟送给CPU前的分频,CCLKCFG_Val=3,为4分频 LPC_SC-CCLKCFG = CCLKCFG_Val; /* Setup Clock Divider */ LPC_SC-PCLKSEL0 = PCLKSEL0_Val; /* Peripheral Clock Selection */ LPC_SC-PCLKSEL1 = PCLKSEL1_Val; LPC_SC-CLKSRCSEL = CLKSRCSEL_Val; /* Select Clock Source for PLL0 */ #if (PLL0_SETUP) //PLL0CFG_Val = 0x00050063, 5为pre-div的值既N,所以除数为N+1=6 // 0x63为乘数M,M+1=100,记得要把16进制换算为10进制 //Fcco = 2*100*12/6 = 400,然后再除以CPU clock的4,即该设置主频为100M LPC_SC-PLL0CFG = PLL0CFG_Val; LPC_SC-PLL0CON = 0x01; /* PLL0 Enable */ //确认序列 LPC_SC-PLL0FEED = 0xAA; LPC_SC-PLL0FEED = 0x55; while (!(LPC_SC-PLL0STAT (126)));/* Wait for PLOCK0 */ LPC_SC-PLL0CON = 0x03; /* PLL0 Enable Connect */ LPC_SC-PLL0FEED = 0xAA; LPC_SC-PLL0FEED = 0x55; #endif #if (PLL1_SETUP) LPC_SC-PLL1CFG = PLL1CFG_Val; LPC_SC-PLL1CON = 0x01; /* PLL1 Enable */ LPC_SC-PLL1FEED = 0xAA; LPC_SC-PLL1FEED = 0x55; while (!(LPC_SC-PLL1STAT (110)));/* Wait for PLOCK1 */ LPC_SC-PLL1CON = 0x03; /* PLL1 Enable Connect */ LPC_SC-PLL1FEED = 0xAA; LPC_SC-PLL1FEED = 0x55; #else LPC_SC-USBCLKCFG = USBCLKCFG_Val; /* Setup USB Clock Divider */ #endif LPC_SC-PCONP = PCONP_Val; /* Power Control for Peripherals */ LPC_SC-CLKOUTCFG = CLKOUTCFG_Val; /* Clock Output Configuration */ #endif /* Determine clock frequency according to clock register values */ if (((LPC_SC-PLL0STAT 24)3)==3) {/* If PLL0 enabled and connected */ switch (LPC_SC-CLKSRCSEL 0x03) { case 0: /* Internal RC oscillator = PLL0 */ case 3: /* Reserved, default to Internal RC */ SystemFrequency = (IRC_OSC * ((2 * ((LPC_SC-PLL0STAT 0x7FFF) + 1))) / (((LPC_SC-PLL0STAT 16) 0xFF) + 1) / ((LPC_SC-CCLKCFG 0xFF)+ 1)); break; case 1: /* Main oscillator = PLL0 */ //待Pll锁定和连接后PLL0STAT中有M和N,可以计算出实际频率 SystemFrequency = (OSC_CLK * ((2 * ((LPC_SC-PLL0STAT 0x7FFF) + 1))) / (((LPC_SC-PLL0STAT 16) 0xFF) + 1) / ((LPC_SC-CCLKCFG 0xFF)+ 1)); break; case 2: /* RTC oscillator = PLL0 */ SystemFrequency = (RTC_CLK * ((2 * ((LPC_SC-PLL0STAT 0x7FFF) + 1))) / (((LPC_SC-PLL0STAT 16) 0xFF) + 1) / ((LPC_SC-CCLKCFG 0xFF)+ 1)); break; } } else { switch (LPC_SC-CLKSRCSEL 0x03) { case 0: /* Internal RC oscillator = PLL0 */ case 3: /* Reserved, default to Internal RC */ SystemFrequency = IRC_OSC / ((LPC_SC-CCLKCFG 0xFF)+ 1); break; case 1: /* Main oscillator = PLL0 */ SystemFrequency = OSC_CLK / ((LPC_SC-CCLKCFG 0xFF)+ 1); break; case 2: /* RTC oscillator = PLL0 */ SystemFrequency = RTC_CLK / ((LPC_SC-CCLKCFG 0xFF)+ 1); break; } }