![]() |
|
||||||||||||||
| | 首页 | 新闻 | 文库 | 方案 | 技术 | 独家 | 座谈 | 下载 | 电路图 | 开发套件 | 仿真器 | 邮购 | 帮助 | VIP会员 | 芯片代购 | | ||
|
||
|
|||||
| uclinux-2008R1-RC8(bf561)到VDSP5的移植(41):PLL造成的困扰 | |||||
作者:快乐虾 文章来源:http://blog.csdn.net/lights_joy 点击数: 更新时间:2008-6-4 ![]() |
|||||
|
出现一个很奇怪的问题:
DSP上电后直接在仿真器上运行uclinux内核,串口无法接收到正常输出,仅有一两个异常字符。但是用VDSP4.5运行原来写的一个串口程序,可以正常输出。
第一个郁闷的问题在于这个串口程序运行过一遍之后,再怎么运行uclinux内核都没有问题(除非断电)。中断后比较这两个程序的UART_*相关的寄存器配置,完全相同。况且前后两次运行uclinux,程序没有任何变动,应该跟配置没有关系才对。比较PLL的配置也是完全相同的(27M晶振,594M CCLK,99M SCLK)。
第二个郁闷的问题是,如果把uclinux内核编译成ldr文件烧到flash上,也没有任何问题。
究其原因,在head.s中有一段对PLL进行设置的代码:
r0 = CONFIG_VCO_MULT & 63; /* Load the VCO multiplier */
r0 = r0 << 9; /* Shift it over, */
r1 = CLKIN_HALF; /* Do we need to divide CLKIN by 2?*/
r0 = r1 | r0;
r1 = PLL_BYPASS; /* Bypass the PLL? */
r1 = r1 << 8; /* Shift it over */
r0 = r1 | r0; /* add them all together */
p0.h = hi(PLL_CTL);
p0.l = lo(PLL_CTL); /* Load the address */
cli r2; /* Disable interrupts */
ssync;
w[p0] = r0.l; /* Set the value */
ssync;
idle; /* Wait for the PLL to stablize */
sti r2; /* Enable interrupts */
程序运行到这里时,PLL设置并没有真正起作用,虽然寄存器的值改了。
在VDSP手册上有一段说明:
Note: In order to program the PLL, both cores must be in an idled state. Alternatively, it is acceptable for core B to be in the “SRAM init” state that it enters after processor reset. For more information about this state, refer to "Booting Methods" on another page.
在VDSP环境下,B核实际是处于Fullon状态,而设置PLL时要求B核没有运行或者处于IDLE状态。
原来的串口程序是两个核都使用了的。这样正确运行一次之后,即使后面的PLL设置没有成功也没什么关系。
烧写到flash之后,B核并没有运行,因此PLL的设置也是成功的!
知道原因后就容易解决了:
在仿真器下运行时,为B核加上一条IDLE指令并先于A核运行就可以搞定这个问题。
|
|||||
| 文章录入:admin 责任编辑:admin | |||||
| 【发表评论】【加入收藏】【告诉好友】【打印此文】【关闭窗口】 | |||||
| 网友评论:(只显示最新10条。评论内容只代表网友观点,与本站立场无关!) |
| | 本站介绍 | 合作联络 | 欢迎投稿 | 广告业务 | 网站地图 | 设为首页 | 加入收藏 | 友情链接 | 网站公告 | 联系我们 | | |||
|