轻松配置LPC175x系统时钟

分享到:

LPC175x作为NXP公司主推的cortex-M3内核芯片,广泛应用于各工控、电子计量、报警系统等领域,无论何种应用,根据实际需求选择合适的时钟源并配置合理的系统时钟频率都是必不可少的。
振荡器

以EasyARM-1754M3开发板为例,LPC1754芯片外部晶体振荡器包含两个,一个频率为12MHz外部高速晶振和一个频率为32.768KHz的外部低速晶振,两个都可以使用软件设置选用或不选用。此外LPC1754内部也包含三个独立的振荡器,他们分别是内部主振荡器,内部RC振荡器和内部RTC振荡器。实际应用当中常用的振荡器是外部高速晶体振荡器,和外部低速晶体振荡器。

LPC1754内部PLL0原理简介

PLL0包含多个寄存器,其中PLL0时钟源的选择可在CLKSRCSEL寄存器中设置,PLL0将输入时钟进行倍频,然后再分频为CPU及芯片外设提供实时时钟信号。PLL0可产生的时钟频率最高可达100MHz,是CPU所允许的最大值。

PLL0内部结构可表示为下图,PLL0的输出时钟信号即为pllclk,后经过CPU时钟分频器的分频,产生系统时钟,系统时钟再进入外设时钟分频器后输出多路的外设时钟。

QQ截图20171018190244
应用举例

EasyARM-1754M3开发板配套的所有例程使用统一的系统初始化函数SystemInit()将系统时钟配置为96MHz,外设时钟配置为默认值24MHz。用户可在对此函数有一定理解的条件下,根据自身实际需求,对参数进行修改,可修改项一般包含时钟源、倍频系数、分配系数三个重要参数,系统初始化函数当中的PLL0配置部分如下程序清单所示:
#if (CLOCK_SETUP)                                        /* Clock Setup                    */
  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;             /* 系统时钟分频值,CCLKCFG_Val值可改 */
  LPC_SC->PCLKSEL0  = PCLKSEL0_Val;                    /* Peripheral Clock Selection        */
  LPC_SC->PCLKSEL1  = PCLKSEL1_Val;
  LPC_SC->CLKSRCSEL = CLKSRCSEL_Val;           /* 选取时钟源,CLKSRCSEL_Val值可改  */
#if (PLL0_SETUP)
  LPC_SC->PLL0CFG   = PLL0CFG_Val;              /*PLL0倍频值,PLL0CFG_Val值可改     */
  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
  LPC_SC->PCONP     = PCONP_Val;                         /* Power Control for Peripherals    */
  LPC_SC->CLKOUTCFG = CLKOUTCFG_Val;                   /* Clock Output Configuration     */
#endif

其中关键参数为PLL0倍频系数PLL0CFG_Val、CPU时钟分频系数CCLKCFG_Val,由于寄存器值比实际值小1,因此它们实际值为16和4。另外每次想PLL0相关寄存器写入新的数值时,需要向馈送寄存器当中写入馈送系列以后才能生效,通常是将0xAA和0x55先后写入PLLxFEED寄存器。

将相关参数准备好之后,就要根据参数配置,判断选中的时钟源,并通过计算得出最后的系统时钟频率。在选用外部12MHz时钟源的条件下,程序会跳转到CASE1的位置运行,并结合此前所给参数,计算出系统时钟频率CCLK=12M×2×16/1/4=96MHz。

     case 1:                                                /* Main oscillator => PLL0        */
        SystemFrequency = (OSC_CLK *
              ((2 * ((LPC_SC->PLL0STAT & 0x7FFF) + 1))) /    /*PLL0STAT的低15位是15,倍频值*/
              (((LPC_SC->PLL0STAT >> 16) & 0xFF) + 1)  /    /*PLL0STAT的16~23位是0,分频值*/
              ((LPC_SC->CCLKCFG & 0xFF)+ 1));            /*CCLKCFG是系统分频值,3       */
        break;

又例如使用32.768KHz的外低速晶振作为时钟源,并同样产生96MHz的系统时钟,只需将CLKSRCSEL_Val、CCLKCFG_Val、PLL0CFG_Val分别改为0x02、0x02、0x1127(4391)即可,含义分别是选择外部低速晶振,系统分频为3(寄存器值比实际值小1),PLL0倍频值为4392(而PLL0分频值不设,默认为0),计算:32.768×2×4392÷3=95944.704KHz,
约为96MHz。

时钟配置注意事项

在整个代码编写过程中要格外注意对馈送寄存器PLLxFEED的操作,要严格遵循0xAA和0x55先后写入的顺序。另外要确保执行写入馈送序列时,不会出现任何一个中断服务程序,即在执行PLL0馈送操作时,必须禁止中断,如果写入的值不正确、或者没有满足无中断发生的条件,那么对PLL0CFG寄存器的更改都不会生效。

在根据自身需求配置所需系统时钟频率时,往往会使用仿真器的Debug功能,观测相关参数,以验证时钟频率配置的正确与否。但不能在执行PLL0馈送操作时,设置任何断点,否侧同样无法使配置生效。

继续阅读
Kinetis启动分析

在对Kinetis 系列MCU开发应用程序或编写硬件模块的驱动程序之前,我们需要对其启动流程有所了解,对于像ARM这类的复杂的32位片上系统来说,在启动代码部分,需要通过软件对一些硬件资源进行配置和设置一定的工作状态,这样我们就不得不去认真的去了解它了。

从多方面分析NXP的S32平台为何如此厉害?

众所周知,汽车是各种应用和不同软件策略构成的复杂综合体。据汽车行业的估计,一辆高端现代化汽车的软件代码行数超过1亿行,相比之下,波音787才不过使用了2-3千万行代码……

厉害了,i.MX 6ULL系列的A7 MPU性能强劲

现今,NXP主要针对汽车、消费电子等专门设计的一款基于ARM® Cortex® A7内核的I.MX 6ULL系列高性能、高可靠、低功耗的应用处理器,并且最高主频可达900MHz,内部还集成有电源管理模块和128 KB L2缓存;此外,i.MX6ULL集成功能经过优化且成本最具有竞争力,符合物联网网关、终端节点和消费类电子产品的要求。

恩智浦是如何打造中国汽车生态系统的?

我依然记得NXP CEO Rick Clemmer几年前在接受《电子工程专辑》专访时说的话,他说“今日的恩智浦实际上更像是一家中国公司。”而当再次和恩智浦执行副总裁兼汽车事业部总经理Kurt Sievers谈起此事时,他笑着说,“的确如此,这句话时至今日依然奏效。”

关于S32K系列汽车级MCU,NXP工程师给出的10个小tips

S32K144是NXP推出的基于ARM Cortex-M4F内核的汽车级通用MCU系列S32K1xx的第一颗高性能单片机。本文首先简要介绍S32K系列MCU的内核和片上资源信息,然后列出S32K软件开发和硬件设计FAQ,供大家参考。