|
參考資料 : 網(wǎng)絡(luò)文摘 -> ARM時(shí)鐘詳解-LPC11XX.s時(shí)鐘

void SystemInit (void)
{
uint32_t i;
/* SYSMEMREMAP 系統(tǒng)存儲器重映射寄存器 */
#ifdef __DEBUG_RAM // 如果是調(diào)試模式
// 用戶RAM模式,中斷向量被重新映射到靜態(tài)ROM
LPC_SYSCON->SYSMEMREMAP = 0x1; /* remap to internal RAM */
#else
// 用戶Flash模式,中斷向量不會(huì)被映射,一直位于Flash
LPC_SYSCON->SYSMEMREMAP = 0x2; /* remap to internal flash */
#endif
// 振蕩器未被旁路(讓它不起作用)bit0=0,外部晶振頻率為1~20Mhz范圍bit1=0
LPC_SYSCON->SYSOSCCTRL = 0x00;
/* main system OSC run is cleared, bit 5 in PDRUNCFG register */
LPC_SYSCON->PDRUNCFG &= ~(0x1<<5); // 系統(tǒng)振蕩器上電 寫0上電 寫1掉電 默認(rèn)掉電
/* Wait 200us for OSC to be stablized, no status
indication, dummy wait. */
for ( i = 0; i < 0x100; i++ ); // 等待振蕩器穩(wěn)定
Main_PLL_Setup(); // 倍頻PLL鎖相環(huán),設(shè)置主時(shí)鐘
/* 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 配置塊時(shí)鐘
return;
}
void Main_PLL_Setup ( void ) 主要做三件事:
1、設(shè)置PLL的時(shí)鐘來源為12MHz晶振,再倍頻PLL為48Mhz
2、設(shè)置主時(shí)鐘頻率為倍頻后的頻率 即48Mhz
3、設(shè)置AHB時(shí)鐘預(yù)分頻值
void Main_PLL_Setup ( void )
{
// uint32_t regVal;
/* 先倍頻PLL,再讓主時(shí)鐘選擇倍頻后的PLL 頻率 */
ClockSource = OSC_CLK;
// 系統(tǒng)PLL時(shí)鐘來源:IRC振蕩器bit:00、系統(tǒng)振蕩器(晶振)bit:01、看門口振蕩器 bit:10
LPC_SYSCON->SYSPLLCLKSEL = MAIN_CLKSRCSEL_Val; /* Select system OSC PLL時(shí)鐘源選擇系統(tǒng)振蕩器 即外部12M晶振*/
LPC_SYSCON->SYSPLLCLKUEN = 0x01; /* Update clock source 更新PLL選擇時(shí)鐘源 */
LPC_SYSCON->SYSPLLCLKUEN = 0x00; /* toggle Update register once 先寫0再寫1 達(dá)到更新時(shí)鐘源的目的*/
LPC_SYSCON->SYSPLLCLKUEN = 0x01;
while ( !(LPC_SYSCON->SYSPLLCLKUEN & 0x01) ); /* Wait until updated 等待時(shí)鐘源更新完畢后向下執(zhí)*/
// regVal = LPC_SYSCON->SYSPLLCTRL;
// regVal &= ~0x1FF; // 清空0 - 8 位
// LPC_SYSCON->SYSPLLCTRL = (regVal | (MAIN_PLL_P_Val<<5) | MAIN_PLL_M_Val); // P=0 M=3
/* 計(jì)算公式
模式 1(普通模式)
在這種模式下使能后置分頻器,占空比時(shí)鐘為 50%,頻率關(guān)系如下:
Fclkout=M×Fclkin=(FCCO)/(2×P) ---> 輸出頻率 = M * 輸入頻率 = (156Mhz~320Mhz)/ (2*P)
(1)
為了選擇合適的 M 和 P 值,推薦如下步驟:
第 1 步:指定輸入時(shí)鐘頻率 Fclkin;
第 2 步:計(jì)算 M 值以獲得所需的輸出頻率 Fclkout,M=Fclkout/Fclkin;
第 3 步:找出一個(gè)值使得 FCCO=2×P×Fclkout;
第 4 步:檢查所有的頻率和分頻器值是否符合表 3.5 的限定。
*/
// LPC1114允許最大工作頻率為50Mhz 50/12 = 4.1666 所以M值只能為4才不會(huì)超過50Mhz => 12*4 =48Mhz
// FCCO的頻率范圍 156Mhz~320Mhz 320/2/48 = 3 P值沒有3 所有P值只能為 2 => 48*2*2 = 192Mhz
LPC_SYSCON->SYSPLLCTRL = 0x23; //設(shè)置倍頻 為48Mhz
/* Enable main system PLL, main system PLL bit 7 in PDRUNCFG. */
LPC_SYSCON->PDRUNCFG &= ~(0x1<<7); // PLL 上電 寫0上電 寫1掉電 默認(rèn)掉電
while ( !(LPC_SYSCON->SYSPLLSTAT & 0x01) ); /* Wait until it's locked 等待PLL鎖定成功*/
// 主時(shí)鐘頻率可以選擇四種 IRC振蕩器00、PLL倍頻前01、看門狗振蕩器10、PLL倍頻后11
LPC_SYSCON->MAINCLKSEL = 0x03; /* Select PLL clock output 主時(shí)鐘源選擇PLL倍頻后的時(shí)鐘*/
LPC_SYSCON->MAINCLKUEN = 0x01; /* Update MCLK clock source 更新主時(shí)鐘源*/
LPC_SYSCON->MAINCLKUEN = 0x00; /* Toggle update register once 先寫0 再寫1 達(dá)到更新時(shí)鐘源的目的*/
LPC_SYSCON->MAINCLKUEN = 0x01;
while ( !(LPC_SYSCON->MAINCLKUEN & 0x01) ); /* Wait until updated 等待主時(shí)鐘鎖定成功后向下執(zhí)行*/
// AHB時(shí)鐘分頻值為1 即主時(shí)鐘除以1 相當(dāng)于沒有分頻率 ,給GPIO、內(nèi)核、存儲器、APB提供時(shí)鐘頻率
LPC_SYSCON->SYSAHBCLKDIV = SYS_AHB_DIV_Val; /* SYS AHB clock, typical is 1 or 2 or 4 */
SystemFrequency = ClockSource * (MAIN_PLL_M_Val+1); // (12000000UL) * (3 + 1)
SystemAHBFrequency = (uint32_t)(SystemFrequency/SYS_AHB_DIV_Val); // 保存該值,以備用 SYS_AHB_DIV_Val = 1
return;
}
公式:

|
|