现在的位置: 首页 > 综合 > 正文

uclinux-2008R1-RC8(bf561)到VDSP5的移植(41):PLL造成的困扰

2013年09月09日 ⁄ 综合 ⁄ 共 1591字 ⁄ 字号 评论关闭
 

  
出现一个很奇怪的问题:
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核运行就可以搞定这个问题。
 
哈哈!

抱歉!评论已关闭.