找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 8801|回復(fù): 0
打印 上一主題 下一主題
收起左側(cè)

LPC11C14時(shí)鐘分頻詳解與代碼分析

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:71922 發(fā)表于 2015-1-10 20:23 | 只看該作者 回帖獎(jiǎng)勵(lì) |倒序?yàn)g覽 |閱讀模式
參考資料 : 網(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;
}

公式:





                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                   

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復(fù)

使用道具 舉報(bào)

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規(guī)則

手機(jī)版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表