原创 LPC2478时钟系统学习笔记(二)

2011-1-7 14:42 4677 10 12 分类: 消费电子

     继续上文(LPC2478时钟系统学习笔记(一))。

 

文章的写作思路基本每一段围绕一个小知识点进行解释。因知识水平有限,其中可能存在不足之处望高人指点,本人不胜感激。


     LPC2400系列中引导启动与LPC2000系列稍有不同。其中有关PLL的部分有些需要注意。在ISP模式下,引导代码会通过IRC时钟源驱动PLL,从而启动PLL。


这就是说在我们的用户程序开始执行之前PLL已经使能,如果我们选择其他的时钟源,必须按照步骤次序断开PLL.另外,在ISP模式下,引导代码会改变某些寄存器的值。如the SCS register中的GPIOM位会被置位。用户必须注意这点,否则可能导致PORT0 and PORT1不能正常使用。


     PLL寄存器主要有以下四个。PLLCON,PLLCFG,PLLSTAT,PLLFEED。

PLLCON(可读写)包括使能和连接位。PLL作为其他模块的时钟源之前必须启动,使能,锁相达到稳定状态。


    PLLCFG(可读写)为配置寄存器。MSEL设置‘M’的值,NSEL设置‘N’的值。下面为计算公式:FCCO = (2 × M × FIN) / N


    当输入时钟FIN在MZ级别上变化时,‘M’取值范围6-512,当输入时钟在低频变化时,‘M’取特殊的值(参考数据手册)。 FIN范围 是 32 kHz to 50 MHz。 FCCO范围是 275 MHz to 550 MHz。


    注意:


1, 如果用户程序中用到USB接口,FCCO必须为48MZ的整数倍(如96等)。


2, 在选择CPU的时钟源,也需要考虑USB的情况,FCCO最好为两者的公倍数。低频时功耗消耗也低。


3, 对于驱动PLL时钟源的选择上述三者均可,但如果用到USB则必须使用the main oscillator。


4, 通过计算公式得到的‘N’,‘M’值必须减一写入寄存器中。其中‘N’值最好小一点。最好使用数据手册中推荐的值。


    举例:用户程序中用到USB,期望的FCCO值为288MZ,CPU工作频率60MZ,外部时钟为4MZ。


    由以上公式可导出M = (FCCO × N) / (2 × FIN),假设N=1,
M = 288 × 106 / (2 × 4 × 106) = 36,PLLCFG中位0x23 (N - 1 = 0; M - 1 = 35 = 0x23)。对于CPU,288 × 106 / 60 × 106 = 4.8,取整数5即可,CPU=57.6 MHz。如果要求精确,则FCCO只能去48和60的最小公倍数480MZ,再计算即可。(更多举例请参考数据手册)


    PLLSTAT(只读)状态寄存器。MSEL, NSEL为当前值比实际使用的值小1.PLLE,PLLC为1表示PLL使能连接。PLOCK为1表示锁定相位,它可以监视PLL是否达到稳定状态,可以为下一级使用。PLOCK还连接到了中断控制器。用户使用软件可以控制。当中断发生,PLL连接使用,中断失效。


    PLLFEED寄存器通过按顺序写数据保护PLLCON,PLLCFG寄存器中的值。1. 写 0xAA to PLLFEED.2. 写 0x55 to PLLFEED. 如果次序中任何一步不正确,PLLCON,PLLCFG寄存器中的值不会改变。


   掉电模式下PLL自动关闭。当芯片从掉电模式下被唤醒时,PLL不会自动的连接,必须由软件完成(由相应的中断服务程序)。需要注意的是不能简单的通过向PLLFEED寄存器中依次喂食启动PLL,如果这样会出现错误。


     PLL的启动设置顺序:此序列非常重要不能出现错误。


1, 如果PLL已经连接,通过喂食序列断开连接。
2, 通过喂食序列断开使能。
3, 如果需要加快无锁相时的速度,改变CPU分频器的设置。
4, 写The PCLKSRCSEL register以选择相应的时钟源驱动PLL。
5, 写PLLCFG,喂食序列保证生效。此时PLL是不使能状态。
6, 使能PLL, 喂食序列保证生效。
7, 在使能PLL的条件下,改变CPU分频器的设置。在连接PLL之前这一点非常重要。
8, 等待PLL稳定。通过监视PLOCK(the PLLSTAT register)是否置位确定。或者通过中断实现,或者等待固定时间。
9, 连接PLL,喂食序列保证生效。


    PLL输出的时钟通过分频用于CPU和USB等模块。当USB接口使时,CPU频率必须大于18MZ。USB接口频率必须是48MZ的整数倍。


    CPU Clock Configuration register (CCLKCFG ),配置寄存器控制PLL输出给CPU分频的大小。当PLL无连接时,CCLKCFG取值为1。CCLKSEL取值为0,1,3,5……255。此值加1为实际分频大小。


    USB Clock Configuration register (USBCLKCFG),配置寄存器控制PLL输出给USB分频的大小。当PLL无连接时,CCLKCFG取值为1。USBCLKCFG取值为0,1,2,3,4,5,6,7。此值加1为实际分频大小。


    IRC Trim Register (IRCTRIM) 该寄存器是用来调整片内的4 MHz振荡器。
Peripheral Clock Selection registers 0 and 1 (PCLKSEL0  and PCLKSEL1)该寄存器用来设置外围模块的时钟。(数据手册P58)

 

文章评论3条评论)

登录后参与讨论

用户1277994 2011-1-7 14:40

好的,谢谢博主的原创! 我已经将您设为专家博客了。为了让工程师朋友和编辑更好地与您交流,您还是更新一下个人资料吧,包括个人头相。

用户1584511 2011-1-7 11:59

是原创的,可能有不足之处,欢迎指点!!

用户1277994 2011-1-7 08:59

博主文章是原创的吗?请更新下个人资料吧。

相关推荐阅读
用户1584511 2011-04-28 13:56
关于离职
犹豫不安,思前顾后,让自己徘徊了一些日子。最终还是选择离开,第一份工作画上了句号。虽然他并不是很成功,但或多或少还是为自己之后的生活积累了经验。到此为止整整一年的时间,这一年中我做了些什么,有时候会恨...
用户1584511 2011-02-25 11:21
can总线应用问题
本人想通过开发一个代理程序,实现对CAN网络的管理监视,需要找到一种方法来确定CAN总线网络当前运行节点个数。 但是现在有个难题,基于目前CAN总线中传输的报文,我无法确定目前网络中节点的个数?如果运...
用户1584511 2011-01-28 16:42
位段
C语言中对内存存取信息一般以字节为单位。实际上,有时一个信息用不了那么多位,因此C语言中允许在一个结构体中以位为单位来指定其成员所占内存长度,这种以位为单位的成员称为“位段”或“位域”。利用位段能够用...
用户1584511 2011-01-27 15:44
中断向量控制器
ARM7TDMI内核具有两个中断输入,分别为IRQ中断和FIQ中断。中断向量控制器不是ARM设计的,ARM只提供以上两个中断输入接口,中断向量控制器是由各个厂商根据自己的实际情况设计的。下面介绍的是...
用户1584511 2011-01-26 08:55
存储器加速模块
存储器加速模块产生的原因:LPC2114/2124/2210/2212/2214微控制器的ARM内核工作在最高频率60MHz时,执行一条指令约为17ns。而Flash存储器的访问周期需要50ns,...
用户1584511 2011-01-26 08:54
用Typedef定义类型
C语言中可以用typedef声明新的类型名来代替已有的类型名。例如:typedef int INTEGER,指定用INTEGER代替int。 声明一个新的类型名的方法: 1、先按定义变量的...
我要评论
3
10
关闭 站长推荐上一条 /2 下一条