LPC11xx 系列-时钟详解

LPC11xx 系列-时钟详解

注:本文是从一个网站上看的内容,后整理出了这份。 原创是哪位,我已经找不到了。 如果有侵权,请及时告知。 我会删除。(这篇文章整理自 2018年。 当时没有Markdown编辑器。 今日重新编辑了一遍)

一、 时钟产生单元在这里插入图片描述

二、系统初始化

void SystemInit (void)
{
  uint32_t i;
  
/* SYSMEMREMAP 系统存储器重映射寄存器 */
#ifdef __DEBUG_RAM                // 如果是调试模式    
  // 用户RAM模式,中断向量被重新映射到静态ROM
  LPC_SYSCON->SYSMEMREMAP = 0x1;                /* remap to internal RAM */ 
#else
  // 用户Flash模式,中断向量不会被映射,一直位于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);         // 系统振荡器上电 写0上电 写1掉电 默认掉电 
  /* Wait 200us for OSC to be stablized, no status 
  indication, dummy wait. */
  for ( i = 0; i < 0x100; i++ );                 // 等待振荡器稳定

  Main_PLL_Setup();            // 倍频PLL锁相环,设置主时钟

  /* 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 配置块时钟
  return;
}

三、 锁相环作用

void Main_PLL_Setup ( void ) 主要做三件事:

1、设置PLL的时钟来源为12MHz晶振,再倍频PLL为48Mhz

2、设置主时钟频率为倍频后的频率 即48Mhz

3、设置AHB时钟预分频值

四、锁相环的具体实现

void Main_PLL_Setup ( void )
{
  // uint32_t regVal;
  /* 先倍频PLL,再让主时钟选择倍频后的PLL 频率 */
  ClockSource = OSC_CLK;        
  // 系统PLL时钟来源:IRC振荡器bit:00、系统振荡器(晶振)bit:01、看门口振荡器 bit:10                                                   
  LPC_SYSCON->SYSPLLCLKSEL = MAIN_CLKSRCSEL_Val;    /* Select system OSC PLL时钟源选择系统振荡器 即外部12M晶振*/
  LPC_SYSCON->SYSPLLCLKUEN = 0x01;                  /* Update clock source 更新PLL选择时钟源 */
  LPC_SYSCON->SYSPLLCLKUEN = 0x00;                  /* toggle Update register once 先写0再写1 达到更新时钟源的目的*/
  LPC_SYSCON->SYSPLLCLKUEN = 0x01;                                           
  while ( !(LPC_SYSCON->SYSPLLCLKUEN & 0x01) );     /* Wait until updated 等待时钟源更新完毕后向下执*/

// 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

  /* 计算公式
        模式 1(普通模式)
        在这种模式下使能后置分频器,占空比时钟为 50%,频率关系如下:
        Fclkout=M×Fclkin=(FCCO)/(2×P)  ---> 输出频率 = M * 输入频率 = (156Mhz~320Mhz)/ (2*P)        (1)
        为了选择合适的 M 和 P 值,推荐如下步骤:
        第 1 步:指定输入时钟频率 Fclkin;
        第 2 步:计算 M 值以获得所需的输出频率 Fclkout,M=Fclkout/Fclkin;
        第 3 步:找出一个值使得 FCCO=2×P×Fclkout;
        第 4 步:检查所有的频率和分频器值是否符合表 3.5 的限定。
  */

  // LPC1114允许最大工作频率为50Mhz 50/12 = 4.1666 所以M值只能为4才不会超过50Mhz => 12*4 =48Mhz
  // FCCO的频率范围 156Mhz~320Mhz         320/2/48 = 3 P值没有3 所有P值只能为 2 =>  48*2*2 = 192Mhz
  LPC_SYSCON->SYSPLLCTRL = 0x23; //设置倍频 为48Mhz

  /* Enable main system PLL, main system PLL bit 7 in PDRUNCFG. */
  LPC_SYSCON->PDRUNCFG &= ~(0x1<<7);                                  // PLL 上电        写0上电 写1掉电 默认掉电
  while ( !(LPC_SYSCON->SYSPLLSTAT & 0x01) );                                /* Wait until it's locked 等待PLL锁定成功*/

  // 主时钟频率可以选择四种 IRC振荡器00、PLL倍频前01、看门狗振荡器10、PLL倍频后11
  LPC_SYSCON->MAINCLKSEL = 0x03;                                /* Select PLL clock output 主时钟源选择PLL倍频后的时钟*/
  LPC_SYSCON->MAINCLKUEN = 0x01;                        /* Update MCLK clock source 更新主时钟源*/
  LPC_SYSCON->MAINCLKUEN = 0x00;                        /* Toggle update register once 先写0 再写1 达到更新时钟源的目的*/
  LPC_SYSCON->MAINCLKUEN = 0x01;
  while ( !(LPC_SYSCON->MAINCLKUEN & 0x01) );        /* Wait until updated 等待主时钟锁定成功后向下执行*/

  // AHB时钟分频值为1 即主时钟除以1 相当于没有分频率 ,给GPIO、内核、存储器、APB提供时钟频率
  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;
}

附:计算公式

在这里插入图片描述

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值