【LPC800 系列】时钟配置及使用

NXP LPC800 系列是以 ARM Cortex_M0+ 为核心的 32 位 MCU,为微控制器应用提供了低功耗、节省空间、低引脚数的选项,目前已有 LPC80X,LPC81X,LPC83X,LPC84X 五个子系列,还有带有 NFC 接口的 LPC8N04。而当我们开始使用一款新的 MCU 时,要让 MCU 工作起来首先就要配置时钟,时钟就相当于“心脏”,本文就具体介绍 LPC800 系列的时钟配置。

一、时钟框图

如下图,这是 LPC82X 系列的时钟框图,所有的 LPC82X 的时钟模块都是一样的。


我们先来看下时钟是如何从 时钟源 开始,然后经过 倍频/分频 提供给外设的。

其实这个过程在图中很简单,首先从主时钟源选择—— MAINCLKSEL ,此时出来的时钟称之为 main clock , 然后 main clock经过分频分别作为各外设的时钟。接下来将时钟框图分为三个部分讲解,介绍如何给常用的外设进行时钟配置:


1.1
主时钟源

将框图中的第 1 部分简化一下,SYSTEM PLL 的时钟源称为 PLL IN ,SYSTEM PLL 倍频后的时钟源称为 PLL OUT,如下图所示:

由此可以清晰的看出,主时钟源主要有 4 个,分别为 MCU 内部的时钟 IRC(内部时钟频率为 12MHz),倍频前的时钟(PLL IN),看门狗振荡器,倍频后的时钟(PLL OUT)。


1.2
倍频部分

同样的,将图稍微简化一下,如下图所示:

 

倍频的时钟源有三个,分别是:内部时钟 IRC ,外部晶振(SYSTEM OSCILLATOR),外接时钟(CLKIN)。

选择了时钟源之后,PLL 会根据用户设置的值输出用户想要得到的时钟频率。

1.3各外设时钟

如下图所示, main clock 经过 SYSYAHBCLKDIV 分频之后的时钟称为 system clock,作为外设时钟;而串口的部分拥有两个分频寄存器,其中 UARTCLKDIV 就是给整个串口的时钟,第二个 则是 FRG 寄存器,是用来设置串口波特率的,这会在之后的文章——串口的配置及使用 具体介绍。还有引脚配置的时钟也是经过分频然后作为该模块时钟的。

 

二、时钟配置

接下来将以 LPC824 介绍如何根据用户手册进行时钟的配置,以达到预期的时钟频率。在这里,我们将预期的工作频率设置为 LPC824 可以支持的最高频率 30MHz 。因为一般会使用内部时钟 IRC 或者 外部晶振 作为时钟源(看门狗振荡器以及外接时钟作为时钟源也是可以的),那么配置的时候需要注意一个问题:时钟源为 12MHz( IRC的时钟频率) ,PLL 倍频器只能整数的倍频,显然是不能直接倍频到 30MHz 的,最后要达到 30MHz给其它外设的话,只能先倍频到 60MHz ,然后在 2 分频成 30MHz 给到外设。所以最后要达到 main clock = 60MHz ,system clock = 30MHz 。 


2.1
设置 PLL

PLL 可以创建比输入时钟高且稳定的时钟频率,如果需要比内部时钟 IRC 12MHz 的时钟频率,则可以使用 PLL ,而如果要用外部晶振的话,就必须通过 PLL 才能使用了。

配置步骤如下图:

  • 在 PDRUNCFG 寄存器中给 PLL 上电,才能开始工作。
  • 在 SYSPLLCLKSEL 寄存器中选择 PLL 的时钟源,可以是 IRC、外部晶振或者外接时钟。
  • 在 SYSPLLCLKUEN 寄存器中更新时钟源。
  • 在 SYSPLLCTRL 寄存器中设置 M分频器 & N 分频器。

根据用户手册中 PLL 计算公式:

也可以根据其示例:

得出分频器设置值如下:

MSEL=0x4 ,PSEL=0x1。

需要注意的是 MSEL 的分频值是编程的 MSEL 值 + 1。

  • 在 SYSPLLSTAT 寄存器中监控 PLL 状态,等待它锁定。

到此,PLL 的设置就完成啦,对于已经写好的代码,需要根据具体情况进行修改的地方主要有2 个:第一个就是 PLL 的时钟源选择部分,第二个就是设置 M\N 分频器的部分。

 

2.2使用外部晶振

外部晶振的使用也很常见,LPC82X 的时钟框图中外部晶振称之为 SYSTEM OSCILLATOR——系统振荡器,不管哪种封装,其外部晶振的输入输出引脚都固定为 PIO0_8(XTALIN) & PIO0_9(XTALOUT),在使用外部晶振前,需要移除两个引脚的上下拉功能。

配置步骤如下图:

  • 在 PIO0_8 & PIO0_9 寄存器中选择引脚模式为“无上下拉功能”。
  • 在 PINENABLE0 寄存器中使能 XTALIN & XTALOUT。

该寄存器位于 开关矩阵(SWM)模块中,故使用之前需要开启SWM 的时钟,并在使能这两位之后关闭 SWM 的时钟,关闭的目的是节能。



  • 在 SYSOSCCTRL 寄存器中禁用 BYPASS 位和选择振荡器的时钟频率


2.3
配置 main clock & system clock

所需要的时钟频率在前面两步当中已经设置好了,接下来就是选择主时钟——main clock 了。

配置步骤如下图:

  • 在 MAINCLKSEL 寄存器中选择时钟源。
  • 在 MAINCLKUEN 寄存器中更新主时钟源。
  • 在 SYSAHBCLKDIV 寄存器中选择 系统时钟——system clock 的分频系数,以达到我们预期的时钟频率:30MHz 。

此处分频系数设置为 2 ,DIV=2。

  • 在 SYSAHBCLKCTRL 寄存器中开启 需要处于工作状态的存储器和外设 的时钟。

这一步根据具体需求选择,比如开启最常用的 GPIO 模块。

 

三、实战演练

接下里将通过具体的 hands-on来实现 LPC824 的时钟配置,功能则是可以选择内部时钟 IRC 或者 外部晶振(12MHz)作为时钟源,设置 main clock = 60MHz 和 system clock = 30MHz ,通过官方 SDK 中的库函数返回其两个时钟频率,再用串口打印出来,验证配置是否成功。

  

3.1使用外部晶振的代码

 


3.2
使用内部时钟 IRC 的代码

 


将这两部分封装成一个函数,利用宏定义的方法进行选择使用哪个时钟源,然后在主函数中调用该函数即可,代码如下:

 

 

 

3.3 在 main 函数中调用

用封装的函数代替原来例程中的时钟配置部分的函数,其它初始化不变,如下图:

 

串口打印结果如下图,可以看出与预期的频率一致。



参考资料

  1. 《LPC82X User Manual》

用户手册包含了外设配置方法,由 NXP 官网提供下载,链接如下:

6https://www.nxp.com.cn/products/processors-and-microcontrollers/arm-microcontrollers/general-purpose-mcus/lpc800-cortex-m0-plus-/low-cost-microcontrollers-mcus-based-on-arm-cortex-m0-plus-cores:LPC82X?fpsp=1&tab=Documentation_Tab

  1. LPC824 官方 SDK 包

SDK 包里包含了许多例程,由 NXP 官网提供下载,链接如下:

https://mcuxpresso.nxp.com/en/builder

 

 

 

★博文内容均由个人提供,与平台无关,如有违法或侵权,请与网站管理员联系。

★文明上网,请理性发言。内容一周内被举报5次,发文人进小黑屋喔~

评论