发现keil4中system_LPC17xx.c中PLL0的配置没有严格按照数据手册,会不会有问题呢?
版本:
* @file: system_LPC17xx.c
* @purpose: CMSIS Cortex-M3 Device Peripheral Access Layer Source File
* for the NXP LPC17xx Device Series
* @version: V1.6
* @date: 12th February 2010
PLL0的配置:
#if (CLOCK_SETUP) /* Clock Setup 使能主振动器1~20MHz */
LPC_SC->SCS = SCS_Val;
if (SCS_Val & (1 << 5)) { /* If Main Oscillator is enabled */
while ((LPC_SC->SCS & (1<<6)) == 0);/* Wait for Oscillator to be ready等待稳定*/
}
LPC_SC->CCLKCFG = CCLKCFG_Val; /* Setup Clock Divider (3+1)分频 */
LPC_SC->PCLKSEL0 = PCLKSEL0_Val; /* Peripheral Clock Selection 外设时钟 */
LPC_SC->PCLKSEL1 = PCLKSEL1_Val; /* 选择0:CCLK/4 */
LPC_SC->CLKSRCSEL = CLKSRCSEL_Val; /* Select Clock Source for PLL0主振荡器 */
#if (PLL0_SETUP)
LPC_SC->PLL0CFG = PLL0CFG_Val; /* 倍频:(0x63+1),分频:(5+1)=>Fcco=400MHZ */
LPC_SC->PLL0CON = 0x01; /* PLL0 Enable 使能不连接 */
LPC_SC->PLL0FEED = 0xAA; /* 馈送序列 */
LPC_SC->PLL0FEED = 0x55;
while (!(LPC_SC->PLL0STAT & (1<<26)));/* Wait for PLOCK0等待锁定 */
LPC_SC->PLL0CON = 0x03; /* PLL0 Enable & Connect 使能连接 */
LPC_SC->PLL0FEED = 0xAA; /* 馈送序列 */
LPC_SC->PLL0FEED = 0x55;
#endif
数据手册中推荐的是:
4.5.13 PLL0设置步骤
要对 PLL0 进行正确初始化,须按照下列步骤操作:
a)如果 PLL0 已被连接,则用一个馈送序列断开与 PLL0 的连接。
b)用一个馈送序列禁止 PLL0。
c)如果需要,可在没有 PLL0 的情况下改变 CPU时钟分频器的设置以加速操作。
d)操作“时钟源选择控制寄存器”以改变时钟源。
e)写 PLL0CFG并用一个馈送序列使其有效。PLL0CFG只能在 PLL0 被禁止时更新。
f)用一个馈送序列使能 PLL0。
g)改变 CPU时钟分频器设置,使之与 PLL0 一起操作。在连接 PLL0 之前完成这个操作是很重要的。
h)通过监控 PLL0STAT 寄存器的 PLOCK0 位,或使用 PLOCK0 中断来等待 PLL0 实现锁定。此外,当使用低频时钟作为 PLL0的输入时(也就是 32KHz),需要等待一个固定的时间。当 PLL 参考频率(REFCLK 的频率 FREF 与预分频器值分频所得的 PLL 输入频率相等)少于 100KHz 或大于 20MHz 时,PLOCK0 的值可能不稳定。在这些情况下,启动 PLL 后等待一段时间即可。当 FREF大于 400KHz时,这个时间为 500?s;当FREF少于 400KHz 时,这个时间为 200/FREF秒。
i)用一个馈送序列连接 PLL0。需要注意的是不要合并上面的任何一个步骤。例如,不能用相同的馈送序列同时更新PLL0CFG和使能 PLL0。
可以看到:
1.没有按照a步骤操作;
2.没有按照b步骤操作;
3.C-我理解就是CPU时钟配置寄存器来分频;
4.D-时钟源选择控制寄存器就是CLKSRCSEL;
5.E-就是LPC_SC->PLL0CFG = PLL0CFG_Val;
6.F-就是LPC_SC->PLL0CON = 0x01;
7.G-LPC_SC->CCLKCFG = CCLKCFG_Val; 在PLL0配置之前的时钟配置就完成了
8.H-这个是严格按照数据手册来的,就是while (!(LPC_SC->PLL0STAT & (1<<26)));
9.这个和数据手册严重不符!“例如,不能用相同的馈送序列同时更新PLL0CFG和使能 PLL0。”
看到这个问题,大家可以讨论下。没有严格按照数据手册会不会造成复位或其他情况下不能配置PLL0的问题,还有用相同的馈送序列同时更新PLL0CFG和使能 PLL0是否有效? |