[ZLG-ARM] 有关lpc2132从掉电醒来后重设置pll的问题

[复制链接]
2955|6
 楼主| syzhou1314 发表于 2007-10-16 16:55 | 显示全部楼层 |阅读模式
大家好:<br />&nbsp;&nbsp;&nbsp;&nbsp;现有一项目,其中为了节能要每隔大概200ms让lpc2132掉电一次(1s后由RTC唤醒),程序运行的时候设置的cpu工作频率是Fcclk=48mhz,Pclk=Pcclk,所以醒来后不能用lpc2132默认的配置,要重新连接pll,我是在醒来后调用了一个重设置pll的函数void&nbsp;Pll_ReConnect(void),其内容是从target.c中拷贝过来的,如下所示,但是系统运行大概经过几十次掉电、醒来后就会死在等待连接成功的地方“while((PLLSTAT&nbsp;&&nbsp;(1&nbsp;&lt&lt&nbsp;10))&nbsp;==&nbsp;0);”<br />以下是该函数的内容和config.h中的设置:<br />void&nbsp;Pll_ReConnect(void)<br />{<br />PLLCON&nbsp;=&nbsp;1;<br />#if&nbsp;(Fpclk&nbsp;/&nbsp;(Fcclk&nbsp;/&nbsp;4))&nbsp;==&nbsp;1<br />&nbsp;&nbsp;&nbsp;&nbsp;VPBDIV&nbsp;=&nbsp;0;<br />#endif<br />#if&nbsp;(Fpclk&nbsp;/&nbsp;(Fcclk&nbsp;/&nbsp;4))&nbsp;==&nbsp;2<br />&nbsp;&nbsp;&nbsp;&nbsp;VPBDIV&nbsp;=&nbsp;2;<br />#endif<br />#if&nbsp;(Fpclk&nbsp;/&nbsp;(Fcclk&nbsp;/&nbsp;4))&nbsp;==&nbsp;4<br />&nbsp;&nbsp;&nbsp;&nbsp;VPBDIV&nbsp;=&nbsp;1;<br />#endif<br /><br />#if&nbsp;(Fcco&nbsp;/&nbsp;Fcclk)&nbsp;==&nbsp;2<br />&nbsp;&nbsp;&nbsp;&nbsp;PLLCFG&nbsp;=&nbsp;((Fcclk&nbsp;/&nbsp;Fosc)&nbsp;-&nbsp;1)&nbsp;|&nbsp;(0&nbsp;&lt&lt&nbsp;5);<br />#endif<br />#if&nbsp;(Fcco&nbsp;/&nbsp;Fcclk)&nbsp;==&nbsp;4<br />&nbsp;&nbsp;&nbsp;&nbsp;PLLCFG&nbsp;=&nbsp;((Fcclk&nbsp;/&nbsp;Fosc)&nbsp;-&nbsp;1)&nbsp;|&nbsp;(1&nbsp;&lt&lt&nbsp;5);<br />#endif<br />#if&nbsp;(Fcco&nbsp;/&nbsp;Fcclk)&nbsp;==&nbsp;8<br />&nbsp;&nbsp;&nbsp;&nbsp;PLLCFG&nbsp;=&nbsp;((Fcclk&nbsp;/&nbsp;Fosc)&nbsp;-&nbsp;1)&nbsp;|&nbsp;(2&nbsp;&lt&lt&nbsp;5);<br />#endif<br />#if&nbsp;(Fcco&nbsp;/&nbsp;Fcclk)&nbsp;==&nbsp;16<br />&nbsp;&nbsp;&nbsp;&nbsp;PLLCFG&nbsp;=&nbsp;((Fcclk&nbsp;/&nbsp;Fosc)&nbsp;-&nbsp;1)&nbsp;|&nbsp;(3&nbsp;&lt&lt&nbsp;5);<br />#endif<br />&nbsp;&nbsp;&nbsp;&nbsp;PLLFEED&nbsp;=&nbsp;0xaa;<br />&nbsp;&nbsp;&nbsp;&nbsp;PLLFEED&nbsp;=&nbsp;0x55;<br />&nbsp;&nbsp;&nbsp;&nbsp;while((PLLSTAT&nbsp;&&nbsp;(1&nbsp;&lt&lt&nbsp;10))&nbsp;==&nbsp;0);<br />&nbsp;&nbsp;&nbsp;&nbsp;PLLCON&nbsp;=&nbsp;3;<br />&nbsp;&nbsp;&nbsp;&nbsp;PLLFEED&nbsp;=&nbsp;0xaa;<br />&nbsp;&nbsp;&nbsp;&nbsp;PLLFEED&nbsp;=&nbsp;0x55;<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;while((PLLSTAT&nbsp;&&nbsp;(1&nbsp;&lt&lt&nbsp;10))&nbsp;==&nbsp;0);<br />&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;PLLCON&nbsp;=&nbsp;3;<br />&nbsp;&nbsp;&nbsp;&nbsp;PLLFEED&nbsp;=&nbsp;0xaa;<br />&nbsp;&nbsp;&nbsp;&nbsp;PLLFEED&nbsp;=&nbsp;0x55;<br />}<br /><br />#define&nbsp;Fosc&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;12000000&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//Crystal&nbsp;frequence,10MHz~25MHz,should&nbsp;be&nbsp;the&nbsp;same&nbsp;as&nbsp;actual&nbsp;status.&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//应当与实际一至晶振频率,10MHz~25MHz,应当与实际一至<br />#define&nbsp;Fcclk&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(Fosc&nbsp;*&nbsp;4)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//System&nbsp;frequence,should&nbsp;be&nbsp;(1~32)multiples&nbsp;of&nbsp;Fosc,and&nbsp;should&nbsp;be&nbsp;equal&nbsp;or&nbsp;less&nbsp;&nbsp;than&nbsp;60MHz.&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//系统频率,必须为Fosc的整数倍(1~32),且&lt=60MHZ<br />#define&nbsp;Fcco&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(Fcclk&nbsp;*&nbsp;4)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//CCO&nbsp;frequence,should&nbsp;be&nbsp;2、4、8、16&nbsp;multiples&nbsp;of&nbsp;Fcclk,&nbsp;ranged&nbsp;from&nbsp;156MHz&nbsp;to&nbsp;320MHz.&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//CCO频率,必须为Fcclk的2、4、8、16倍,范围为156MHz~320MHz<br />#define&nbsp;Fpclk&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(Fcclk&nbsp;/&nbsp;4)&nbsp;*&nbsp;4&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//VPB&nbsp;clock&nbsp;frequence&nbsp;,&nbsp;must&nbsp;be&nbsp;1、2、4&nbsp;multiples&nbsp;of&nbsp;(Fcclk&nbsp;/&nbsp;4).<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//VPB时钟频率,只能为(Fcclk&nbsp;/&nbsp;4)的1、2、4倍<br /><br />#include&nbsp;&nbsp;&nbsp;&nbsp;&quot;target.h&quot;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//This&nbsp;line&nbsp;may&nbsp;not&nbsp;be&nbsp;deleted&nbsp;这一句不能删除<br /><br />#endif<br /><br /><br />是不是这个pll不能如此频繁的重设置?请各位指教!谢谢
 楼主| syzhou1314 发表于 2007-10-17 09:00 | 显示全部楼层

自己顶一下

  
 楼主| syzhou1314 发表于 2007-10-17 11:15 | 显示全部楼层

等待

现在发现除了上述问题外,有时候即使while((PLLSTAT&nbsp;&&nbsp;(1&nbsp;&lt&lt&nbsp;10))&nbsp;==&nbsp;0);”通过后运行时PLLSTAT的第十位(PLOCK,PLL的锁定状态,0未锁定,1锁定到指定的频率)也会变成0.
 楼主| syzhou1314 发表于 2007-10-17 12:14 | 显示全部楼层

重连接用过下面的也不行<br />void&nbsp;Pll_ReConnect(void)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;PLLCON=1;//<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;VPBDIV&nbsp;=&nbsp;1;<br />&nbsp;&nbsp;&nbsp;&nbsp;PLLCFG=0x03;<br />&nbsp;&nbsp;&nbsp;&nbsp;PLLFEED=0xaa;<br />&nbsp;&nbsp;&nbsp;&nbsp;PLLFEED=0x55;<br />&nbsp;&nbsp;&nbsp;&nbsp;PLLFEED&nbsp;=&nbsp;0xaa;<br />&nbsp;&nbsp;&nbsp;&nbsp;PLLFEED&nbsp;=&nbsp;0x55;<br />&nbsp;&nbsp;&nbsp;&nbsp;while((PLLSTAT&nbsp;&&nbsp;(1&nbsp;&lt&lt&nbsp;10))&nbsp;==&nbsp;0);<br />&nbsp;&nbsp;&nbsp;&nbsp;PLLCON&nbsp;=&nbsp;3;<br />&nbsp;&nbsp;&nbsp;&nbsp;PLLFEED&nbsp;=&nbsp;0xaa;<br />&nbsp;&nbsp;&nbsp;&nbsp;PLLFEED&nbsp;=&nbsp;0x55;<br />}
 楼主| syzhou1314 发表于 2007-10-17 14:41 | 显示全部楼层

频繁设置

现在发现把掉电的语句去掉,只是每次都重新设置一下PLL也会出现以上情况,可能是频繁设置的问题!<br />另外我用的外部晶振是12Mhz的.
 楼主| syzhou1314 发表于 2007-10-30 16:35 | 显示全部楼层

问题解决

问题已经解决,原因是在重新设置PLL的时候可能有中断产生.现在是:<br />void&nbsp;Pll_ReConnect(void)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;IRQDisable();<br />&nbsp;&nbsp;&nbsp;&nbsp;PLLCON=1;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;PLLCFG=0x23;<br />&nbsp;&nbsp;&nbsp;&nbsp;//VPBDIV&nbsp;=&nbsp;1;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;PLLFEED=0xaa;<br />&nbsp;&nbsp;&nbsp;&nbsp;PLLFEED=0x55;<br />&nbsp;&nbsp;&nbsp;&nbsp;while((PLLSTAT&nbsp;&&nbsp;(1&nbsp;&lt&lt&nbsp;10))&nbsp;==&nbsp;0);<br />&nbsp;&nbsp;&nbsp;&nbsp;PLLCON&nbsp;=&nbsp;3;<br />&nbsp;&nbsp;&nbsp;&nbsp;PLLFEED&nbsp;=&nbsp;0xaa;<br />&nbsp;&nbsp;&nbsp;&nbsp;PLLFEED&nbsp;=&nbsp;0x55;<br />&nbsp;&nbsp;&nbsp;&nbsp;IRQEnable();<br />}<br />
Ohman 发表于 2008-1-26 23:19 | 显示全部楼层

多谢,这个烦了我两天

多谢,这个烦了我两天
您需要登录后才可以回帖 登录 | 注册

本版积分规则

19

主题

61

帖子

2

粉丝
快速回复 在线客服 返回列表 返回顶部