Cotex-M3内核LPC17xx系列时钟及其配置方法

一、背景:

  最近正在接手一个项目,核心芯片既是LPC17XX系列MCU,内核为ARM的Cotex-M3内核。

  想要玩转一个MCU,就一定得搞定其时钟!

  时钟对MCU而言,就好比人类的心脏。由其给AHB、APB总线供给血液(时钟频率),而挂在AHB(Advance High Bus)总线上的器件就像是我们的各个器官,挂在APB(Adance Peripheral Bus)总线的外设就像是人类的四肢。各个器官和四肢只有在你的血液(时钟频率)供给恰到好处时才能正常运转。

  本篇文章既是对LPC17xx系列的时钟结构及其配置方法做个介绍与总结。

二、正文:

  二话不说,先上一张LPC17xx时钟。

  由图所示,MCU最原始的时钟动力来自于上图三个地方之一,

    osc_clk-->由外接在”XTAL1”,”XTAL2”的晶振来提供时钟源;

    rtc_clk-->由外接在”RTCX1”,”RTCX2”的晶振来提供时钟源;

    irc_osc-->由MCU内部自带的晶振来提供时钟源。

  该三个时钟分别给主PLL(PLL0),PLL1,看门狗提供时钟。如图所示,

  供给CPU的时钟由主PLL(PLL0)或者直接由三个晶振源之一来提供;

  供给USB的时钟由主PLL(PLL0)或者PLL1提供;

  供给看门狗的时钟由”rtc_clk” 或者 “irc_osc”提供时钟。

  接下来该说如何配置时钟了:

  1、 配置CPU时钟(CCLK) :

  CPU时钟CCLK若是由PLL0提供的,那么PLL0会先将供给它的时钟进行升频,升频之后,再降频供CPU使用,即CCLK,至于为何要先升频再降频,暂时未知,

  也许单纯的是PLL的工作机制吧。以下即配置CPU时钟(CCLK)的具体过程:

  a、 描述主振荡器——即主振荡器大小范围多少,有没有稳定等,配置的寄存器为“SCS”。

  b、 配置外设时钟:

  这里要注意!按照正常思维顺序走的话,“b”这一步应该在所有步骤之后,,但是LPC17xx系列的MCU规定,在enable PLL0前,要先把外设时钟配置完成,

  所以,要先配置外设时钟。

  那么,什么是外设时钟呢?

  PLL0升频再降频后,会生成一个CCLK时钟供CPU使用。该CCLK再次经过分频供所有外设使用。

  外设时钟的配置,既是配置各个外设的时钟大小(即对CCLK几分频)。

  每个系列CCLK均有其最大工作频率,以不超过该最大工作频率为准,配置的降频(分频)大小的寄存器为“CCLKCFG”。

  配置外设时钟的寄存器分别为“PCLKSEL0/1”

  在配置外设时钟前,先考虑由PPL0升频多少降频多少才可得到想要的CCLK值,而这实际上是“d”步骤考虑的,所以此处的逻辑会有点乱。

  在阅读过程中,可跳过该步骤,直接看“c”步骤,最后跳回来看“b”步骤,但实际操作得按该步骤来。

  c、  从这三个振荡器选择供给PLL0的时钟,配置的寄存器为“CLKSRCSEL”。

  d、 配置“PLL0CFG”寄存器,来设置PLL0升频值及降频值的大小,寄存器截图如下:

  M即是倍频值,N即分频值,当使用晶振源为”rtc_clk”时,M值参照表4.8所建议的值。

  PLL0计算方法如下图:

    

    计算PLL0时,各个计算变量参数的意义如下图:

    

  e、 最后使能PLL0时钟并选择是否选用PLL0作为CCLK的输入时钟,操作的寄存器为“PLL0CON”

  f、  举个例子:MCU外接晶振为12MHZ,我需要CPU工作在频率100MHZ。那么根据式子,M = 100, N = 6。

  Fcco = (2 * 100 * 12MHZ) / 6 =400MHZ。然后4分频,最后得到CCLK为100MHZ。

  配置代码如下:

  

#if (PLL0_SETUP)
  LPC_SC->PLL0CFG   = 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

  2、 USB时钟的配置:

  如整体时钟图示,USB时钟只能由PLL0或者PLL1提供,并且!若USB时钟由PLL0提供,那么PLL0的时钟源必须是外部 晶振!

  USB需要一个占空比为50%的48MHZ的时钟源,也就是说,PLL1或者PLL0分频出来的时钟Fcco必须为48MHZ的偶数倍数,以便为USB提供合适的时钟。

  A、 若由PLL0提供,那么由“1”步骤配置完PLL0,通过USB分频器获得满足条件的USB时钟即可。

  举个例子:USB的CLK要求为48MZH,那么PLL0主频配置为48MHZ的偶数倍,然后通过USB时钟分频器分频,来获得符合要求的时钟。

  B、 若由PLL1提供,那么就得说说PLL1是如何配置的:

  a、 PLL1仅支持10MHZ到25MHZ范围内的时钟输入,且只能是外部时钟源,所以时钟源不用选择;

  b、 设置PLL1的“M”值与“P值”,PLL1类似于PLL0,也是会有一个先升频后降频的过程,但可以看出PLL1算是USB的一个特供时钟源,

  所以每个值的限制条件会比较多。

  PLL1输出频率的公式:

  

  Fcco频率可按如下公式计算:

  

  总结:

  Fosc(时钟源)的频率范围必须为10MHZ~25MHZ,

  USBCLK必须为48MHZ,

  Fcco的范围为:156MHZ~320MHZ;

  举个例子:

  输入的外部晶振为12MHZ,配置“M”的值为4,“P”的值为2,按公式计算可得PLL1升频后为192MHZ,然后分频到48MHZ供给USB使用。

PLL1配置代码如下:

#if (PLL1_SETUP)
  LPC_SC->PLL1CFG   = PLL1CFG_Val;
  LPC_SC->PLL1CON   = 0x01;             /* PLL1 Enable                        */
  LPC_SC->PLL1FEED  = 0xAA;
  LPC_SC->PLL1FEED  = 0x55;
  while (!(LPC_SC->PLL1STAT & (1<<10)));/* Wait for PLOCK1                    */

  LPC_SC->PLL1CON   = 0x03;             /* PLL1 Enable & Connect              */
  LPC_SC->PLL1FEED  = 0xAA;
  LPC_SC->PLL1FEED  = 0x55;
#else
  LPC_SC->USBCLKCFG = USBCLKCFG_Val;    /* Setup USB Clock Divider            */
#endif

  3、 看门狗wd_clk还未使用,下次要配时,再做记录。

三、总结:

  不论是cotex-m3内核的LPC17xx系列、STM32系列,还是更高阶的arm9,arm11也好,时钟才是是摸透它们的最佳切入点。

  就实际使用来说,使用MCU既是使用各种外设,或者实现各种通信。不论何种外设,UART、IIC、CAN、USB等,

  其能正确工作的关键就在于要给定正确合适的时钟。时钟的选法就采用MCU芯片手册上的时钟图来倒推回去,首先根据外设的需求确定外设时钟,

  接着考虑CPU的时钟,然后在反推到最初的时钟源的选择。

  完毕,在此做个记录,以便下次参考。

记录地点:深圳WZ

记录时间:2016年6月3日

时间: 2024-08-26 14:36:11

Cotex-M3内核LPC17xx系列时钟及其配置方法的相关文章

STM32F2系列时钟的配置

前一节详细介绍了系统默认的时钟配置,及各路时钟输出是多少,这是默认配置的,但实际使用的时钟默认的时钟并不符合要求,所以就得知道如何调用库函数进行配置. 最好的资料就是查阅stm32f2xx_rcc.c文件,里面有各种功能函数,并有详细的注释,这让我们这样的新手上手是非常快的. //VCO = PLL input clock(HSE or HSI)/PLLM //倍频电压后值V = VCO * PLLN //sysclk = V / PLLP //PLL48CK = V / PLLQ #defin

STM32F7系列时钟相关问题:HSE模式配置(旁路模式、非旁路模式

从时钟源的角度,分为两类外部时钟(E)和内部时钟(I). 从时钟速率的角度,分为两类高速时钟(HS)和低速时钟(LS).而把它们组合起来就有四种时钟:HSE.HIS.LSE.LSI.至于为什么会有这么复杂的时钟配置,主要是考虑到系统的性能和功耗两个方面的因素吧.单一时钟的话可能会导致性能过剩并且功耗过高.多个时钟的话可以平衡功耗和性能之间的平衡.特此说明一下,系统复位后,默认初始化的是HIS时钟提供sysclock.也就是16MHZ.为了提示系统性能,我们需要使能外部时钟晶振(板载25MHz).

Spartan6系列之芯片配置模式详解

1.   配置概述 Spartan6系列FPGA通过把应用程序数据导入芯片内部存储器完成芯片的配置.Spart-6 FPGA可以自己从外部非易失性存储器导入编程数据,或者通过外界的微处理器.DSP等对其进行编程.对以上任何一种情况,都有串行配置和并行配置之分,串行配置可以减少芯片对引脚的要求,并行配置对8bit/16bit Flash或者微处理器来说更合适. 因为Xilinx的FPGA器件的配置数据存储在CMOS 配置锁存器内(CCL),因此Spartan6 FPGA器件上电后必须重新配置.Sp

Windows内核原理系列01 - 基本概念

1.Windows API Windows 应用编程接口(API)是针对WIndwos操作系统用户模式的系统编程接口,包含在WindwosSDK中. 2.关于.NET .NET由一个被称为FCL的类库和一个被称为CLR的公共语言运行库组成.FCL是建立在CLR之上的,而CLR是一组标准的COM服务器,提供了垃圾回收,即时编译类型检验等特性.由于CLR的这些特性,使得开发人员的生产效率得以提高..NET框架与组建的关系如下: .NET应用程序 用户模式(托管代码) —————————— 类库(FC

[Java系列1]Eclipse配置,常用插件

java可视化编程-eclipse安装windowbuilder插件 http://blog.csdn.net/jason0539/article/details/21219043 [Java系列1]Eclipse配置,常用插件,码迷,mamicode.com

学习OpenCV的学习笔记系列之-- 环境配置

要想学好OpenCV,首先当然要知道怎么配置环境了.以本人的配置环境为例,步骤如下. 第一步 下载及解压OpenCV源码 虽然很多第三方网站及一些学习论坛会提供OpenCV的源码下载,但是还是推荐到官网进行下载,这样可以避免很多麻烦!(病毒?木马?你懂得!) 官网的下载地址如下: http://opencv.org/downloads.html 在此地址的界面上可以找到最新版本的OpenCV源码.我使用的是2014-04-25更新的2.4.9版本(目前最新),根据自己的系统选择对应的源码版本.

《PHP内核探索系列文章》系列技术文章整理收藏

<PHP内核探索系列文章>系列技术文章整理收藏 PHP内核探索系列文章收藏夹收藏有关PHP内核方面的知识的文章,对PHP高级进阶的朋友提供PHP内核方面的知识点探讨 1PHP内核探索:从SAPI接口开始 2PHP内核探索:一次请求的开始与结束 3PHP内核探索:再次探讨SAPI 4PHP内核探索:Apache模块介绍 5PHP内核探索:Zend引擎 6PHP内核探索:多进程/线程的SAPI生命周期 7PHP内核探索:单进程SAPI生命周期 8PHP内核探索:一次请求生命周期 9PHP内核探索:

学习OpenCV的学习笔记系列之-- 环境配置2

要想学好OpenCV,首先当然要知道怎么配置环境了.以本人的配置环境为例,步骤如下. 第一步 下载及解压OpenCV源码 虽然很多第三方网站及一些学习论坛会提供OpenCV的源码下载,但是还是推荐到官网进行下载,这样可以避免很多麻烦!(病毒?木马?你懂得!) 官网的下载地址如下: http://opencv.org/downloads.html 在此地址的界面上可以找到最新版本的OpenCV源码.我使用的是2014-04-25更新的2.4.9版本(目前最新),根据自己的系统选择对应的源码版本.

enc28j60网卡驱动模块添加进linux内核,Kconfig,Makefile配置过程

这里是要把http://www.cnblogs.com/hackfun/p/6260396.html中的enc28j60网卡驱动模块,添加到2.6.22.6内核中,这个模块代码不需要任何修改.只需要在内核目录下的相关配置脚本文件,如Makefile,Kconfig,.config等,修改某些配置就行. enc28j60网卡驱动模块使用到的几个文件: enc28j60.c enc28j60_hw.h spi_bitbang.c spi_s3c24xx.c spi_platform_dev.c 实际