LPC1114时钟配置
要对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 |
由上述可见,居于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
LPC1114时钟配 相关文章:
- Windows CE 进程、线程和内存管理(11-09)
- RedHatLinux新手入门教程(5)(11-12)
- uClinux介绍(11-09)
- openwebmailV1.60安装教学(11-12)
- Linux嵌入式系统开发平台选型探讨(11-09)
- Windows CE 进程、线程和内存管理(二)(11-09)