www.pudn.com > USBdiskRW.rar > tm_clk.c


#include "def.h" 
#include "utils.h" 
#include "44b.h" 
#include "option.h" 
 
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>1;	//1000us/2 
	 
	rTCON &= ~(1<<24); 
	rTCON |= (1<<24);	//停止再启动,重装初值,减计数 
	 
	while(ms--) { 
		while(rTCNTO5>=i); 
		while(rTCNTO5year&0xff;	//年 
    rBCDMON  = time->month;		//月 
    rBCDDAY  = time->day;		//日	 
	RTC_RW_DS(); 
} 
 
void RtcSetWeek(TIME_STRUC *time) 
{ 
	RTC_RW_EN(); 
	rBCDDATE = time->weekday; 
	RTC_RW_DS(); 
} 
 
void RtcSetTime(TIME_STRUC *time) 
{ 
	RTC_RW_EN();				//RTC读写使能,选择BCD时钟、计数器,无复位,1/32768		 
	rBCDHOUR = time->hour;		//小时 
    rBCDMIN  = time->min;		//分 
    rBCDSEC  = time->sec;		//秒 
	RTC_RW_DS(); 
} 
 
void RtcGetTime(TIME_STRUC *time) 
{ 
	unsigned char m; 
 
	RTC_RW_EN();		//RTC读写使能 
	time->year = 0x2000 + rBCDYEAR; 
	time->weekday = rBCDDATE; 
 
	m = rBCDMON;	 
	time->month = m;//(m>>4)*10 + (m&0xf);	//BCD码转十进制 
 
	m = rBCDDAY;	 
	time->day = m;//(m>>4)*10 + (m&0xf);	//BCD码转十进制	 
 
	m = rBCDHOUR;	 
	time->hour = m;//(m>>4)*10 + (m&0xf);	//BCD码转十进制 
	 
	m = rBCDMIN;	 
	time->min = m;//(m>>4)*10 + (m&0xf);	//BCD码转十进制 
 
	m = rBCDSEC;			 
	time->sec = m;//(m>>4)*10 + (m&0xf);	//BCD码转十进制 
	 
    RTC_RW_DS();		//RTC读写禁止(降低功率消耗),选择BCD时钟、计数器,无复位,1/32768     
 
}