在 BF518安装样例中,一般使用init_PLL()来初始化PLL,但我现在想用set_PLL()来设置,但效果不一样?
两个函数代码如下。希望高手指点一下其差别???
/*******************************************************************
* Function: Init_PLL
* Description: initializes the PLL registers
*******************************************************************/
void Init_PLL(void)
{
u32 SIC_IWR1_reg; /* backup SIC_IWR1 register */
/* use Blackfin ROM SysControl() to change the PLL */
ADI_SYSCTRL_VALUES sysctrl ={ VRCTL_VALUE,//0x0000
PLLCTL_VALUE,//0x2000 /* (25MHz CLKIN x (MSEL=16))::CCLK = 400MHz */
PLLDIV_VALUE,//0x0005 /* (400MHz/(SSEL=5))::SCLK = 80MHz */
PLLLOCKCNT_VALUE,//0x0000
PLLSTAT_VALUE };//0x0000
SIC_IWR1_reg = *pSIC_IWR1;
*pSIC_IWR1 = 0;
/* use the ROM function */
bfrom_SysControl( SYSCTRL_WRITE | SYSCTRL_PLLCTL | SYSCTRL_PLLDIV, &sysctrl, NULL);
*pSIC_IWR1 = SIC_IWR1_reg; /* restore SIC_IWR1 due to anomaly 05-00-0432 */
}
而我们一般使用 的set_PLL()是:
void Set_PLL(int pmsel,int pssel)
{
int new_PLL_CTL;
*pPLL_DIV = pssel;
asm("ssync;");
new_PLL_CTL = (pmsel & 0x3f) << 9;
*pSIC_IWR |= 0xffffffff;
if (new_PLL_CTL != *pPLL_CTL)
{
*pPLL_CTL = new_PLL_CTL;
asm("ssync;");
asm("idle;");
}
}