转:LPC2214的PLL与定时器设置

原地址:http://blog.sina.com.cn/s/blog_4419d72d0100mu7h.html

1、振荡源选择:
LPC2214的振荡器可工作在两种模式:从属模式和振荡模式。
从属模式下,外部时钟源信号从XTAL1脚输入,XTAL2管脚不连接。时钟源的频率限制在1MHz-50MHz。
振荡模式下,XTAL1和XTAL2外接晶振。晶振频率限制在1MHz-30MHz。
一般把振荡器频率称为Fosc,ARM处理器时钟频率称为cclk。如果PLL没有启动,Fosc和cclk相等。

2:PLL锁相环设置
PLL接受的输入时钟频率范围为10MHz~25MHz。输入频率通过一个电流控制振荡器(CCO)倍增到范围10MHz~60MHz。倍频器可以是从1到32的整数(实际上,由于CPU最高频率的限制,LPC2114/2124/2212/2214的倍频值不能高于6)。CCO的操作频率范围为156MHz~320MHz,因此在环中有一个额外的分频器在PLL提供所需要的输出频率时使CCO保持在频率范围内。输出分频器可设置为2,4,8或16分频。
PLL在芯片复位和进入掉电模式时被关闭并旁路。PLL只能通过软件使能,程序必须在配置和激活PLL后等待其锁定,然后再连接PLL。
掉电模式会自动关闭并断开PLL,从掉电模式唤醒不会自动恢复PLL的设定,PLL的恢复必须由软件来完成,通常,一个将PLL激活并等待锁定,然后将PLL连接的子程序可以在任何中断服务程序的开始调用。注意一点:不要再掉电唤醒之后简单的执行馈送序列来重新启动PLL,这会在PLL锁定建立之前也就是PLL稳定之前使能并连接PLL。(因为执行馈送序列会把掉电之前设置的PLLCON和PLLCFG的值写入PLL的映像寄存器)。

PLL部分有4个控制寄存器:
PLL控制寄存器(PLLCON – 0xE01FC080):
0位:PLLE
PLL使能,当该位为1并且在有效的馈送序列后,该位将激活PLL并允许其锁定到指定频率。
1位:PLLC
PLL连接,当该位和PLLE都为1,并且在有效的PLL馈送后,将PLL作为时钟连接到LPC2214,否则,LPC2214直接使用振荡器时钟。
2:7位:保留,不要写入1。

PLL配置寄存器(PLLCFG—0xE01FC084)
0:4位:MSEL0:4
PLL倍频器值,在PLL频率计算中其值为M。
5:6位:PSEL0:1
PLL分频器值,在PLL频率计算中其值为P。
7位:保留,不要写入1。

PLL状态寄存器(PLLSTAT---0xE01FC088)
从PLLSTAT读出的值是正在使用的真实PLL参数和状态,PLLSTAT可能与PLLCON和PLLCFG的值不同,这是因为没有执行正确的PLL馈送序列,这两个寄存器中的值并没生效。
0:4位:MSEL0:4
读出的PLL倍频器值,这是PLL当前使用的值。
5:6位:PSEL1:0
读出的PLL分频器值,这是PLL当前使用的值。
7位:保留
8位:PLLE
读出的PLL使能位,为1时,PLL处于激活状态,为0时,PLL关闭,当进入掉电模式时,该位自动清零。
9位:PLLC
读出的PLL连接位,当读出的PLLE和PLLC都为1时,PLL作为时钟源连接到LPC2214,当读出的PLLE或PLLC为0时,PLL被旁路,LPC2214直接使用振荡器时钟。进入掉电模式时,该位自动清零。
10位:PLOCK
反映PLL的锁定状态,为1时,PLL锁定到指定频率,为0时,PLL没锁定。
11:15位:保留,用户不要写入1

PLL馈送寄存器(PLLFEED—0XE01FC08C)
0:7位:PLLFEED
PLL馈送序列必须写入该寄存器才能使PLL配置和控制寄存器的更改生效。
馈送序列如下:
1、        将值0XAA写入PLLFEED
2、        将值0X55写入PLLFEED
这两个写操作的顺序必须正确,而且写入必须是连续的,这就要求在写入馈送序列时必须禁止中断,否则对PLLCON和PLLCFG的更改不会生效。

PLL中断
如前面所说,程序必须在配置和激活PLL后等待其锁定,然后再连接PLL。
PLL是否锁定在指定频率,通过读取PLLSTAT的PLOCK位判断。等待PLL锁定有2种方式:查询等待或中断方式。
LPC2214可以配置PLOCK=1时发生中断。在中断程序中打开PLL。
用中断方式打开PLL过程如下:
a)        主程序开始,关闭中断
    PLLCON = 1;//使能PLL
    PLLCFG = 0X25;//设置M为6,P为2
b)        PLLFEED = 0XAA; //发送馈送序列
   PLLFEED = 0X55;
c)        使能IRQ中断和PLL中断,以上是主程序部分程序流程。
d)        PLOCK=1时,产生中断,表示PLL已经锁定在指定频率。
e)        在PLL中断处理程序中
    PLLCON = 3;//PLL使能和链接
    PLLFEED=0XAA;//发送馈送序列,使PLLCON和PLLCFG设置生效
    PLLFEED=0X55;
    延时一段时间,
    最后禁止PLL中断,退出中断。PLL配置就完成了。

PLL频率计算:
PLL等式使用下列参数
Fosc  晶振频率
Fcco  PLL电流控制振荡器的频率
Cclk  PLL输出频率(也是处理器的时钟频率)
M    PLLCFG寄存器中MSEL位的倍频器值
P     PLLCFG寄存器中PSEL位的分频器值
PLL输出频率(当PLL激活并连接时)由下式得到:
cclk = M * FOSC 或 cclk = FCCO / (2*P)
CCO频率可由下式得到:
FCCO = cclk * 2 * P 或 FCCO = FOSC * M * 2 * P
PLL输入和设定必须满足下面的条件:
Fosc的范围:10MHz—25MHz
Cclk的范围:10MHz—Fmax(LPC2214的最大允许频率)
Fcco的范围:156MHz—320MHz

确定PLL设定的过程:
如果一个特定的应用使用PLL,它的配置必须依照下面的原则:
1. 选择处理器的操作频率(cclk)。这可以根据处理器的整体要求、UART波特率的支持等因素来决定。记住外围器件的时钟频率可以低于处理器频率。
2. 选择振荡器频率(FOSC)。cclk一定是FOSC的整数(非小数)倍。
3. 计算M值以配置MSEL位。M = cclk/FOSC,M的取值范围为1~32。写入MSEL位的值为M-1。
4. 选择P值以配置PSEL位,使FCCO在定义的频率限制范围内,FCCO可通过前面的等式计算。P必须是1, 2, 4或8其中的一个。写入PSEL位的值00表示P=1;01表示P=2;10表示P=4;11表示P=8。

PLL举例:
例如系统要求Fosc=10MHz,cclk=60MHz。
根据这些要求,可得出M=cclk/Fosc=60MHz/10MHz=6。因此,M-1=5写入PLLCFG4:0。
P值可由P=Fcco/(cclk*2)得出,Fcco必须在156MHz~320MHz内。假设Fcco取最低频率156MHz,则P=156MHz/(2*60MHz)=1.3。Fcco取最高频率可得出P=2.67。因此,同时满足Fcco最低和最高频率要求的P值只能为2,见表27。所以,PLLCFG=6:5=1。

3、        VPB分频器
定时器的时钟源是pclk,Fosc,cclk,pclk的关系入下图:

VPB分频器决定处理器时钟cclk和外设器件所使用的时钟pclk的关系。
VPBDIV寄存器(VPBDIV ---0XE01FC100)
1:0位:VPBDIV
00:pclk=cclk/4
01:pclk=cclk
10:pclk=cclk/2
11:保留

4、        定时器设置
LPC2214有2个32位定时器。功能设置相同,以TIMER0为例说明定时器的设置。
相关管脚:
输入管脚(捕获信号) CAP0.3-CAP0.0(TIMER0)
                  CAP1.3-CAP1.0(TIMER1)
捕获管脚的跳变可配置为将一个定时器值装入一个捕获寄存器,并可选择产生一个中断,可选择多个管脚用作捕获功能,当有多个管脚被选择用作TIMER0/1的捕获输入通道时,使用编号最小的管脚。例如当100脚(P0.16)和68脚(P0.6)都设置为CAP0.2功能时,TIMER0只选择68脚执行CAP0.2功能。
LPC2214不止8个脚具有CAP0.3-CAP0.0,CAP1.0-CAP1.0功能。为什么要这么设计,我还没弄明白。
TIMER0,TIMER1各有4个捕获寄存器TnCR0-3,各有一个捕获控制寄存器TnCCR。

输出管脚(外部匹配输出)MAT0.3-MAT0.0(TIMER0)
                        MAT1.3-MAT1.0(TIMER1)
当TIMER0/1的某个匹配寄存器等于定时器计数器TnTC时,可配置输出脚电平翻转,输出高电平,输出低电平或保持电平不变。LPC2214不止8个脚具有MAT0.3-MAT0.0,MAT1.0-MAT1.0功能。可选多个管脚并行用作匹配输出功能。例如可以同时选择2个管脚并行提供MAT1.3输出功能。
若要使用捕获或者匹配功能,需要进行正确的管脚连接设置。

定时器的相关寄存器有很多,下面一一分析。
中断寄存器
T0IR(0XE0004000),T1IR(0XE0008000)
有中断产生,IR对应的位会置1, 向对应的IR位写入1会复位中断(即清零对应的中断标志).以TIMER0的T0IR为例
0:4位对应TIMER0的匹配通道MR0:4的中断标志
4:7位对应TIMER0的捕获通道CR0:4的中断标志

定时器控制寄存器
T0TCR(0XE0004004),T1TCT(0XE0008004)
以TIMER0的T0TCR为例
0位:为1,定时器计数器和预分频计数器使能计数
     为0,计数器被禁止
1位:为1,定时器计数器和预分频计数器在pclk的下一个上升沿同步复位。计数器在TCR.1恢复为0之前保持复位状态。

定时器计数器
T0TC(0XE0004008),T1TC(0XE0008008)
当预分频计数器到达计数的上限时,32位定时器计数器加1。如果TC在到达计数上限之前没有被复位,它将一直计数到0xFFFFFFFF然后翻转到0x00000000。该事件不会产生中断。如果需要,可用匹配寄存器检测溢出。

预分频计数器PR
T0PR(0XE000400C),T1PR(0XE000800C)
32位预分频寄存器指到预分频计数器的最大值。TC每经过PR+1个pclk加1。
例如,当PR=0时,定时器计数器每个pclk周期加1,当PR=1时,定时器计数器每2个pclk周期加1。
假定PR寄存器的值为PR,则分配后的时钟计数频率计算如下:
时钟计数频率=Fpclk/(PR+1).

预分频计数器寄存器
T0PC(0XE000400C),T1PC(0XE000800C)
预分频计数器使用某个常量来控制pclk的分频。这样可实现控制定时器分辨率和定时器溢出时间之间的关系。预分频计数器每个pclk周期加1。当其到达预分频寄存器中保存的值时,定时器计数器加1,预分频计数器在下个pclk周期复位。这样,当PR=0时,定时器计数器每个pclk周期加1,当PR=1时,定时器计数器每2个pclk周期加1。

匹配寄存器(TnMR0:3)n=0/1
匹配寄存器值与定时器计数值相等时自动触发相应动作。这些动作包括产生中断,复位定时器计数器或停止定时器。所执行的动作由MCR寄存器控制。

匹配控制寄存器
T0MCR(0XE0004014),T1MCR(0XE0008014)
匹配控制器用于控制在发生匹配时执行的操作。以T0MCR为例:
0位:中断(MR0)
为1,MR0与T0TC匹配时将产生中断,为0,禁止中断
1位:复位(MR0)
为1,MR0与T0TC匹配时将使T0TC复位,为0,该功能禁止
2位:停止(MR0)
为1,MR0与T0TC匹配时将使T0TC,T0PC停止,T0TCR.0清零,为0,该功能禁止。
3位:中断(MR1)
为1,MR1与T0TC匹配时将产生中断,为0,禁止中断
4位:复位(MR1)
为1,MR1与T0TC匹配时将使T0TC复位,为0,该功能禁止
5位:停止(MR1)
为1,MR1与T0TC匹配时将使T0TC,T0PC停止,T0TCR.0清零,为0,该功能禁止。
6位:中断(MR2)
为1,MR2与T0TC匹配时将产生中断,为0,禁止中断
7位:复位(MR2)
为1,MR2与T0TC匹配时将使T0TC复位,为0,该功能禁止
8位:停止(MR2)
为1,MR2与T0TC匹配时将使T0TC,T0PC停止,T0TCR.0清零,为0,该功能禁止。
9位:中断(MR3)
为1,MR3与T0TC匹配时将产生中断,为0,禁止中断
10位:复位(MR3)
为1,MR3与T0TC匹配时将使T0TC复位,为0,该功能禁止
11位:停止(MR3)
为1,MR3与T0TC匹配时将使T0TC,T0PC停止,T0TCR.0清零,为0,该功能禁止。

捕获寄存器(TnCR0:3)
每个捕获寄存器都与一个器件管脚相关联,当管脚发生特定的事件时,可将定时器计数值装入该寄存器。
捕获控制寄存器的设定决定捕获功能是否使能以及捕获事件在管脚的上升沿、下降沿或是双边沿发生。

捕获控制寄存器
T0CCR(0XE0004028),T1CCR(0XE0008028)
以TIMER0的T0CCR为例:
0位:CAP0.0
为1,CAP0.0上升沿跳变导致T0TC的内容装入T0CR0,为0,禁止该功能。
1位:CAP0.0
为1,CAP0.0下降沿跳变导致T0TC的内容装入T0CR0,为0,禁止该功能。
2位:CAP0.0
为1,CAP0.0的捕获事件所导致的T0CR0装载将产生一个中断,为0,禁止该功能
3位:CAP0.1
为1,CAP0.1上升沿跳变导致T0TC的内容装入T0CR1,为0,禁止该功能。
4位:CAP0.1
为1,CAP0.1下降沿跳变导致T0TC的内容装入T0CR1,为0,禁止该功能。
5位:CAP0.1
为1,CAP0.1的捕获事件所导致的T0CR1装载将产生一个中断,为0,禁止该功能
6位:CAP0.2
为1,CAP0.2上升沿跳变导致T0TC的内容装入T0CR2,为0,禁止该功能。
7位:CAP0.2
为1,CAP0.2下降沿跳变导致T0TC的内容装入T0CR2,为0,禁止该功能。
8位:CAP0.2
为1,CAP0.2的捕获事件所导致的T0CR2装载将产生一个中断,为0,禁止该功能
9位:CAP0.3
为1,CAP0.3上升沿跳变导致T0TC的内容装入T0CR3,为0,禁止该功能。
10位:CAP0.3
为1,CAP0.3下降沿跳变导致T0TC的内容装入T0CR3,为0,禁止该功能。
11位:CAP0.3
为1,CAP0.3的捕获事件所导致的T0CR3装载将产生一个中断,为0,禁止该功能

外部匹配寄存器
T0EMR(0XE000403C),T1EMR(0XE000803C)
外部匹配寄存器提供外部匹配管脚MAT0.0-MAT0.3,MAT1.0-MAT1.3的控制和状态。
以TIMER0的T0EMR为例:
0位:T0MR0发生匹配时,MAT0.0的状态(1/0)
1位,T0MR1发生匹配时,MAT0.1的状态
2位,T0MR2发生匹配时,MAT0.2的状态
3位,T0MR3发生匹配时,MAT0.3的状态
5:4位:决定外部匹配0的功能
00:不执行任何动作
01:对应的外部匹配输出设置为0(如果连接到管脚,则输出低电平)
10:对应的外部匹配输出设置为1(如果连接到管脚,则输出高电平)
11:对应的外部匹配输出翻转
7:6位:决定外部匹配1的功能(同上)
9:8位:决定外部匹配2的功能(同上)
11:10位:决定外部匹配3的功能(同上)


周立功的LPC2214资料里没有T0CTCR,T1CTCR,我觉得这两个寄存器是必须的。
计数控制寄存器
T0CTCR(0XE0004070),T1CTCR(0XE0008070)
计数控制寄存器用来选择定时器模式或计数器模式,计数器模式下选择计数的管脚和边沿。
以TIMER0的T0CTCR为例
1:0位:计数器/定时器模式
该字段选择触发定时器的预分频计数器(PC)递增,清除PC,定时器计数器(TC)递增的pclk边沿
00:定时器模式,每个PCLK的上升沿递增(这里的PCLK也包括从预分频计数器得到的计数信号)
01:计数器模式,计数器在CAP管脚的上升沿递增
10:计数器模式,计数器在CAP管脚的下降沿递增
11:计数器模式,计数器在CAP管脚的上升沿和下降沿递增。
3:2位:计数器模式下,用来选择对哪一个CAP管脚进行采样计时
00:CAP0.0
01:CAP0.1
10:CAP0.2
11:CAP0.3
注:如果在TnCTCR中选择计数器模式用于某个特定的CAP管脚输入,则捕获控制寄存器(TnCCR)中对应该输入的3位必须设置为000。但是,可以在相同的定时器中选择其它3个CAP管脚用于捕获或中断。

定时器的基本操作方法:
1、        计算定时器的时钟频率,设置PR寄存器进行分频操作。
2、        设置比较匹配的初值及其工作模式,若是使用捕获功能,则设置捕获方式
3、        若使用定时器的相关中断,则设置VIC,使能中断,
4、        设置TCR,启动定时器
定时计数器的时钟频率计算如下:
计数时钟频率=Fpclk/(PR+1)

定时器举例
定时器0定时实验----查询方式
用定时器0实现0.5s定时,查询标志位等待定时时间到达。对蜂鸣器进行控制,让蜂鸣器每s响一次。
程序在T0MR0中设定定时常数,在T0MCR中设置定时器0匹配后复位T0TC并产生中断标志,接下来程序查询等待中断标志置位,若定时时间到,先清TIMER0中断标志,然后取反BEEP控制口的输出状态。程序如下:
原文地址:https://www.cnblogs.com/xuhj001/p/3361004.html