📄 rtc.c
字号:
/*************************************************************************
* Copyright (C) Asic Center. 2002
* All Rights Reserved
*
* Filename : rtc.c
* Function : realtime clock
* Revision :
* 2002/06/18 Pessia Create this file, and add Power-Saving code;
************************************************************************/
#include "M68328.h"
#include "ros33.h"
#include "pwrctrl.h"
#include "systmr.h"
#include "hardware.h"
#include "hardware_reg.h"
extern void ret_int( void );
extern void sys_clk( void );
void run_rtc( void );
void stop_rtc( void );
/* Used to record how many ticks have passed,
* it should be clear when system init */
unsigned long passedticks=0;
/* Record current clock */
unsigned long currentclock=0;
unsigned short cur_rtc_freq=0;
void init_rtc( void )
{
/* RTC is enabled at reset by default,
* We choose SAM3(32Hz) to be used.
*/
//// RTCCTL |= RTCCTL_ENABLE;
//// RTCISR = 0x0000;
//// RTCIENR &= 0x00C0;/* clear all bits except bit 6&7 */
read_reg(RTC_CTRL) &= RTC_CTRL_RTCEN; /*rtc enable*/
// *(RP)RTC_IEN=(RTC_IEN_SECON);
*(RP)RTC_IEN=(RTC_IEN_SAMON);
cur_rtc_freq = 0;
}
void set_rtc( unsigned short freq )
{
extern UINT MSPTICK;
unsigned int freqvalue;
/* close old interrupt */
stop_rtc();
cur_rtc_freq = freq;
/* make sure to change timertask 's tick at the same time*/
switch(freq)
{
case RTCIENR_256HZ:
freqvalue = 0x80;break;
case RTCISR_SAM3:
freqvalue = 0x400;break;
case RTCISR_1HZ:
default:
freqvalue = 0x8000;break;
}
//// MSPTICK = 1000/freqvalue;
write_reg(RTC_SAMP, freqvalue<<16);
/* enable new interrupt */
//// RTCIENR |= freq;
//// run_rtc();
}
void run_rtc( void )
{
unmask_irq(INT_RTC);
read_reg(RTC_CTRL) &= RTC_CTRL_RTCEN; /*rtc enable*/
}
void stop_rtc( void )
{
/* disable interrupt */
//// IMR |= (IMR_MRTC|IMR_MTMR1);
//// RTCIENR &= ~cur_rtc_freq;
mask_irq(INT_RTC);
read_reg(RTC_CTRL) = 0; /*rtc disable*/
}
void rtc_isr( void )
{
/* clear rtc interrupts */
//// RTCISR |= cur_rtc_freq;
read_reg(RTC_ISTAT) |= 0X01;
#if 0
/* power saving code */
if( power_saving_flag )
{
switch( cur_pcs )
{
case PCS_IDLE:
case PCS_DOZE:
power_saving_counter++;
break;
case PCS_SLEEP:
/******************************/
/* here, we can add some special code to
* check whether time-out timer exist or not.
* such operation can greatly reduce power-wasting. */
/******************************/
/* take places of GPT */
sys_clk();
break;
}
}
#endif
//02-6-19 15:39 Pessia:
//for debug, do not change timer_task at first!!!
passedticks++;
currentclock++;
set_flg(TIMER_EVENT, TIMER_FLG);
}
void ENT_INT_RTC( void )
{
ent_int();
mask_irq(INT_GPT);
//ENABLE_INT;
rtc_isr();
//DISABLE_INT;
unmask_irq(INT_GPT);
ret_int();
}
/*******************************************************************************
* read_rtc
* Type : unsigned char
* Ret val : rtc value
* Argument : unsigned long reg register address want to read
* Function : Read rtc value of minute, hour ,or day.
*******************************************************************************/
unsigned char read_rtc(unsigned long reg)
{
unsigned char chrData = 0;
// chrData = *(volatile unsigned char *)reg;
return(chrData);
}
/*******************************************************************************
* Read_Second
* Type : unsigned char
* Ret val : none
* Argument : time structure reference
* Function : Read system time.
*******************************************************************************/
void ReadGlobalTime( ASIX_TIME *time )
{
time->hour = *(RP)RTC_HMS >> 24;
time->minute = (*(RP)RTC_HMS >> 16) & 0x3F;
time->second = *(RP)RTC_HMS & 0x3F;
return;
}
void ReadGlobalDate( ASIX_DATE *date )
{
DWORD days;
ASIX_DATE std_date;
days = (*(RP)RTC_YMD & 0x3F);
std_date.year = StdYear;
std_date.month = 1;
std_date.day = 1;
SysDateElapse( date, &std_date, days );
if( date->year > StdYear )
{
// 更新年份
std_date.year = date->year;
StdYear = date->year;
days = SysGetElapsedDays( &days, &std_date, date );
*(WORD *)M328_RTCDAY = (WORD)days;
}
return;
}
void SetGlobalTime( ASIX_TIME *time )
{
if((time->hour>23)||(time->hour<0))
return;
*(RP)RTC_HMS = ((unsigned int)time->hour)<<23;
if((time->minute>59)||(time->minute<0))
return;
*(RP)RTC_HMS |= ((unsigned int)time->minute)<<16;
if((time->second>59)||(time->second<0))
return;
*(RP)RTC_HMS |= (unsigned short)time->second;
return;
}
void SetGlobalDate( ASIX_DATE *date )
{
DWORD days = 0;
ASIX_DATE std_date;
std_date.year = date->year;
std_date.month = 1;
std_date.day = 1;
SysGetElapsedDays( &days, &std_date, date );
// 更新年份
StdYear = date->year;
*(RP)RTC_YMD &= ~0X3F;
*(RP)RTC_YMD |= (WORD)days;
return;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -