📄 clock_test.c
字号:
//Choose Operating Mode.
printf("\nChoose System Operating Mode : 0:Sync Mode, 1:Async Mode : ");
uOPType = GetIntNum();
//CLK_OUT Pad => HCLK
SYSC_CtrlCLKOUT(eCLKOUT_APLLOUT, 9);
uLockTime = 100;
SYSC_SetLockTime(eAPLL, uLockTime);
SYSC_SetLockTime(eMPLL, uLockTime);
// Test Point....
GPIO_SetFunctionEach(eGPIO_N, eGPIO_9, 1); // EINT9 : Output pad
switch(uOPType)
{
case 0:
printf("[Selected Sync. Mode Operation]\n");
SYSC_ChangeMode(eSYNC_MODE);
uRegValue0_bk = Inp32SYSC(0xC); // APLL_CON
uRegValue1_bk = Inp32SYSC(0x10); // MPLL CON
uRegValue2_bk = Inp32SYSC(0x1C); // Clock Source Register
uRegValue3_bk = Inp32SYSC(0x20); // Clock Divider value
break;
case 1:
printf("Selected Async Mode Operation\n");
//SYSC_ChangeMode(eASYNC_MODE);
uRegValue0_bk = Inp32SYSC(0xC); // APLL_CON
uRegValue1_bk = Inp32SYSC(0x10); // MPLL CON
uRegValue2_bk = Inp32SYSC(0x1C); //Clock Source Register
uRegValue3_bk = Inp32SYSC(0x20); // Clock Divider value
break;
}
uTestCount = 0;
uTestErr=0;
INTC_SetVectAddr(NUM_RTC_TIC,Isr_RTC_Tick1);
INTC_Enable(NUM_RTC_TIC);
uTemp = Inp32SYSC(0x20);
uTemp = (1<<12)|(0<<9)|(1<<8)|(1<<4)|(0<<0); // ARM:HCLKx2:HCLK:PCLK = 1:1:2:2
uTemp1 = Inp32SYSC(0x1C); //Clock Source Register
uTemp1 = uTemp1 & ~(0x7) | 0x0;
for(uMval=390; uMval<411; uMval++)
{
printf(" M-Div Value : %d \n", uMval);
printf(" ============================ \n");
UART_TxEmpty();
uTestCount = 0;
uTestErr=0;
while(1)
{
if(UART_GetKey()!=0x0)
break;
if(uTestCount>5000)
{
printf(" End of test = M-Div Value : %d\n", uMval);
printf("PLL ON/OFF Test - Test Count: %d, Error: %d\n", uTestCount, uTestErr);
break;
}
if(uTestErr>1000)
{
printf(" M-Div Value : %d\n", uMval);
printf("PLL ON/OFF Fail - Test Count: %d, Error: %d\n", uTestCount, uTestErr);
break;
}
// if ((uTestCount%100)==0)
if ((uTestCount%100)==0)
{
DisplayLED(uTestCount/100);
}
if ((uTestCount%500)==0)
{
DisplayLED(uTestCount/100);
SYSC_GetClkInform();
UART_InitDebugCh(0, 115200);
Delay(10);
printf("Test Count : %d, Error: %d \n", uTestCount, uTestErr);
UART_TxEmpty();
}
// ON&OFF Test
//for(i=0;i<10000;i++) {
//isplayLED(0x2);
g_RTC_ALM =0;
Outp32SYSC(0x1C, uTemp1); // Clock Source Change
Outp32SYSC(0x20, uTemp); // Change Divide Value
SYSC_StopPLL(eAPLL);
//Outp32SYSC(0xC, 0x0); // Temp Test
//SYSC_StopPLL(eMPLL);
//GPIO_SetDataEach(eGPIO_N, eGPIO_9, 0);
//UART_Getc();
// No Delay ~= 0.2ms
Delay(10); // Stop Time ~= 34ms
//Delay(1); // Stop Time ~=3.5ms
//Delay(200); // Stop Time ~= 667ms
//Delay(400);
GPIO_SetDataEach(eGPIO_N, eGPIO_9, 0);
//DisplayLED(0x8);
/////////////////////// M Divider
SYSC_SetPLL(eAPLL, uMval, 3, 2, 0); // 800MHz
//SYSC_SetPLL(eAPLL, 392, 3, 2, 0); // 800MHz, => Fail
//SYSC_SetPLL(eAPLL, 393, 3, 2, 0); // 800MHz => Fail (1/8000)
//SYSC_SetPLL(eAPLL, 394, 3, 2, 0); // 800MHz = PASS
//SYSC_SetPLL(eAPLL, 395, 3, 2, 0); // 800MHz => PASS
//SYSC_SetPLL(eAPLL, 396, 3, 2, 0); // 800MHz => PASS
//SYSC_SetPLL(eAPLL, 397, 3, 2, 0); // 800MHz => PASS
//SYSC_SetPLL(eAPLL, 398, 3, 2, 0); // 800MHz
//SYSC_SetPLL(eAPLL, 399, 3, 2, 0); // 800MHz
//SYSC_SetPLL(eAPLL, 400, 3, 2, 0); // 800MHz
//SYSC_SetPLL(eAPLL, 401, 3, 2, 0); // 800MHz
//SYSC_SetPLL(eAPLL, 402, 3, 2, 0); // 800MHz
//SYSC_SetPLL(eAPLL, 403, 3, 2, 0); // 800MHz
//SYSC_SetPLL(eAPLL, 404, 3, 2, 0); // 800MHz
//SYSC_SetPLL(eAPLL, 405, 3, 2, 0); // 800MHz
//SYSC_SetPLL(eAPLL, 406, 3, 2, 0); // 800MHz
//SYSC_SetPLL(eAPLL, 407, 3, 2, 0); // 800MHz
//SYSC_SetPLL(eAPLL, 408, 3, 2, 0); // 800MHz
//SYSC_SetPLL(eAPLL, 409, 3, 2, 0); // 800MHz
//SYSC_SetPLL(eAPLL, 410, 3, 2, 0); // 800MHz
//Delay(50); // 1st Test ~=170ms
//Delay(1); // Test = 3ms
GPIO_SetDataEach(eGPIO_N, eGPIO_9, 1);
Outp32SYSC(0x20, uRegValue3_bk); // Change Divide Value
Outp32SYSC(0x1C, uRegValue2_bk); // Clock Source Change
Delay(100); // 100us
//UART_Getc();
SYSC_GetClkInform();
UART_InitDebugCh(0, 115200);
RTC_SetCON(0,0,0,0,0,1);
RTC_SetTime(InitYEAR,InitMONTH,InitDATE,InitDAY,InitHOUR,InitMIN,InitSEC);
RTC_SetTickCNT(100);
RTC_SetCON(0,0,0,0,0,0); // Tick Clock = 128Hz?
RTC_ClearIntP(0);
StartTimer(0);
RTC_SetCON(1,0,0,0,0,1);
while(g_RTC_ALM==0);
uTestTime=StopTimer(0);
//printf("%d: uTestTime = %d \n",uTestCount, uTestTime);
RTC_SetCON(0,0,0,0,0,0);
#if 1
if((uTestTime<3050)||(uTestTime>3150))
//if((uTestTime<1000)||(uTestTime>1050))
{
// printf("\nTest Count : %d, Error: %d \n", uTestCount, uTestErr);
uTestErr++;
DisplayLED(0xF);
// UART_Getc();
}
#endif
//SYSC_GetClkInform();
//UART_InitDebugCh(0, 115200);
//MemoryRWTest();
// UART_Getc();
uTestCount++;
Delay(100);
//GPIO_SetFunctionEach(eGPIO_F, eGPIO_14, 1);
}
Outp32SYSC(0xC, uRegValue0_bk);
Outp32SYSC(0x10, uRegValue1_bk);
Outp32SYSC(0x20, uRegValue3_bk);
Outp32SYSC(0x1C, uRegValue2_bk);
SYSC_GetClkInform();
UART_InitDebugCh(0, 115200);
}
/*
Outp32SYSC(0xC, uRegValue0_bk);
Outp32SYSC(0x10, uRegValue1_bk);
Outp32SYSC(0x20, uRegValue3_bk);
Outp32SYSC(0x1C, uRegValue2_bk);
SYSC_GetClkInform();
UART_InitDebugCh(0, 115200);
*/
}
//////////
// File Name : Test_ManChangeCLKDivider
// File Description : This function is for the Clock Divider
//
// Input :
//
//
// Output : NONE
// Version :
void Test_ManChangeCLKDivider(void)
{
u32 uRegValue0_bk;
u32 uARatio, uHx2Ratio, uPRatio;
u32 i, uTestType,uTestCount;
SYSC_CtrlCLKOUT(eCLKOUT_HCLK, 9);
printf("[Clock Dividerl Change - This is only for test..]\n");
// Current Clock Information
SYSC_GetClkInform();
printf("Current Clock Information \n");
printf("ARMCLK: %.2fMHz HCLKx2: %.2fMHz HCLK: %.2fMHz PCLK: %.2fMHz\n",(float)g_ARMCLK/1.0e6, (float)g_HCLKx2/1.0e6, (float)g_HCLK/1.0e6, (float)g_PCLK/1.0e6);
printf("============================ \n");
// Save Clock Divider Value
uRegValue0_bk = Inp32SYSC(0x20); // Clock Divider value
// CLK Output PAD Enable
GPIO_SetFunctionEach(eGPIO_F, eGPIO_14, 3);
printf("\nEnter the APLL_Ratio Value( 0~7) : ");
uARatio = GetIntNum();
printf("\nEnter the HCLKx2 Ratio Value(HCLKx2=APLL_OUT/HCLKx2_Ratio)( 0~7) : ");
uHx2Ratio = GetIntNum();
printf("\nEnter the PCLK Ratio Value (PCLK=HCLKx2/PCLK_Ratio)(Odd Number 1~15) : ");
uPRatio = GetIntNum();
printf("\nSelect Test Type : 0:1time change, 1:repeat test : ");
uTestType = GetIntNum();
if(uTestType == 0)
{
// Debug GPIO Setting
GPIO_SetPullUpDownEach(eGPIO_F, eGPIO_15, 0);
GPIO_SetFunctionEach(eGPIO_F,eGPIO_15,1);
GPIO_SetDataEach(eGPIO_F,eGPIO_15,1);
printf("\npress any key \n");
while(!UART_GetKey());
GPIO_SetDataEach(eGPIO_F,eGPIO_15,0);
SYSC_SetDIV0(uARatio, 1, 1, uHx2Ratio, uPRatio, 1, 1,0, 1, 0); // MPLL Ratio : 1 , HRatio : 1 (HCLKx2 /2) )
SYSC_GetClkInform();
UART_InitDebugCh(0, 115200);
printf("Current Clock Information \n");
printf("ARMCLK: %.2fMHz HCLKx2: %.2fMHz HCLK: %.2fMHz PCLK: %.2fMHz\n",(float)g_ARMCLK/1.0e6, (float)g_HCLKx2/1.0e6, (float)g_HCLK/1.0e6, (float)g_PCLK/1.0e6);
printf("============================ \n");
printf("press 'q' key to exit\n");
while(UART_GetKey()!='q')
{
DisplayLED(9);
for(i=0;i<3000000;i++);
DisplayLED(6);
for(i=0;i<3000000;i++);
}
}
else if(uTestType == 1)
{
while(1)
{
if(UART_GetKey()!=0x0)
break;
if(uTestCount>100000)
break;
if ((uTestCount%1000)==0)
{
SYSC_GetClkInform();
UART_InitDebugCh(0, 115200);
Delay(100);
printf("\n%d \n", uTestCount);
}
if(uTestCount%2)
{
DisplayLED(0x8);
SYSC_SetDIV0(uARatio, 1, 1, uHx2Ratio, uPRatio, 1, 1,0, 1, 0);
Delay(100);
}
else
{
DisplayLED(0x3);
Outp32SYSC(0x20, uRegValue0_bk);
Delay(100);
}
uTestCount++;
}
}
// Return the pre test value
Outp32SYSC(0x20, uRegValue0_bk);
Delay(100);
SYSC_GetClkInform();
UART_InitDebugCh(0, 115200);
}
//////////
// File Name : Test_CLKOUT
// File Description : This function is for the Clock output
//
// Input :
//
//
// Output : NONE
// Version :
void Test_CLKOUT(void)
{
u32 uRegValue0_bk;
u32 uDiv, uSEL, uDDiv, uDCMP, uDSEL;
u32 i, uDclk;
printf("[Clock Output Test - rCLK_OUT & DCLK ]\n");
// Current Clock Information
SYSC_GetClkInform();
// Save CLK_OUT Register
uRegValue0_bk = Inp32SYSC(0x2C); // Back-up CLK_OUT Register Value
// CLK Output PAD Enable
GPIO_SetFunctionEach(eGPIO_F, eGPIO_14, 3);
printf("\n CLK Out Select : 0:APLL Out/2, 1:EPLL Out, 2:HCLK, 3:CLK48M, 4:CLK27M, 5:RTC, 6: Tick, 7: DOUT : ");
uSEL = GetIntNum();
printf("\nEnter the CLK_Out Dividing Value(0~15) : ");
uDiv = GetIntNum();
SYSC_CtrlCLKOUT((CLKOUT_eTYPE)uSEL, uDiv);
if(uSEL == 7 )
{
printf("\n Choose DCLK Source Clock : 0:PCLK, 1:48MHz : ");
uDSEL = GetIntNum();
printf("\n Enter the DCLKDIV (0~15) \n");
uDDiv = GetIntNum();
printf("\n Enter the DCLKCMP (0~15, <DCLKDIV) \n");
uDCMP = GetIntNum();
SYSC_CtrlDCLK(uDCMP, uDDiv, uDSEL, 1);
if(uDSEL==0)
{
uDclk = (unsigned int) ((float)g_PCLK/(float)(uDDiv+1));
}
else if(uDSEL==1)
{
uDclk = (unsigned int) ((float)(48000000)/(float)(uDDiv+1));
}
printf("\n [DCLK: % 4.1f MHz]\n", (float) uDclk/1.0e6);
printf("High level duration : %d \n", uDDiv-uDCMP);
printf("Low level duration : %d \n", uDCMP + 1);
}
printf("press 'q' key to exit\n");
while(UART_GetKey()!='q')
{
DisplayLED(9);
for(i=0;i<100000;i++);
DisplayLED(6);
for(i=0;i<100000;i++);
}
// Return the pre test value
Outp32SYSC(0x2C, uRegValue0_bk);
}
//////////
// File Name : Test_ChangeOPMode
// File Description : This function is for the changing operating mode.
//
// Input :
//
//
// Output : NONE
// Version :
// Only Test Mode.....
void Test_ChangeOPMode(void)
{
u32 i, uTestCount;
printf("Operating mode Change Test\n");
SYSC_CtrlCLKOUT( eCLKOUT_APLLOUT, 9); // for clock test, jangwj
//SYSC_ChangeSYSCLK_1(eAPLL480M, eAPLL266M , 0, 1,3);
SYSC_ChangeMode(eASYNC_MODE);
SYSC_GetClkInform();
UART_InitDebugCh(0, 115200);
printf("\n\n");
printf("ARMCLK: %.2fMHz HCLKx2: %.2fMHz HCLK: %.2fMHz PCLK: %.2fMHz\n",(float)g_ARMCLK/1.0e6, (float)g_HCLKx2/1.0e6, (float)g_HCLK/1.0e6, (float)g_PCLK/1.0e6);
printf("SYNC Mode : %d\n", g_SYNCACK);
printf("\n");
SYSC_ChangeMode(eSYNC_MODE);
SYSC_GetClkInform();
UART_InitDebugCh(0, 115200);
printf("\n\n");
printf("ARMCLK: %.2fMHz HCLKx2: %.2fMHz HCLK: %.2fMHz PCLK: %.2fMHz\n",(float)g_ARMCLK/1.0e6, (float)g_HCLKx2/1.0e6, (float)g_HCLK/1.0e6, (float)g_PCLK/1.0e6);
printf("SYNC Mode : %d\n", g_SYNCACK);
printf("\n");
uTestCount=0;
printf("press 'q' key to exit\n");
while(UART_GetKey()!='q')
{
if(UART_GetKey()!=0x0)
break;
if(uTestCount>100000)
break;
if ((uTestCount%1000)==0)
{
DisplayLED(uTestCount>>10);
SYSC_GetClkInform();
UART_InitDebugCh(0, 115200);
Delay(100);
printf("\n%d \n", uTestCount);
}
//DisplayLED(i%15);
SYSC_ChangeMode(eASYNC_MODE);
SYSC_GetClkInform();
UART_InitDebugCh(0, 115200);
Delay(10);
SYSC_ChangeMode(eSYNC_MODE);
SYSC_GetClkInform();
UART_InitDebugCh(0, 115200);
uTestCount++;
if ((uTestCount%1000)==0)
{
DisplayLED(i>>10);
}
/*
DisplayLED(9);
for(i=0;i<30000000;i++);
DisplayLED(6);
for(i=0;i<30000000;i++);
*/
}
}
//////////
// Function Name : Insert_Seed
// Function Description : This function generate random number using information of the RTC
//
// Input :
// Output :
//
// Version : v0.1
void Insert_Seed(void)
{
u32 uBCDDAY, uBCDHOUR, uBCDMIN, uBCDSEC;
uBCDDAY = Inp32(0x7E005080);
uBCDHOUR = Inp32(0x7E005078);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -