📄 pll.c
字号:
/*****************************************
NAME: PLL.C
DESC: PLL test
HISTORY:
2003.04.12 : ver 0.0
******************************************/
#include <math.h>
#include <stdlib.h>
#include "def.h"
#include "option.h"
#include "24a0addr.h"
#include "24a0lib.h"
#include "24a0slib.h"
#include "pll.h"
void Test_PLL(void)
{
int i,j,k;
unsigned int saveCLKDIVN,saveMPLLCON;
U32 mps[][6]={
// 1:1:1
/* 50000000, 42,1,2,0,0, //FCLK,MDIV,PDIV,SDIV,HCLKdiv,PCLKdiv
56000000, 48,1,2,0,0,
67000000, 59,1,2,0,0,
79000000, 71,4,1,0,0,
//84000000, 76,4,1,0,0,
//90000000, 82,4,1,0,0,
*/
// 1:1:2
/*
84000000, 76,4,1,0,1,
90000000, 82,4,1,0,1,
96000000, 56,2,1,0,1,
101000000, 93,4,1,0,1,
113000000,105,4,1,0,1,
118000000, 51,1,1,0,1,
124000000, 54,1,1,0,1,
135000000, 82,2,1,0,1,
*/ //147000000, 41,2,0,0,1,
//152000000, 68,4,0,0,1,
//158000000, 71,4,0,0,1,
// 1:2:2
//84000000, 76,4,1,1,0,
//90000000, 82,4,1,1,0,
//96000000, 56,2,1,1,0,
//101000000, 93,4,1,1,0,
//113000000,105,4,1,1,0,
//118000000, 51,1,1,1,0,
//124000000, 54,1,1,1,0,
//135000000, 82,2,1,1,0,
//147000000, 41,2,0,1,0,
//152000000, 68,4,0,1,0,
//158000000, 71,4,0,1,0,
// 1:2:4
152000000, 30,1,0,1,0,
156000000, 31,1,0,1,0,
160000000, 32,1,0,1,1,
164000000, 33,1,0,1,1,
168000000, 34,1,0,1,0,
172000000, 35,1,0,1,0,
176000000, 36,1,0,1,0,
180000000, 37,1,0,1,0,
184000000, 38,1,0,1,0,
188000000, 39,1,0,1,0,
192000000, 40,1,0,1,0,
196000000, 41,1,0,1,0,
200000000, 42,1,0,1,0,
/*
204000000, 43,1,0,1,0,
208000000, 44,1,0,1,0,
212000000, 45,1,0,1,0,
216000000, 46,1,0,1,0,
220000000, 47,1,0,1,0,
224000000, 48,1,0,1,0,
228000000, 49,1,0,1,0,
232000000, 50,1,0,1,0,
236000000, 51,1,0,1,0,
240000000, 52,1,0,1,0,
244000000, 53,1,0,1,0,
248000000, 54,1,0,1,0,
252000000, 55,1,0,1,0,
256000000, 56,1,0,1,0,
260000000, 57,1,0,1,0,
264000000, 58,1,0,1,0,
268000000, 59,1,0,1,0,
*/
/*
170000000, 77,4,0,1,1,
180000000, 82,4,0,1,1,
186000000, 85,4,0,1,1,
192000000, 56,2,0,1,1,
202000000, 93,4,0,1,1,
214000000, 99,4,0,1,1,
220000000, 47,1,0,1,1,
226000000,105,4,0,1,1,
237000000, 71,2,0,1,1,
*/
};
saveCLKDIVN=rCLKDIVN;
saveMPLLCON=rMPLLCON;
LcdEnvidOnOff(0);
Uart_Printf("[PLL frequency change test]\n");
Uart_TxEmpty(0);
//rLOCKTIME=(3602<<16)|(0xfff<<0); // 3602 is about 300us at 12Mhz
rLOCKTIME=0; // 3602 is about 300us at 12Mhz
rCLKCON &= ~(1<<1);
Uart_Printf("LOCKTIME:0x%x, CLKCON:0x%x\n", rLOCKTIME, rCLKCON);
srand(0); //Set a random starting point
// for(j=0;j<100000;j++)
j=k=0;
while(!Uart_GetKey())
{
i=rand()/(float)RAND_MAX*(sizeof(mps)/24);
//Uart_Printf("\nFCLK=%d",mps[i][0]);
Uart_TxEmpty(0);
if((mps[i][4]==0)&&(mps[i][5]==0))
{
ChangeMPllValue(mps[i][1],mps[i][2],mps[i][3]); //Set MPS first
ChangeClockDivider(0,0); //And then set divider
}
else
{
ChangeClockDivider(mps[i][4],mps[i][5]);
ChangeMPllValue(mps[i][1],mps[i][2],mps[i][3]);
}
Uart_Init((mps[i][0]/(mps[i][4]+1))/(mps[i][5]+1),115200); //PCLK, Baud Rate
//Uart_Printf(".");
j++;
if(j==1000) {Uart_Printf("%d-th iteration!\n", k++); j=0;}
//Uart_Printf("...I'm running in changed FCLK...\n");
}
rCLKDIVN=saveCLKDIVN;
rMPLLCON=saveMPLLCON;
Uart_Init(PCLK,115200);
LcdEnvidOnOff(1);
}
void ChangePLL(void)
{
int i, pdiv, mdiv, sdiv, HCLKdiv, PCLKdiv, fclk;
Uart_Printf("[Running change test of M/P/S value]\n");
Uart_Printf("Input FCLK vlaue\n");
fclk=Uart_GetIntNum();
Uart_Printf("Input M vlaue\n");
mdiv=Uart_GetIntNum();
Uart_Printf("Input P vlaue\n");
pdiv=Uart_GetIntNum();
Uart_Printf("Input S vlaue\n");
sdiv=Uart_GetIntNum();
Uart_Printf("Input HCLKdiv(0 or 1)\n");
HCLKdiv=Uart_GetIntNum();
Uart_Printf("Input PCLKdiv(0 or 1)\n");
PCLKdiv=Uart_GetIntNum();
Uart_Printf("fclk=%d,Mdiv=%d,Pdiv=%d,Sdiv=%d,HCLKdiv=%d,PCLKdiv=%d\n",fclk*1000000,mdiv,pdiv,sdiv,HCLKdiv,PCLKdiv);
Uart_Printf("Now change PLL value\n");
Uart_TxEmpty(0);
PreChangeSdramParameter();
if((HCLKdiv==0)&&(PCLKdiv==0))
{
ChangeMPllValue(mdiv,pdiv,sdiv); //Set MPS first
ChangeClockDivider(0,0); //And then set divider
}
else
{
ChangeClockDivider(HCLKdiv,PCLKdiv);
ChangeMPllValue(mdiv,pdiv,sdiv);
}
ChangeSdramParameter( fclk*1000000/(HCLKdiv+1) );
Uart_Init((fclk*1000000/(HCLKdiv+1))/(PCLKdiv+1),115200); //PCLK, Baud Rate
Uart_Printf("FCLK=%dMHz,HCLK=%dMHz,PCLK=%dMHz\n",fclk,(fclk/(HCLKdiv+1)),(fclk/(HCLKdiv+1))/(PCLKdiv+1));
Uart_Printf("...I'm running in changed FCLK...\n");
dhrystone21();
}
void Test_PllOnOff(void)
{
int i,j,k;
unsigned int saveLCD,saveREFRESH;
rLOCKTIME=(3602<<16)|(3602<<0); // 3602 is about 300us at 12Mhz
Uart_Printf("[PLL On/Off test]\n");
Uart_TxEmpty(0); //To avoid being crushed the character
LcdEnvidOnOff(0);
for(j=0;j<1000;j++)
{
rCLKSRC=(0<<8)|(0<<7)|(1<<5)|(1<<4)|(0); // OnOSC_EN disable,U_PLL on,M_PLL off,External clk,Divider=0
/* For safety
rCLKSRC= (0<<8)|(0<<7)|(0<<5)|(0<<4)|(0);
rCLKSRC=(0<<8)|(0<<7)|(0<<5)|(1<<4)|(0);
rCLKSRC=(0<<8)|(0<<7)|(1<<5)|(1<<4)|(0);
*/
saveREFRESH=rSDRAM_REFRESH;
rSDRAM_REFRESH=7.8*(FIN/1000000); // Period= 7.8us
//The other memory control register should be optimized for SLOW mode.
//saveLCD=rLCDCON1;
//rLCDCON1=rLCDCON1&~(0x3ff<<8)|(1<<8); // Change LCD CLKVAL
rCLKSRC=(0<<8)|(0<<7)|(0<<5)|(1<<4)|(0); // OnOSC_EN disable,U_PLL on,M_PLL on,External clk,Divider=0
for(i=0;i<2048;i++); //S/W MPLL lock-time
//rLCDCON1=saveLCD;
rSDRAM_REFRESH=saveREFRESH;
rCLKSRC=(0<<8)|(0<<7)|(0<<5)|(0<<4)|(0); // OnOSC_EN disable,U_PLL on,M_PLL on,MPLL_clk,Divider=0
Uart_Printf(".");
Uart_TxEmpty(0); //To avoid being crushed the character
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -