LPC1114时钟配置
PC1114的时钟被设置成为主时钟48MHz,AHB时钟48MHz,输入输出端口(GPIO)时钟使能的状态。
在上述程序中,PLL输入选择寄存器(SYSPLLCLKSEL),主时钟选择寄存器(MAINCLKSEL),AHB分频选择寄存器(SYSAHBCLKdiv)均在前面讨论过,下面来看一下没讨论过的寄存器。先看“掉电配置寄存器(PDRUNCFG)”,下表是它的位结构。
位 | 符号 | 值 | 描述 | 复位值 |
0 | IRCOUT_PD (IRC振荡器输出掉电) | 1 | 掉电 | 0 |
0 | 上电 | |||
1 | IRC_PD (IRC振荡器掉电) | 1 | 掉电 | 0 |
0 | 上电 | |||
2 | FLASH_PD (Flash掉电) | 1 | 掉电 | 0 |
0 | 上电 | |||
3 | BOD_PD (BOD掉电) | 1 | 掉电 | 0 |
0 | 上电 | |||
4 | ADC_PD (ADC掉电) | 1 | 掉电 | 1 |
0 | 上电 | |||
5 | SYSOSC_PD (系统振荡器掉电) | 1 | 掉电 | 1 |
0 | 上电 | |||
6 | WDTOSC_PD (看门狗振荡器掉电) | 1 | 掉电 | 1 |
0 | 上电 | |||
7 | SYSPLL_PD (系统PLL掉电) | 1 | 掉电 | 1 |
0 | 上电 | |||
8 | - | - | 保留 | 1 |
9 | - | 0 | 保留,置0 | 0 |
10 | - | - | 保留 | 1 |
11 | - | 1 | 保留,置1 | 1 |
12 | - | 0 | 保留,置0 | 0 |
15∶13 | - | - | 保留 | 1 |
31∶16 | - | - | 保留 |
从表中可以看出,系统振荡器和系统PLL在默认情况下是掉电的,也就是说默认它们不处于工作状态,要让它们工作就必须给它们置0上电。所以要通过执行语句“SYSCON->PDRUNCFG &= ~(1 < 5)”和“SYSCON->PDRUNCFG &= ~(1 < 7)”来把SYSOSC和SYSPLL置0。
接下来看“系统振荡器控制寄存器(SYSOSCCTRL)”,下表是它的位结构。
位 | 符号 | 值 | 描述 | 复位值 |
0 | BYPASS (旁路系统振荡器) | 0 | 未被旁路 | 0 |
1 | 被旁路 | |||
1 | FREQRANGE (低功耗振荡器确定频率范围) | 0 | 1~20MHz | 0 |
1 | 15~25MHz | |||
31∶2 | - | - | 保留 | 0 |
从表中可以看出,如果要让系统振荡器工作,则其第0位就应该选择0,即不被旁路,只有在从外部直接输入振荡信号的情况下才会选择旁路(比如使用有源晶振)。第1位用于选择外部晶振的频率范围,使用12MHz时该位选择0。执行语句“SYSCON->SYSOSCCTRL = 0x00000000”就可以实现上述配置,但实际上复位后的值就是该配置,也可不执行该语句。
从上述程序中还可以看出,在配置了时钟后(无论是PLL时钟还是主时钟),都需要更新一下才能正常工作。而更新的操作则根据管方手册,必须要给相应的允许寄存器“toggle”一下(即先向其写0再紧接着写1)。“系统PLL时钟源更新允许寄存器(SYSPLLCLKUEN)”和“主时钟源更新允许寄存器(MAINCLKUEN)”的位结构是一样的,下表是MAINCLKUEN寄存器的位结构。
位 | 符号 | 值 | 描述 | 复位值 |
0 | ENA (允许主时钟源更新) | 0 | 无变化 | 0 |
1 | 更新时钟源 | |||
31∶1 | - | - | 保留 | 0 |
在主时钟源及PLL时钟源更改后,要紧接着及时更新相应的允许寄存器才能让其正常工作。此外还要注意一点,“toggle”后需要查询相应的允许寄存器是否已更新,若没有就需要等待直到其更新为止(例如在更新PLL时钟源更新允许寄存器SYSPLLCLKUEN后要执行语句“while (!(LPC_SYSCON->SYSPLLCLKUEN & 0x01));”,以等待其更新完成)。
接下来看一下PLL的配置,要让PLL对输入时钟进行倍频或分频,就要配置“系统倍频控制寄存器(SYSPLLCTRL)”,下表是该寄存器的位结构。
位 | 符号 | 值 | 描述 | 复位值 |
4∶0 | MSEL (反馈分频器的值, 分频器的值M是MSEL+1) | 00000 | M=1 | 0x00 |
…… | …… | |||
11111 | M=32 | |||
6∶5 | PSEL (后分频器的值, 分频器的值为2×P) | 00 | P=1 | 0x00 |
01 | P=2 | |||
10 | P=4 | |||
11 | P=8 | |||
31∶7 | - | - | 保留,不能写1 | 0x00 |
PLL的输出频率要符合下面的公式。
Fclkout为PLL的输出频率,Fclkin为外部晶振的频率,FCCO的值必须在156MHz ~320MHz之间,M为倍频的倍数,P值要符合要求。若以12MHz的晶振做为输入,系统主时钟要为48MHz,则M=4(MSEL=0011),P的值只能取2(PSEL=01)才能满足公式要求。因此寄存器SYSPLLCTRL的值应该为10011(0x13),所以要配置此项只需要执行语句“SYSCON->SYSPLLCTRL = 0x00000013”就可以了。
在改变了PLL的倍频之后,需要查询“倍频状态寄存器(SYSPLLSTAT)”,看PLL锁定了没有,若没有就需要等待直到其锁定为止(执行语句“while (!(LPC_SYSCON->SYSPLLSTAT & 0x01));”)。下面是“倍频状态寄存器(SYSPLLSTAT)”的位结构。
位 | 符号 | 值 | 描述 | 复位值 |
0 | LOCK (PLL锁定状态) | 0 | 未锁定 | 0 |
1 | 已锁定 | |||
31∶1 | - | - | 保留 | 0 |
CPU要对GPIO进行操作,就必须给GPIO时钟信号,即需要使能GPIO的时钟。在默认情况下GPIO时钟是允许的,也可以对“系统AHB时钟控制寄存器(SYSAHBCLKCTRL)”中相应的位进行操作来选择允许时钟,下面是该寄存器的位结构。
位 | 符号 | 值 | 描述 | 复位值 |
0 | SYS (允许AHB时钟,只读) | 0 | 保留 | 1 |
1 | 允许 | |||
1 | ROM (允许ROM时钟) | 0 | 禁止 | 1 |
1 | 允许 | |||
2 | RAM (允许RAM时钟) | 0 | 禁止 | 1 |
1 | 允许 | |||
3 | FLASHREG (允许flash寄存器接口时钟) | 0 | 禁止 | 1 |
1 | 允许 |
LPC1114时钟配 相关文章:
- Windows CE 进程、线程和内存管理(11-09)
- RedHatLinux新手入门教程(5)(11-12)
- uClinux介绍(11-09)
- openwebmailV1.60安装教学(11-12)
- Linux嵌入式系统开发平台选型探讨(11-09)
- Windows CE 进程、线程和内存管理(二)(11-09)