對於LPC2000系列,如果從XTAL1腳輸入占空比為50-50的時鐘訊號,則時鐘頻率在1~50MHz內;如果使用外部晶振,則僅支援1~30MHz的外部晶振;如果使用片內PLL系統或者引導程式(即ISP功能),輸入時鐘頻率將被限制在10~25MHz。以上是對於晶振輸出頻率(Fosc)的限制。
除了晶振輸出頻率,LPC2000還有如下幾種頻率:
Fcco PLL電流量控制震蕩器的頻率,不需太過關注
Fcclk PLL輸出頻率,也稱處理器的時鐘頻率
Fpclk VPB時鐘頻率,即為處理器與外設通訊的頻率
它們之間的關係如下:(M 、P為PLLCFG寄存器中的倍增器值與分頻器值)
Fcclk = Fosc × (M+1) M=0,1,2,…,31;Fcclk不大於60MHz
Fcco = Fosc × 2 P P=1,2,3,4;Fcco處於 156~320MHz
Fplck = Fcclk / (VPBDIV的值) VPBDIV取值1,2,4
特別注意,PLL的操作順序應該是:先將PLL啟用並等待鎖定,然後再將PLL串連。不要試圖在掉電喚醒之後簡單地執行饋送序列來重新啟動PLL,因為這會在PLL鎖定建立之前同時使能並串連PLL。
舉例:設定系統時鐘
/* 系統設定, Fosc、Fcclk、Fcco、Fpclk必須定義*/
#define Fosc 11059200 //應當與實際晶振頻率一致,10MHz~25MHz
#define Fcclk (Fosc * 4) //系統頻率,必須為Fosc的整數倍(1~32),且<=60MHZ
#define Fcco (Fcclk * 4) //CCO頻率,必須為Fcclk的2、4、8、16倍,範圍為156MHz~320MHz
#define Fpclk (Fcclk / 4) * 1 //VPB時鐘頻率,只能為(Fcclk / 4)的1、2、4倍
/* 啟動代碼中相關部分 */
PLLCON = 1; //使能PLL
#if (Fpclk / (Fcclk / 4)) == 1
VPBDIV = 0;
#endif
#if (Fpclk / (Fcclk / 4)) == 2
VPBDIV = 2;
#endif
#if (Fpclk / (Fcclk / 4)) == 4
VPBDIV = 1;
#endif
#if (Fcco / Fcclk) == 2
PLLCFG = ((Fcclk / Fosc) - 1) | (0 << 5);
#endif
#if (Fcco / Fcclk) == 4
PLLCFG = ((Fcclk / Fosc) - 1) | (1 << 5);
#endif
#if (Fcco / Fcclk) == 8
PLLCFG = ((Fcclk / Fosc) - 1) | (2 << 5);
#endif
#if (Fcco / Fcclk) == 16
PLLCFG = ((Fcclk / Fosc) - 1) | (3 << 5);
#endif
PLLFEED = 0xaa;
PLLFEED = 0x55;
while((PLLSTAT & (1 << 10)) == 0); //等待PLL鎖定
PLLCON = 3; //使能並串連PLL
PLLFEED = 0xaa; //進行有效PLL饋送後將啟用PLL
PLLFEED = 0x55;