微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 嵌入式设计 > LPC1114时钟配置

LPC1114时钟配置

时间:11-13 来源:互联网 点击:
要让LPC1114正常工作,首先要对它的时钟源进行配置。LPC1114的最高工作频率为50MHz,因此给它的主时钟频率最大不能超过50MHz。实际上,通常都是使用频率较低的晶振,以降低外部电磁干扰,然后再通过内部倍频的方式把主时钟频率提高。根据管方手册给出的数据,外部晶振的频率范围是1MHz~25MHz,一般情况下使用12MHz晶振,然后内部进行4倍频,主时钟工作频率为48MHz。

要对LPC1114的时钟进行配置,必须要了解它的时钟结构,先来看一下它的时钟结构图,如下图所示。

首先来看主时钟,给主时钟(main clock)提供选择有4个源,分别是:内部RC振荡器、未倍频之前的PLL时钟、内部看门狗时钟、经过PLL倍频之后的时钟。由对主时钟源选择寄存器(MAINCLKSEL)的操作来进行选择,同一时刻只能选择一种时钟做为主时钟。下面就给出MAINCLKSEL寄存器的位结构(要注意,因为LPC1114是32位的,所以所有的寄存器都是32位的),如下表所示。

符号

描述

复位值

1∶0

SEL

00

内部RC振荡器

0x00

01

PLL倍频之前的时钟

10

内部看门狗时钟

11

PLL倍频之后的时钟

31∶2

-

-

保留

0x00

前面说过,一般情况下CPU内部都是要进行倍频的,因此大多数时候该寄存器的值都会选择11(0x03),执行语句“SYSCON->MAINCLKSEL=0x00000003”就可以了。

接下来看系统PLL时钟,PLL即是频率锁相环的意思,PLL的功能很多,有兴趣的可自行参考其它资料,这里主要利用它来实现倍频的功能。从上图中可以看出,供给PLL选择的有2个源,一个是片内RC振荡器,另一个是晶体振荡器。由对系统PLL时钟选择寄存器(SYSPLLCLKSEL)的操作来进行选择,同一时刻只能选择一种时钟做为输入时钟。下面给出SYSPLLCLKSEL寄存器的位结构,如下表所示。

符号

描述

复位值

1∶0

SEL

00

内部RC振荡器

0x00

01

晶体振荡器

10

保留

11

保留

31∶2

-

-

保留

0x00

一般情况下,为了提高时钟精度都会选择01(0x01),以选择外部晶体振荡器做为时钟输入。执行语句“SYSCON->SYSPLLCLKSEL=0x00000001”就可以了。

在时钟结构图中还可以看出,主时钟分成6路供给不同的模块。其中一路主时钟经过系统时钟分频器(SYSAHBCLKdiv)后做为系统时钟,提供给AHB。在LPC1114中,只有通用输入输出端口(GPIO)需要AHB。为了给不同速度的模块(如内核、存储器、APB等)提供时钟,需要对SYSAHBCLKdiv寄存器进行操作,以对主时钟进行分频。下面给出SYSAHBCLKdiv寄存器的位结构,如下表所示。

符号

描述

复位值

7∶0

div

00000000

关闭系统时钟

0x01

00000001

1

00000010

2

……

……

11111111

255

31∶8

-

-

保留

0x00

从表中可以看出,分频的最大值是255分频。一般情况下,系统的默认值是1,即为AHB提供不分频的主时钟,也可执行语句“SYSCON->SYSAHBCLKdiv=0x00000001”来实现。剩余5个模块(SPI0、UART、SPI1、WDT、CLKOUT)的时钟也像系统时钟一样由主时钟来分频,只不过它们默认的分频值为0,即默认不提供时钟,也就是说剩余的5个模块默认状态下不工作,需要的时候再通过程序来打开,以降低功耗

由上述可见,居于Cotex-M0内核的CPU由于强化了时钟配置,所以在一般情况下要使用该类型的CPU,首要的任务就是为其配置正确的时钟。下面就来讨论一下如何通过程序来配置LPC1114的时钟。

先给出一个时钟初始化的函数,如下:

void SysCLK_config(void)

{

uint8_t i;

LPC_SYSCON->PDRUNCFG &= ~(1 < 5); //给系统振荡器上电

LPC_SYSCON->SYSOSCCTRL = 0x00000000; //系统振荡器未旁路,1~12MHz输入

for (i = 0; i < 200; i++) __nop(); //延时等待振荡器稳定

LPC_SYSCON->SYSPLLCLKSEL = 0x00000001; //PLL输入选择外部晶体振荡

LPC_SYSCON->SYSPLLCLKUEN = 0x00;

LPC_SYSCON->SYSPLLCLKUEN = 0x01; //先写0后写1更新时钟源

while (!(LPC_SYSCON->SYSPLLCLKUEN & 0x01)); //等待更新完成

LPC_SYSCON->SYSPLLCTRL = 0x00000013; //M=4、P=2,倍频后的时钟为48MHz

LPC_SYSCON->PDRUNCFG &= ~(1 < 7); //给PLL上电

while (!(LPC_SYSCON->SYSPLLSTAT & 0x01)); //等待PLL锁定

LPC_SYSCON->MAINCLKSEL = 0x00000003; //主时钟选择PLL倍频后的时钟

LPC_SYSCON->MAINCLKUEN = 0x00;

LPC_SYSCON->MAINCLKUEN = 0x01; //先写0后写1更新时钟源

while (!(LPC_SYSCON->MAINCLKUEN & 0x01)); //等待更新完成

LPC_SYSCON->SYSAHBCLKdiv = 0x00000001; //AHB为1分频,AHB时钟为48MHz

LPC_SYSCON->SYSAHBCLKCTRL |= (1<6); //使能GPIO时钟

}

如果使用的是12MHz的外部晶振,该函数执行完后,L

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top