历史上的今天
返回首页

历史上的今天

今天是:2025年06月26日(星期四)

正在发生

2018年06月26日 | LPC1768菜鸟学习之时钟配置

2018-06-26 来源:eefocus

LPC1768的时钟源可以来自三个:

1)内部RC振荡器

内部振荡器可看作看门狗定时器的时钟源,也可作PLL0和cpu的时钟源,但是无法作为usb的时钟源,因为精度达不到。而且如果CAN波特率高于100kb/s,则也不适用了。在系统上电时,LPC1768都使用内部振荡器,直到软件将其切换为另一种可用的时钟源。

2)主振荡器

主振荡器可作为CPU的时钟源,需要通过分频和倍频进行配置使用。基本会使用主振荡器作为时钟源

3)RTC振荡器

RTC振荡器可提供1Hz-32kHz的RTC时钟输出,可用作PLL0、CPU和看门狗定时的时钟源。

 

LPC1768时钟配置会涉及到以下几个过程:

1)时钟源选择

时钟源的选择就涉及到了SCS寄存器的配置

2)时钟分频

涉及到CCLKCFG寄存器的配置

3)PLL0配置

涉及到CLKSRCSEL、PLL0CFG、PLL0FEED等寄存器的配置

4)PLL1配置

涉及到PLL1CFG、PLL1FEED等寄存器的配置

5)外设时钟输出

 

具体的代码如下:

 

#define CLOCK_SETUP         1

#define SCS_Val             0x00000020

#define CLKSRCSEL_Val       0x00000001

 

#define PLL0_SETUP          1

#define PLL0CFG_Val         0x00050063

 

#define PLL1_SETUP          1

#define PLL1CFG_Val         0x00000023

#define CCLKCFG_Val         0x00000003

#define USBCLKCFG_Val       0x00000000

#define PCLKSEL0_Val        0x00000000

#define PCLKSEL1_Val        0x00000000

#define PCONP_Val           0x042887DE

#define CLKOUTCFG_Val       0x00000000

 

#define FLASH_SETUP         1

#define FLASHCFG_Val        0x0000303A

 

 

//时钟配置

void SystemInit()

{

#if(CLOCK_SETUP)        //时钟源设置

    LPC_SC->SCS = SCS_Val;

    if(SCS_Val &(1 << 5)){

        while((LPC_SC->SCS & (1 << 6)) == 0);  //主振荡器已稳定

    }

 

  LPC_SC->CCLKCFG = CCLKCFG_Val;   //setup clock divider,CCLKCFG_Val = 3, 为4分频,即CCLK为PLL0的四分之一

 

 

#if (PLL0_SETUP)

    LPC_SC->CLKSRCSEL = CLKSRCSEL_Val;//选择主振荡器作为PLL0时钟源

 

    LPC_SC->PLL0CFG   =  PLL0CFG_Val;  //在此选择PLL0倍频器值和预分频器值,分别是0~14位和16~23位

    LPC_SC->PLL0FEED  = 0xAA;

    LPC_SC->PLL0FEED  = 0x55;   //以上两行代码表示使PLL0CON和PLL0CFG寄存器的更改生效

 

    LPC_SC->PLL0CON   = 0x01;  //PLL0使能

    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;

    while(!(LPC_SC->PLL0STAT & ((1<<25) | (1<<24))));

#endif

 

#if (PLL1_SETUP)

    LPC_SC->PLL1CFG   = PLL1CFG_Val;

    LPC_SC->PLL1FEED  = 0xAA;

    LPC_SC->PLL1FEED  = 0x55;

 

    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;

    while (!(LPC_SC->PLL1STAT & ((1<< 9) | (1<< 8))));/* Wait for PLLC1_STAT & PLLE1_STAT */

#else

    LPC_SC->USBCLKCFG=USBCLKCFG_Val;        /* Setup USB Clock Divider    */

#endif

    LPC_SC->PCLKSEL0 = PCLKSEL0_Val;     /*  Peripheral Clock Selection   */

    LPC_SC->PCLKSEL1  = PCLKSEL1_Val;

 

    LPC_SC->PCONP  = PCONP_Val;        /* Power Control for Peripherals      */

 

    LPC_SC->CLKOUTCFG = CLKOUTCFG_Val;      /* Clock Output Configuration  */

#endif

 

#if (FLASH_SETUP == 1)

    LPC_SC->FLASHCFG = FLASHCFG_Val;   //Flash加速器配置

#endif

}


这样就配置完成,并且配置的100MHz的时钟频率。

 

Fcco = 12MHz/4 * 2 * 100 / 6 = 100MHz

以上是来自网上云飞翔的博客,地址:

http://www.cnblogs.com/flyingcloude/p/3745023.html

但是在system_lpc17xx.c里面,系统初始化函数还包括下面

 /* 根据时钟寄存器的值确定时钟频率            */

  if (((LPC_SC->PLL0STAT >> 24)&3)==3) {/* If PLL0 enabled and connected      */

    switch (LPC_SC->CLKSRCSEL & 0x03) {

      case 0:                           /* Internal RC oscillator => PLL0     */

      case 3:                           /* Reserved, default to Internal RC   */

        SystemFrequency = (IRC_OSC * 

                          ((2 * ((LPC_SC->PLL0STAT & 0x7FFF) + 1)))  /

                          (((LPC_SC->PLL0STAT >> 16) & 0xFF) + 1)    /

                          ((LPC_SC->CCLKCFG & 0xFF)+ 1));

        break;

      case 1:                           /* Main oscillator => PLL0            */

        SystemFrequency = (OSC_CLK * 

                          ((2 * ((LPC_SC->PLL0STAT & 0x7FFF) + 1)))  /

                          (((LPC_SC->PLL0STAT >> 16) & 0xFF) + 1)    /

                          ((LPC_SC->CCLKCFG & 0xFF)+ 1));

        break;

      case 2:                           /* RTC oscillator => PLL0             */

        SystemFrequency = (RTC_CLK * 

                          ((2 * ((LPC_SC->PLL0STAT & 0x7FFF) + 1)))  /

                          (((LPC_SC->PLL0STAT >> 16) & 0xFF) + 1)    /

                          ((LPC_SC->CCLKCFG & 0xFF)+ 1));

        break;

    }

  } else {

    switch (LPC_SC->CLKSRCSEL & 0x03) {

      case 0:                           /* Internal RC oscillator => PLL0     */

      case 3:                           /* Reserved, default to Internal RC   */

        SystemFrequency = IRC_OSC / ((LPC_SC->CCLKCFG & 0xFF)+ 1);

        break;

      case 1:                           /* Main oscillator => PLL0            */

        SystemFrequency = OSC_CLK / ((LPC_SC->CCLKCFG & 0xFF)+ 1);

        break;

      case 2:                           /* RTC oscillator => PLL0             */

        SystemFrequency = RTC_CLK / ((LPC_SC->CCLKCFG & 0xFF)+ 1);

        break;

    }

  }

 

#if (FLASH_SETUP == 1)                  /* Flash Accelerator Setup            */

  LPC_SC->FLASHCFG  = (LPC_SC->FLASHCFG & ~0x0000F000) | FLASHCFG_Val;

#endif

}

一般情况下,LPC_SC->CLKSRCSEL=0x01,即跳转到case 1, SystemFrequency =100M,

在PCLKSEL0和PCLKSEL1寄存器中队各个外设的值都设为0,表明PCLK外设时钟=CCLK/4。

即  PCLK=25Mhz.


推荐阅读

史海拾趣

CANDD公司的发展小趣事

为了进一步提升品牌影响力和市场份额,CANDD公司开始实施国际化战略。公司首先在欧洲市场设立了分公司,并成功打开了欧洲市场的大门。随后,公司又进军亚洲市场,通过与当地企业的合作,逐渐在亚洲市场站稳了脚跟。随着国际化战略的深入实施,CANDD公司的品牌知名度和市场份额不断攀升。

BALLUFF公司的发展小趣事

BALLUFF公司的历史可以追溯到1921年,由格布哈德·巴鲁夫(Gebhard Balluff)创建的一家机械修理厂开始。这家修理厂起初规模较小,但巴鲁夫凭借其对机械技术的精湛理解和不懈追求,逐渐将业务发展壮大。他通过不断的技术创新和产品升级,使得修理厂逐渐转型为一家专注于生产精密部件、车件和铣件的企业。这一转变不仅奠定了BALLUFF公司的工业基础,也为其日后在传感器领域的崛起打下了坚实基础。

Efficient Power Conversion公司的发展小趣事

在追求自身发展的同时,EPC公司也积极寻求与行业内其他企业的合作。通过与全球知名的汽车制造商、通信设备制造商以及消费电子企业建立合作关系,EPC公司将其氮化镓技术广泛应用于各个领域,推动了整个电子行业的发展。同时,EPC公司也积极参与行业标准的制定和推广工作,为行业的健康发展做出了积极贡献。

台湾诚阳(BC)公司的发展小趣事

随着国内市场的逐渐饱和,台湾诚阳(BC)公司开始积极寻求海外市场的发展机会。公司通过参加国际展会、与海外企业建立合作关系等方式,不断拓展国际市场。同时,公司还针对不同地区的市场需求,推出定制化的产品和服务,进一步提升了其在国际市场中的竞争力。

EiKO Global LLC公司的发展小趣事

随着智能家居和物联网技术的兴起,EiKO开始积极探索智能照明系统的研发与应用。公司投入大量研发资源,将传统照明产品与智能控制技术相结合,推出了具有远程控制、定时开关、色温调节等功能的智能照明系统。

这些智能照明系统不仅提高了用户的使用体验,还为用户带来了更加便捷和智能的生活方式。例如,用户可以通过手机APP远程控制家中的照明设备,实现定时开关和色温调节等功能;同时,智能照明系统还可以与智能家居系统相连接,实现与其他智能设备的联动控制。

AiT Semiconductor Inc公司的发展小趣事

在半导体行业,技术创新是企业持续发展的关键。AiT公司深知这一点,因此始终将创新作为公司的核心竞争力。他们投入大量资金和资源用于研发,不断推出具有创新性和领先性的半导体产品。同时,公司还积极与高校、科研机构等合作,共同开展技术研发和人才培养工作。这些创新举措使得AiT公司在行业中始终保持领先地位。

问答坊 | AI 解惑

【新手指南之一】哪一种人不宜学单片机?(转帖)

不宜学单片机的人容易问:我到底该学什么; ----踏踏实实的学点基本的吧?连单片机都不知道是什么就想去学ARM? c语言不会想搞LINUX?别老是好高骛远. 不宜学单片机的人容易问:谁有xxx源码?--(你给人家多少钱啊?自己的劳动白送你?) 不宜 ...…

查看全部问答>

求vxworks 安装程序?

哪里有vxworks下载,找了很紧都没找到。…

查看全部问答>

高分求助 TCP/IP问题

现象:1、我用2410和2440 一个做服务器一个做客户端可以正常通信       2、他们也都可以和PC正常通信 他们不管是做服务器还是客户端,都是可以正常通信       3、以上链接都是通过交叉网线连得 现在的 ...…

查看全部问答>

别人的导航软件的手写输入在我定制的CE平台上识别不了,为什么?跟平台定制有关没?CE组件没加?

别人的导航软件的手写输入在我定制的CE平台上识别不了,为什么?跟平台定制有关没?CE组件没加?…

查看全部问答>

急救:程控运算放大器的典型芯片?

程控运算放大器 都有哪些典型芯片? 希望都能有所了解. 最好是一路输入,内部进行调节放大的芯片.一个芯片里能象LM324一样有三组最好~ 能说下具体工作原理吗?…

查看全部问答>

一道计算机组成原理题

读出一个共有10000个柱面,每柱面有4个道,每道有2048个扇区的磁盘需要多少时间?假设首先从0道的0扇区开始读出整个磁道,然后从1道的0扇区再读出整个磁道,并继续下去。旋转时间为10ms,相邻柱面间的寻道时间为1ms,最坏情况是20ms。柱面内换道的 ...…

查看全部问答>

请教KEIL中如何输入“%”,我输入就会出现错误

如题,这问题该怎么解决啊?哪位高手知道指点指点啊!谢谢了!…

查看全部问答>

我想求助一下用GCC实现MIPS交叉编译的全过程(从编译binutils开始到重新编译GCC,再到如何实现交叉编译)

如题,麻烦大家指导下,我是GCC和MIPS的初学者,还望大家不吝赐教:)谢谢您!…

查看全部问答>

分析一个程序错误!

module delay_line(start,stop,up_out,upQ,down_out,downQ,clk,reset);input clk,start,stop,reset;reg [60:0]up_out,down_out,upQ,downQ;integer i,j,m,n;delay_unit du0(start,reset,up_out[0]);delay_unit du2(stop,reset,down_out[0]);always @ ...…

查看全部问答>

LM3S8962学习(四) -- 温度传感器

上次使用学习了一下Timer,每隔1秒钟中断一次,现在准备实现每隔1S钟读取一下内部的温度值,并在LCD上显示出来。   从手册288页上可以看出,LM3S8962的内部温度传感器有两个目的: 1.  防止温度过高或过低,影响系统芯片正常运行 ...…

查看全部问答>