00001
00002
00003
00004
00005
00006
00007
00016
00017
00018 #include "sys_clock.h"
00019
00020
00021
00022 #define BASE_TIMER_RATE (200)
00023 #define BASE_TIMER_RATE_INV (0x4c4b4000L)
00024
00025
00026
00027
00028
00029 UINT16 TIM_resolution;
00030
00031
00032 #pragma CODE_SECTION(SYS_clockSetup, ".sram0_resident")
00039 void SYS_clockSetup(CLOCK_MODE eMode)
00040 {
00041 UINT32 CPU_clock;
00042
00043
00044 static CLOCK_MODE actvClockMode = Invalid_ClockMode;
00045
00046 if(actvClockMode == eMode)
00047 {
00048 return;
00049 }
00050
00051 CLKMD = 0xF000;
00052
00053 while(CLKMD&0x0001);
00054
00055 CLKMD = eMode;
00056
00057
00058
00059 CPU_clock = (UINT32)SYS_getCPUClock();
00060
00061
00062
00063 #if 1
00064 PRD = (CPU_clock / ( (UINT32)(BASE_TIMER_RATE * 16) ) ) - 1;
00065 #else
00066 PRD = (CPU_clock / ( (UINT32)(BASE_TIMER_RATE * 10) ) ) - 1;
00067 #endif
00068
00069
00070 TCR |= 0x2F;
00071
00072
00073 TIM_resolution = ((UINT32)(BASE_TIMER_RATE_INV/(PRD+1))+ 0x8)>>4;
00074
00075 actvClockMode = eMode;
00076 }
00077
00078 #pragma CODE_SECTION(SYS_getCPUClock, ".sram0_resident")
00085 UINT32 SYS_getCPUClock( void )
00086 {
00087 UINT16 Multiplier, PLLMUL, Divider;
00088 UINT16 PLLNDIV, PLLDIV;
00089
00090
00091
00092 PLLMUL = CLKMD >> 12;
00093
00094 PLLDIV = (CLKMD >> 11) & 0x1;
00095
00096 PLLNDIV = (CLKMD >> 1) & 0x1;
00097
00098 Divider = 1;
00099
00100 Multiplier = 1;
00101
00102 if (PLLDIV && PLLNDIV)
00103 {
00104 Multiplier = (PLLMUL & 0x01)? PLLMUL / 4 : (PLLMUL + 1) / 2;
00105 }
00106
00107 else if (!PLLNDIV)
00108 {
00109
00110 Divider = (PLLMUL == 15)? 4 : 2;
00111 }
00112
00113 else
00114 {
00115
00116 if (PLLMUL != 15) Multiplier = PLLMUL + 1;
00117 }
00118
00119 return((UINT32)((UINT32)(SYSTEM_CLOCK * Multiplier)) / Divider);
00120 }
00121
00122
00123
00124
00125