📄 tm_clk.c
字号:
#include "../inc/def.h"
#include "../inc/config.h"
#include "../inc/board.h"
#include "../inc/utils.h"
#include "44b.h"
#include "option.h"
static struct{
U32 mclk;
U32 pclk;
U32 sclk;
U32 freq;
} ClkPara;
static void set_pll(void)
{
U32 i, j;
if(ClkPara.mclk>255)
ClkPara.mclk = 255;
if(ClkPara.pclk>63)
ClkPara.pclk = 63;
if(ClkPara.sclk>3)
ClkPara.sclk = 3;
j = ClkPara.sclk;
i = 1;
while(j--)
i *= 2;
ClkPara.freq = (EXT_OSC_CLK*(ClkPara.mclk+8))/((ClkPara.pclk+2)*i);
if((ClkPara.freq>=90000000)||(ClkPara.freq<EXT_OSC_CLK)) {
ClkPara.mclk = 53;
ClkPara.pclk = 3;
ClkPara.pclk = 1;
ClkPara.freq = EXT_OSC_CLK*61/10;
}
rPLLCON = (ClkPara.mclk << 12) | (ClkPara.pclk << 4) | ClkPara.sclk;
}
void SystemClockInit(void)
{
set_pll();
}
U32 GetCpuClock(void)
{
return ClkPara.freq;
}
U32 GetMasterClock(void)
{
return GetCpuClock();
}
int SetSysClock(void)
{
int mdiv, pdiv, sdiv;
char tmp[4];
printf("Please enter the PLL parameter to use, mdiv[0-255], pdiv[0-63], sdiv[0-3]\n");
printf("mdiv: ");
if((mdiv=strtodec(tmp, GetParameter(tmp, 3)))<0) {
printf("\nget mdiv Error!\n");
return -1;
}
printf("\npdiv: ");
if((pdiv=strtodec(tmp, GetParameter(tmp, 2)))<0) {
printf("\nget pdiv Error!\n");
return -1;
}
printf("\nsdiv: ");
if((sdiv=strtodec(tmp, GetParameter(tmp, 1)))<0) {
printf("\nget sdiv Error!\n");
return -1;
}
printf("\nYou set System clock mdiv = %d, pdiv = %d, sdiv = %d\n", mdiv, pdiv, sdiv);
Delay(10);
ClkPara.mclk = mdiv;
ClkPara.pclk = pdiv;
ClkPara.sclk = sdiv;
set_pll();
// Delay(0);
return 0;
}
U32 GetSysClock(SysClock pSysClock[])
{
pSysClock[0].name = "CPU";
pSysClock[0].freq = GetCpuClock();
return 1;
}
void SetSysClockPara(void *addr)
{
U32 *pData = addr;
ClkPara.mclk = pData[0];
ClkPara.pclk = pData[1];
ClkPara.sclk = pData[2];
set_pll();
}
void GetSysClockPara(void *addr)
{
U32 *pData = addr;
pData[0] = ClkPara.mclk;
pData[1] = ClkPara.pclk;
pData[2] = ClkPara.sclk;
pData[3] = ClkPara.freq;
}
void TimerInit(U32 HZ)
{
rTCON &= ~(0xf<<24); //clear manual update bit, stop Timer5
rTCFG0 &= ~(0xff<<16); //set Timer 4&5 prescaler 1/2
rTCFG0 |= 1<<16;
rTCFG1 &= ~(0xf<<20); //set Timer 5 MUX 1/16
rTCFG1 |= 3<<20;
rTCNTB5 = GetCpuClock()/(HZ*2*16)-1;
rTCON |= 2<<24; //manual update
rTCON &= ~(2<<24); //clear manal update bit
rTCON |= (5<<24); //auto reload, inverter on, start Timer 5
}
/*void ResetTimer(void)
{
rTCON &= ~(1<<24);
rTCON |= (1<<24);
}*/
void Delay(U32 ms)
{
U16 i;
i = rTCNTB5>>1; //1000us/2
rTCON &= ~(1<<24);
rTCON |= (1<<24); //氨ゎ
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -