?? tm_clk.c
字號:
#include "def.h"
#include "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 = 114;
ClkPara.pclk = 8;
ClkPara.pclk = 1;
ClkPara.freq = EXT_OSC_CLK*122/20;
}
rPLLCON = (ClkPara.mclk << 12) | (ClkPara.pclk << 4) | ClkPara.sclk;
}
void SystemClockInit(void)
{
ClkPara.mclk = 88;
ClkPara.pclk = 8;
ClkPara.sclk = 1;
set_pll();
}
U32 GetCpuClock(void)
{
return ClkPara.freq;
}
U32 GetMasterClock(void)
{
return GetCpuClock();
}
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); //停止再啟動,重裝初值,減計數
while(ms--) {
while(rTCNTO5>=i);
while(rTCNTO5<i);
}
}
/*************************************************************/
#define RTC_RW_EN() (rRTCCON = 1) //|= 1
#define RTC_RW_DS() (rRTCCON &= ~1)
void RtcSetDay(TIME_STRUC *time)
{
RTC_RW_EN(); //RTC讀寫使能,選擇BCD時鐘、計數器,無復位,1/32768
rBCDYEAR = time->year&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
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -