系统时钟:MPLLCON设置

JZ2440开发板(ARM920T):

在做系统时钟实验时,发现在设置LOCKTIME、CLKDIVN、异步总线模式转换和MPLLCON之间要有足够的间隔时间,否则系统时钟不能正常倍频和分频。

void clock_init(void)

{

     LOCKTIME = 0x02000200;    

CLKDIVN = 0x03; 

/*快速总线模式转到异步总线模式*/

__asm__(

        "mrc p15, 0, r1, c1, c0, 0\n"

        "orr r1, r1, #0xc0000000\n"

        "mcr p15, 0, r1, c1, c0, 0\n"

);

    MPLLCON = (0x5c << 12) | (0x01 << 4) | (0x02 << 0);

}


我尝试了2种解决办法:


1、中间加一句循环语句:“for (i = 0; i < 100; i++);” 

void clock_init(void)

{

     int i;

     LOCKTIME = 0x02000200;    

CLKDIVN = 0x03; 

/*快速总线模式转到异步总线模式*/

     __asm__(

        "mrc p15, 0, r1, c1, c0, 0\n"

        "orr r1, r1, #0xc0000000\n"

        "mcr p15, 0, r1, c1, c0, 0\n"

     );

     for (i = 0; i < 100; i++);

     MPLLCON = (0x5c << 12) | (0x01 << 4) | (0x02 << 0);

}


2、修改嵌入式汇编和MPLLCON设置的顺序

void clock_init(void)

{

     LOCKTIME = 0x02000200;    

CLKDIVN = 0x03;

MPLLCON = (0x5c << 12) | (0x01 << 4) | (0x02 << 0);

 

/*快速总线模式转到异步总线模式*/

     __asm__(

         "mrc p15, 0, r1, c1, c0, 0\n"

         "orr r1, r1, #0xc0000000\n"

         "mcr p15, 0, r1, c1, c0, 0\n"

     );

}

 

阅读更多
下一篇GNU C 扩展
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页

关闭
关闭