📄 tm_clk.c
字号:
#include "def.h"
#include "config.h"
#include "board.h"
#include "utils.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.sclk = 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 RTC_Def_Time_Set( void )
{
PREINT = Fpclk / 32768 - 1; // 设置基准时钟分频器
PREFRAC = Fpclk - ( Fpclk / 32768 ) * 32768;
YEAR = 2005; // 初始化年
MONTH = 3; // 初始化月
DOM = 8; // 初始化日
DOW = 4;
HOUR = 9;
MIN = 30;
SEC = 0;
CIIR = 0x00; // 不产生中断
CCR = 0x01; // 启动RTC
}
void Delay( U32 ms )
{
U32 CLK ;
U32 DIV = 1000 * 100 ;
#ifdef __IN_CHIP
DIV = 1000 * 2 ;
#endif
#ifdef __OUT_CHIP
DIV = 1000 * 30 ;
#endif
CLK = ( Fcclk / DIV ) * ms ;
while ( CLK-- ) ; //这个语句需要两条汇编指令
}
void Delay_uS( U32 us ) //以uS为延时单位
{
U32 CLK = ( Fcclk / 1000000 ) * us / 2 ;
while ( CLK-- ) ; //这个语句需要两条汇编指令
}
int WaitEventWithTimeout( int ( *event ) ( void ) , int cond , U32 ms )
{
U32 i ;
int result;
while ( ms-- )
{
result = ( *event ) ();
if ( cond )
{
if ( result )
return 0;
}
else
{
if ( !result )
return 0;
}
for ( i = 0; i < 5000; )
i++ ;
}
return -1;
}
/*************************************************************/
void RtcSetDay( TIME_STRUC* time )
{
YEAR = time->year ; //年
MONTH = time->month; //月
DOM = time->day; //日
}
void RtcSetWeek( TIME_STRUC* time )
{
DOW = time->weekday;
}
void RtcSetTime( TIME_STRUC* time )
{
HOUR = time->hour; //小时
MIN = time->min; //分
SEC = time->sec; //秒
}
/****************************************************************************
函数名称:RTC_Initial()
功能说明:初始化实时时钟。
****************************************************************************/
void RTC_Initial( void )
{
PREINT = Fpclk / 32768 - 1; // 设置基准时钟分频器
PREFRAC = Fpclk - ( Fpclk / 32768 ) * 32768;
CCR = 0x01; // 启动RTC
}
void RtcGetTime( TIME_STRUC* time )
{
time->year = YEAR ;
time->weekday = DOW ;
time->month = MONTH ;
time->day = DOM ;
time->hour = HOUR ;
time->min = MIN ;
time->sec = SEC ;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -